MFC Funktionen und Klassen vom Mutterdialog ins Tochterdialog übernehmen
-
@ AndyDD
Du hast das vollkommen richtig verstanden.
Aber wie leite ich beide von einer eigens geschriebenen Dialogklasse ab.
Daran hab ich auch schon in etwa gedacht. Weis bloß nicht wie ich das realisieren soll.
Thx
Gruß dArIcO
-
dArIcO schrieb:
@ AndyDD
Du hast das vollkommen richtig verstanden.
Aber wie leite ich beide von einer eigens geschriebenen Dialogklasse ab.
Daran hab ich auch schon in etwa gedacht. Weis bloß nicht wie ich das realisieren soll.
Thx
Gruß dArIcOWie jetzt? Du erstellst Dir einfach eine Klasse, die von der Klasse CDialog oder CHTMLDialog abgeleitet ist. Bei Visual C++ 6.0 geht das mit dem Klassenassistenten bei der Version 2003 in der Klassenansicht (Rechtsklick->Hinzufügen->Klasse hinzufügen). Dieser Klasse (z.B. CMeineDialogklasse) gibst Du die Funktionalität in Form von Memberfunktionen und Membervariablen.
Irgendwo in der Anwendung werden dann Mutter- und Tocherdialog gebracht. In der entsprechenden cpp-Datei includierst Du die Header-Datei Deiner selbstgeschriebenen Klasse. Danach müssen nur noch zwei Instanzen erzeugt werden, die dann die gleichen Funktionalitäten haben.#include "MeineDialogklasse.h" .... CMeineDialogklasse Mutterdialog; CMeineDialogklasse Tochterdialog;
-
OK, hab das nun mal probiert, aber wie es aussieht bring ich es nicht auf die Reihe. Gibt es da noch eine andere Methode?

-
nene.
Bei CAsyncSockets wird der Dialog informiert der in der abgeleitete Klasse von CAsyncSocket defniert ist.
Wenn du nun deinen 2ten Dialog DoMOdal aufrufst dann ist dieser eben Modal.
Dh dein Hauptdialog emfängt keine Nachrichten von CAsyncSocket.Wenn du nur auf Funktionen deinen Hauptdialogs zugreife willst dann kannst du diese Funktionen auf in eine eigene Klasse schreiben.
Willst du das nicht dann übergebe deinem 2ten Dialog den this des Hauptdialogs und du kannst auf alle publicfunktionen und Variablen zugreifen.
Sehe aber derzeit keine Sinn darin Socketfunktionen in beiden Dialogen zu haben.
-
Hallo,
ich habs mal so probiert:in der Hauptklasse das Child Dialog aufrufen, z.B. in einer Fuktion der Hauptkl.
so:void CMainDlg::CallChild() { CChildDlg* pDlg = new ChildDlg(); pDlg->DoModal(); // jetzt ist das Kindsdialog angezeigt!? für das aufräumen mußt du auch sorgen } // jetzt in der Childklasse in der header datei: class CChild:public CDialog { public: CMainDlg* pMainDlg; // und weiter eine Funktion die die Funktion des Hauptdialogs aufruft: void CallMainDlgFunctions(); // usw... } // in der ChildDlg.cpp wird dann die Funktion aufgerufen die das Haupt Dialog anspricht: void CChildDlg::CallMainDlgFunctions() { // jetzt kann ich die Fuktionen des Hauptdialogs benutzen pMainDlg->MainDlgFunction(); }das einzige problem das ich gehabt habe ist das ich nicht auf die private und protected methoden
zugreifen konnte!ich denke mal das es das ist was du gemeint hast???

grüsse
pixel
-
P.S. ich weis jetzt nicht ob ein modales Dialog das beste ist da das hauptdialog
sonst im hintergrund ist solange du das kindsdialog geöffnet hast?!
-
Unix-Tom schrieb:
nene.
Bei CAsyncSockets wird der Dialog informiert der in der abgeleitete Klasse von CAsyncSocket defniert ist.
Wenn du nun deinen 2ten Dialog DoMOdal aufrufst dann ist dieser eben Modal.
Dh dein Hauptdialog emfängt keine Nachrichten von CAsyncSocket.Wenn du nur auf Funktionen deinen Hauptdialogs zugreife willst dann kannst du diese Funktionen auf in eine eigene Klasse schreiben.
Willst du das nicht dann übergebe deinem 2ten Dialog den this des Hauptdialogs und du kannst auf alle publicfunktionen und Variablen zugreifen.
Sehe aber derzeit keine Sinn darin Socketfunktionen in beiden Dialogen zu haben.Sorry, das hatte ich ganz vergessen. Kann man das mit den Sockets nicht in das Doc legen, also quasi zentral für beide Dialoge behandeln? Ich hab keine Ahnung davon, damit hab ich mich noch nie beschäftigen dürfen.
@pixel: Ich seh ebenfalls ein Problem mit modalen Dialogen. Spricht was dagegen die nichtmodal (also mittels Create()) zu machen?
-
Hi,
ein nichtmodales ist eigendlich die richtige lösung, wenn du schon ein chat programmierst, sollen user in der lage sein zwischen den fenstern zu wechseln,
denk an andere chat programme, wenn zum beispiel eine private nachricht erhalten wird öffnet sich ein kleines fenster, das hauptfenster dagegen ist noch da und auch verfügbar, ich meine, du kannst switchen zwischen diesen zwei und in beide nachrichten schreiben!?lg
pixel
-
Wenn du eine Dialoganwendung hast dann hast du kein DOC/VIEW.
Ich würde dir aber auch empfehlen dich zuerst mit Klassen u beschäftigen bevor du mit SDI/MDI hantierst.
Das ist dann noch komplexer.Aber klar: Sockets gehören dann nicht in die View bei SDI/MDI.
-
Unix-Tom schrieb:
Wenn du eine Dialoganwendung hast dann hast du kein DOC/VIEW.
Ich würde dir aber auch empfehlen dich zuerst mit Klassen u beschäftigen bevor du mit SDI/MDI hantierst.
Das ist dann noch komplexer.Aber klar: Sockets gehören dann nicht in die View bei SDI/MDI.
Ok, dann lag ich mit meinem Vorschlag nicht unbedingt falsch. Ob er nun eine dialogfeldbasierende Anwendung verwendet hat ist nicht unbedingt ersichtlich. Aber konnte man nicht auch bei irgendeiner Version die Unterstützung Doc/View für Dialoganwendungen aktivieren? Is nur mal so eine Frage...
-
ich hab das ganze jetzt mal Nicht-Modal gemacht:
CDialog* pDlg; pDlg = new CDialog; pDlg->Create(IDD_DATEISENDEN,this); pDlg->ShowWindow(SW_SHOW); delete pDlg;Das ganze funktioniert auch ohne Fehler, jedoch wenn ich auf den Button klicke damit das ChildDlg geöffnet werden soll, dann blinkt [.wie aktualisiert.] das MuDlg auf, und mehr nicht. Woran liegt das?
Erstmal dickes Thx an alle für eure Antworten!
Gruß dArIcO
-
wenn du den dialog sofort wieder löscht ist es kein wunder das er gelöscht (geschlossen) wird.
erstellen die instanz nicht in einer funktion den wenn die funktion verlassen wird dann existiert gem. den c++-regeln auch die dialogklasse nicht bzw. kann es auch zu memleaks kommen wenn du delete nicht aufrufen würdest.
-
ne andersrum: das childdlg wird kurz geöffnet geht aber sofort wieder zu. hab das ganze mal versuct zu unterdrücken, geht auch nicht
-
Ließ mal bitte was ich geschrieben habe:
CDialog* pDlg;pDlg = new CDialog; //Instanz wir erzeugt
pDlg->Create(IDD_DATEISENDEN,this);
pDlg->ShowWindow(SW_SHOW); // Dialog wird angezeigt
delete pDlg; // Dialog wird beendetAlles klar!!
-
Jetzt habe ich es!
Das ChildDlg öffne ich Nicht-Modal. Habe eine eigene Klassen geschrieben, worauf dann alle zugreifen können.
Aber nochmals danke an alle die ihren Beitrag dazu gegeben haben!
Gruß dArIcO