Kommunikation zwischen 2 nichmodalen Dialogen

sdi

Grünschnabel
Hallo,
ich habe eine dialog basierte MFC Anwendung geschrieben, in der ein modaler Dialog, zwei weitere nicht modale Dialoge erzeugt.
Diese beiden Dialoge sollen nun Daten untereinander austauschen können.
Wie kann ich aus dem einen nicht modalen Dialog auf Steuerelemente des anderen Dialogs zugreifen? Muss ich mir da irgendwie die Instanzen der Dialoge holen und wenn dann wie?
Aus dem aufrufenden Dialog kann ich natürlich auf alle Elemente der erstellten Dialoge zugreifen, aber das ist ja nicht das Problem.


Ich habe schon einiges versucht, und auch schon viele andere Beiträge hier gelesen, komme aber zu keiner Lösung.

Code aus Dialog 2:
Code:
   #include "dialog1.h"
   
dialog1 test;
   test->irgendeineFunkion;

Ich bekomme dann allerdings imme ein Assertion Fehler.


ich wäre sehr dankbar für eine Idee

Grüße
Sascha
 
Zuletzt bearbeitet:
sdi hat gesagt.:
Code:
   #include "dialog1.h"
   
dialog1 test;
   test->irgendeineFunkion;
Das da funktioniert gar nicht! test ist kein Pointer also kannst Du test auch nicht dereferenzieren und dann eine Funktion aufrufen. (Also . benutzen statt ->)

Mit der MFC bin ich wegen dem ganzen Verschleiere der Dialoginstanzen und dem Ungetüm des Klassenassistenten eigentlich nie ganz grün geworden.
Daher hab ich Dein Problem vielleicht nicht ganz verstanden aber trotzdem mal einen Verfahrensvorschlag für Dich.

Du könntest doch in jeder Deine eigenen Dialoge eine Funktion (z.B.initConnections) einbauen, die alle Zeiger auf benötigte Dialoge bekommt.
Also z.B. so
Code:
initConnections(CDialog* eigenschaften, CDialog* drucken, ...)
So könntest Du dann nach Belieben alle gewünschten Fenster ansteuern zB:
Code:
eigenschaften->hide();
drucken->show();
 
Bei nicht modalen Dialogen musst du einiges beachten.

Du kannst nicht modale Dialoge ja zu einem beliebigen Zeitpunkt schliessen, ohne dass der Erzeuger es mitbekommt. D. h. du musst sicherstellen, dass, wenn ein nicht modaler Dialog geschlossen wird, die Referenz auf diesen Dialog in den anderen Modulen gelöscht wird.

Wenn ein nicht modalre Dialog mit dem anderen Dialogen Daten austauschen will, brauchst du eine Kommunikation zwischen beiden. Über Methoden gelöst, bedeutet dies, dass die beiden sich kennen müssen. Du musst also jeweils im CPP File den Header des jeweils anderen Dialogs einbinden (oder auch gut: über eine Basisklasse, wenn die Methoden gleichbedeutend sind).
Im Header File fügst du über eine Forward Referenz einen Pointer (Membervariabel) auf den jeweils anderen Dialog ein.

Wenn einer dieser nicht modalen Dialog erzeugt wird, muss er sich im jeweils anderen Dialog als geöffnet eintragen, oder über den modalen Dialog, da dieser ja auch wissen sollte, ob ein Dialog geöffnet ist.
Beim Schliessen muss er sich wieder austragen. Am besten machst du das über Pointer die auf NULL gesetzt werden, wenn der jeweils andere nicht modale Dialog geschlossen bzw. ungültig wird.

Ich hoffe das waren nicht zu viele "jeweils" und "modal" usw. :)
 
Hallo,
ich habs nochmal neu formuliert, natürlich werde ich den oben genannten Gedankengang nachvervolgen.
Folgende Struktur:
In einer MFC dialog basierten Anwendung erstellt ein modaler Dialog zwei nicht modale Dialoge.
Die beiden nicht modalen Dialoge sollen untereinander kommunizieren.
Der Dialog autotest soll Funktionen im service_dialog aufrufen, wie z.B. Checkboxen aktivieren und Buttons klicken .
Desweiteren soll der autotest sich die Daten, welche im service_dialog entstehen holen.
Schlimmstenfalls soll noch der autotest Daten
wieder in dem modalen Dialog (z.B. in einem Edit Feld) anzeigen.
Wichtig ist, das die Anzeige und das "unsichtbar" machen beider Dialoge, durch den modalen Dialog geschieht,
weil dort die Menüführung ist.


modaler Dialog


service_dialog<---------->autotest


Code:
  //Datei des modalen Dialogs,
  //indem ein Menü vorhanden ist
  #include "service_dialog.h"
  #include "autotest.h"
  .
  .
  //Instanz der Dialogklassen erstellen
  service_dialog *service_dlg = new service_dialog();
  Cautotest *autotest_instanz = new Cautotest();
  .
  .
  service_dlg->Create(IDD_service_dialog);//_dlg
  autotest_instanz->Create(autotest);
  .
  .
   //aus einem Menüpunkt heraus
  service_dlg->ShowWindow(SW_SHOW);
  autotest_instanz->ShowWindow(SW_SHOW);
Meine Frage, wie schaffe ich es jetzt, dass sich beide Dialoge kennen und aufeinander zugreifen
können?
Kann ich da einen Pointer,
wie z.B.
Code:
 CDialog* service = service_dlg;
mitgeben?

Grüße
Sascha
 
zu Dorado:
Im Header File fügst du über eine Forward Referenz einen Pointer (Membervariabel) auf den jeweils anderen Dialog ein.
Wie wird sowas in etwa gemacht?
Hört sich schlüssig an, ich wüßte jetzt aber nicht, wie ich das umsetzten soll.

Übrigens, die Fenster werden am Beginn der
Anwenndung erzeugt, und erst am Ende zerstört, dass heisst, das sie auch existieren, wenn sie nicht zu sehen sind. Aus dem aufrufenden Dialog, kann ich ganz normal auf die beiden anderen Dialoge zugreiven.
 
Code:
// header file für Dialog 1
 
class CDialog2; // forward declaration = Existenz der Klasse ohne Kenntnis der Realisierung
 
class CDialog1 : public ...
{
 
CDialog2 *m_pDlg; // Da pointer, muss die Realisierung der Klasse nicht bekannt sein, nur die Existenz
 
public:
void Attach(CDialog2 *pDlg) {m_pDlg = pDlg);
void Detach(void) {m_pDlg = NULL); // bei dir ja nicht notwendig, da du sicherstellst, dass die jeweiligen Objekte angelegt sind, bei Verwendung
};
 
 
 
 
// header file für Dialog 2
class CDialog1; // forward declaration = Existenz der Klasse ohne Kenntnis der Realisierung
 
class CDialog2 : public ...
{
CDialog1 *m_pDlg; // Da pointer, muss die Realisierung der Klasse nicht bekannt sein, nur die Existenz
 
public:
void Attach(CDialog1 *pDlg) {m_pDlg = pDlg);
void Detach(void) {m_pDlg = NULL); // bei dir ja nicht notwendig, da du sicherstellst, dass die jeweiligen Objekte angelegt sind, bei Verwendung};


Im CPP File includierst du dann jeweils den Header, damit die Realisierung der Klasse bekannt ist.
Du kannst dann über m_pDlg->Methode(..) auf die Dialogobjekte zugreifen.


Wenn die Dialogobjekte in deiner Applikation (oder Mainframe) angelegt werden, kannst du auch über Zugriffsmethoden deiner Applikationsklasse (oder auch über die Mainframe Klasse) den Pointer auf den jeweiligen Dialog holen.

Code:
CDialog1::TuWas()
{
	CDialog2 *pDlg = ((CMyApp*) AfxGetApp())->GibMirDenDialog2();
	if(pDlg)
	 pDlg->TuAuchWas();
}
 
Zuletzt bearbeitet:
vielen Dank, das klappt.
Jezt werd ich nochmal versuchen auf den modalen Dialog zurückzugreifen.
Wenn das auch "so einfach" geht

Grüße
Sascha
 
Noch ein Hinweis, ich glaub du hast beim Attach CDialog1 und CDialog2 vertauscht.
Ich habs nämlich ausversehen richtig gemacht und es klappt.
 

Neue Beiträge

Zurück