Modaler Dialog verhält sich merkwürdig



  • Ich habe folgendes:
    - SDI-Anwendung unter XP
    - über einen Menüpunkt wird Dlg1 aufgerufen
    - unter bestimmten Bedingungen dort Dlg2

    void MeineApp::OnMenuepunkt()
    {
    	Dlg1 dlg;
    	dlg.DoModal();
    }
    

    im OnInit des Dialoges rufe ich einen weiteren Dialog auf

    BOOL Dlg1::OnInitDialog()
    {
    	BasisDlg::OnInitDialog();
    	if(<Bedingung>)
    	{
    		Dlg2 dlg;
    		dlg.DoModal();
    	}
    }
    

    Wenn die Bedingung erfüllt ist und vor der Anzeige von Dlg1 erst Dlg2 erscheint, passiert folgendes:
    Klicke ich auf die Titelzeile der Applikation, bekommt diese den Fokus.
    Ich kann dann über das Menü den Dlg1 x-mal aufgerufen.
    An Dlg2 selbst liegt es nicht. Zieht die Bedingung nicht, oder rufe ich Dlg2 an anderer Stelle auf, ist auch alles OK. Ich habe an beide Dialoge auch schon einen Handle (z.B. der Applikation) übergeben, gebracht hat es nichts.
    Natürlich könnte ich das Ganze jetzt völlig umbauen und Dlg2 völlig separat aufrufen, will ich aber eigentlich nicht.

    Wie kann ich den Effekt verhindern?



  • In dem du Dlg2 nicht in der OnInit von Dlg1 aufrufst, weil der in der Initialisierung von Dlg1 stecken bleibt weil du ja Dlg2 mit DoModal aufrufst.

    Also Wenn beide bedienbar sein sollen dann würde ich Dlg2 mit Create erzeugen, an sonsten würde ich eine Usermessage(PostMessage) ans ende deiner InitDlg packen und im Handler der Message den Dlg2 aufrufen. Aber das is nur eine Idee ob das dann so passt wie du das willst weis ich nicht.



  • In dem du Dlg2 nicht in der OnInit von Dlg1 aufrufst

    Leider ist das genau die Stelle, an der ich die Bedingung (Selektsergebnis) bekomme und auch nach Ausführen von Dlg2 mit einer unterschiedlichen Anzeige im Dlg1 reagieren muss.
    Also alles vorher bereitstellen, übergeben, Dlg2 aufrufen, Dlg1.aufrufen. Und das Alles, weil ich von MessageBox auf Dlg2 umgestellt habe 😞

    weil der in der Initialisierung von Dlg1 stecken bleibt

    Wieso eigentlich? Der müsste doch nach dem dlg2.DoModal() ganz normal weiter machen?

    wie du das willst weis ich nicht

    Vom WOLLEN kann gar keine Rede sein.



  • der macht auch weiter, aber der bleibt bei der initialisierung von dialog 1 in der DoModal() von Dialog 2 hängen, was dann dadurch so alles schief geht kann ich jetzt so auch nicht sagen, aber scheinbar genug weil du ja Probleme hast.

    ich bin nir net sicher aber die MessageBox ist doch AppModal was dein Dialog ja nicht ist vielleicht ist das der unterscheid, aber is nur so ein gedanke, ob das alles stimmt was ich da überlegt habe, weiss ich nicht.



  • MessageBox ist doch AppModal was dein Dialog ja nicht ist

    Ich habe auch versucht, dem Dialog

    Dlg dlg(AfxGetMainWnd());
    dlg.DoModal();
    

    zu übergeben, war da wohl total auf dem Holzweg.

    Habe das Teil nun 4 Tage vor Auslieferung völlig umgebaut. Muss eben idiotensicher sein.


  • Mod

    1. Definiere immer die Parentdialog. D.h. dlg1 bekommt das MainFRame dlg2 bekommt als Parent dlg1.
    2. Ursache: dlg1 startet und will Mainframe disablen, bevor er aber auf den Schirm kommt (OnInitDIalog) kommt dlg2 ins Spiel, der auch den MainFrame als Parent ermittelt (Du hast keinen angegeben), nun wird dlg2 beendet und der aktiviert sein Parent (MainFrame)...

    Siehe auch:
    http://www.codeproject.com/KB/dialog/notmodaldialogs.aspx?msg=3289022



  • Danke Martin, dann war mein erster Gedanke gar nicht so verkehrt, nur die Ausführung war schlecht.


Anmelden zum Antworten