Funktion aus der Hauptdialogklasse aufrufen



  • Hallo zusammen!

    Ich habe folgendes Problem. Ich habe eine Anwendung mit einer Hauptdialogfeldklasse mit dem Namen GleitlagerDlg und eine weitere Dialogklasse mit Namen DynRadNiemann2_1. Ich möchte nun, klickt der Benutzer im Dialog DynRadNiemann2_1 auf das Feld "Back" eine Methode aus der Hauptdialogfeldklasse aufrufen. Wie komme ich an diese Methode? Ich habe ja keine Ahnung, wie die Instanz des Hauptdialogfeldes heißt.
    Die Funktion für das Drücken der Schaltfläche Back habe ich schon erstellt..

    void CDynRadNiemann2_1::OnBack()
    {
    // Wie komme ich hier an eine Methode aus der Hauptdialogklasse?
    }

    Es wäre nett, wenn mir jemand helfen könnte!



  • AfxGetMainWnd und dann casten.



  • Hallo!

    Danke schonmal, aber irgendwie komme ich immer noch nicht weiter. Ich habe es jetzt gerade so versucht, aber das funktioniert nicht. (Sorry, bin noch nicht so der Programmier-Spezialist 😃 )

    void CDynRadNiemann2_1::OnBack() 
    {
    	(GleitlagerVersion3Dlg)AfxGetMainWnd()->dialogAuswahlNiemann();
    }
    


  • Ich vermute, du hast nur Klammern vergessen:

    ((GleitlagerVersion3Dlg)AfxGetMainWnd())->dialogAuswahlNiemann();
    


  • H, das funktioniert auch nicht. Der Compiler meckert immer:

    error C2065: 'CGleitlagerVersion3Dlg' : nichtdeklarierter Bezeichner

    Außerdem:

    Fehlendes ')' vor Bezeichner 'AfxGetMainWnd'

    Fügt man noch ein * hinter Version3Dlg ein, erscheint diese Fehlermeldung nicht mehr.
    Und es kommt noch: Syntaxfehler: ')' 😞



  • Lexaja schrieb:

    H, das funktioniert auch nicht. Der Compiler meckert immer:

    error C2065: 'CGleitlagerVersion3Dlg' : nichtdeklarierter Bezeichner

    Du hast das include vergessen.

    Das * muss da hin, hab ich übersehen. Du kriegst doch nen Zeiger.

    Und es kommt noch: Syntaxfehler: ')'

    In der Zeile?



  • Vielleicht nochmal etwas genauer... Meine Funktion, die ich aufrufen möchte, sieht so aus:

    int CGleitlagerVersion3Dlg::dialogAuswahlNiemann(int index)
    {
    	// Variablen
    	int fehlerkenner = OK;
    
    	// Indextabelle:
    	// 0 - m_DialogDynRadNiemann1
    	// 1 - m_DialogDynRadNiemann2_1
    	// 2 - m_DialogDynRadNiemann2_2
    	// 3 - m_DialogDynRadNiemann3
    	// 4 - m_DialogDynRadNiemann4
    	// 5 - m_DialogDynRadNiemann5
    	// 6 - m_DialogDynRadNiemann5A
    	// 7 - m_DialogDynRadNiemann8
    	// 8 - m_DialogDynRadNiemann10
    
    	switch(index){
    	case 0: 
    		if(m_DialogDynRadNiemann1.DoModal() == IDOK)
    			fehlerkenner = berechnung1();
    		else
    			return ABBRUCH;
    		if(fehlerkenner == OK)
    			dialogAuswahlNiemann(1);
    		break;
    	case 1: 
    		//if(m_DialogDynRadNiemann2_1.DoModal() == IDBACK)
    		//	dialogAuswahlNiemann(0, erg);
    		/*else*/ if(m_DialogDynRadNiemann2_1.DoModal() == IDOK)
    			berechnung2();
    		else
    			return ABBRUCH;
    		break;
    	case 2: break;
    	case 3: break;
    	case 4: break;
    	case 5: break;
    	case 6: break;
    	case 7: break;
    	case 8: break;
    	}
    
    	return fehlerkenner;
    }
    

    und steht in der Datei GleitlagerVersion3Dlg.cpp.

    Die Funktion

    void CDynRadNiemann2_1::OnBack() 
    {
    	((GleitlagerVersion3Dlg*)AfxGetMainWnd())->dialogAuswahlNiemann();
    }
    

    steht in der Implementierungsdatei des entsprechenden Dialogs. Irgendwie bin ich gerade total aufgeschmissen, so schwer kann das doch gar nicht sein, oder?



  • Oh, mein Problem hat sich gerade erledigt. Mit

    void CDynRadNiemann2_1::OnBack() 
    {
    	((CGleitlagerVersion3Dlg*)AfxGetMainWnd())->dialogAuswahlNiemann(0);
    }
    

    funktioniert es! Vielen Dank nochmal für den Tip mit dem AfxGetMainWnd()!!



  • Moooooment mal... 😕

    Willst du den Dialog einfach nur zu machen, damit du eine neue Auswahl treffen kannst?
    Das wäre dann die Zeile

    CDialog::OnCancel();
    


  • Ich möchte aus diesem Dialog rausspringen, ihn also zumachen, und in der Funktion, in die das Programm springt, wird der vorherige Dialog wieder aufgerufen.
    Wenn ich einfach nur OnCancel() mache, springt das Programm dann wieder in den vorherigen Dialog, wenn dieser schon zugemacht wurde? Es geht ja im Endeffekt nicht nur um diese beiden Dialoge, sondern um eine ganze Reihe von Dialogen, die man nacheinander durchschalten kann, um dann aber auch evtl. wieder zurückzuspringen, wenn man die Eingaben für die Berechnung, die das Programm durchführt, ändern möchte.
    Also kurz: jeder Dialog wird aufgerufen, Eingaben gemacht, wieder geschlossen, ein bisschen Berechnung, nächster Dialog geöffnet usw. Und dann halt mit der Möglichkeit, auch wieder einen Dialog zurückzugehen...



  • Jetzt habe ich allerdings eine Fehlermeldung, wenn ich den Dialog öffne, mit Back wieder in den vorherigen Dialog gehen will und den zweiten Dialog danach erneut öffnen möchte. Dann bekomme ich einen Debug-Assertion-Irgendwas-Fehler. Muss ich den zweiten Dialog erst irgendwie richtig zumachen, zerstören oder irgendwas?



  • Wenn dein Dialog...::DoModal() fertig ist, landest du doch sowieso wieder in der dialogAuswahl()-Methode und kannst den Rückgabewert* dort auswerten - wozu dann nochmal neu starten?
    (btw, von wo aus wird die Methode denn ursprünglich aufgerufen?)

    * Was dort zurückgegeben wird, kannst du in deinem Dialog per EndDialog() festlegen.



  • Ach natürlich, was bin ich blöd. Das ist ja viel einfacher. Jetzt habe ich auch keine Fehlermeldung mehr mit Debug Assertion Failed. Irgendwie habe ich gerade viel zu kompliziert gedacht. Danke 😃


Anmelden zum Antworten