Stack Overflow



  • Hallo,
    ich hab 2 Klassen bzw. 2 Dialoge in meiner Anwendung, sobald ich von dem ersten Dialog in den anderen wechsele, und dann wieder in den ersten vom zweiten springe, möchte ich wieder den zweiten Dialog per Knopfdruck auf meinem Dialog aufmachen, jedoch kriege ich da ein Stack Overflow...
    hab schon versucht mit dem Debugger ein breakpoint zu setzen, da wo der Konstruktor der zweiten Klasse aufgerufen wird, jedoch kommt er nie dahin...wo muss ich den ein Breakpoint setzen, bzw. was geschieht noch vorher oder was könnte das Problem sein, beim ersten Aufruf des zweiten Dialogs wird er ja ganz normal aufgemacht...

    ich tue mal einbisschen Code rein...

    //#include "AppsUser.h"
    
    class CMenue : public CDialog
    {
    // Konstruktion
    public:
    	CMenue(CWnd* pParent = NULL);   // Standardkonstruktor
    	CMenue(CDBAnbindung dBConnection, CAppsUser AppUserObject, ISaGsaRpConnection rPConnection, CWnd* pParent=NULL);   // Konstruktor mit Connect-Objekt
    	CMenue(CDBAnbindung dBConnection, ISaGsaRpConnection rPConnection, CWnd* pParent=NULL);   // Konstruktor mit Connect-Objekt
    
    	ISaGsaRpConnection GetRpConnectionObject();
    	void SetRpConnectionObject(ISaGsaRpConnection rPObject);
    	CDBAnbindung GetDBConnectionObject();
    	void SetDBConnectionObject(CDBAnbindung dBObject);
    	CAppsUser GetAppUserConnectionObject();
    	void SetAppUserConnectionObject(CAppsUser AppUserObject);
    ...
    

    Das ist der erste Dialog...

    Der Aufruf des zweiten Dialog geschieht wie folgt:

    void CMenue::OnApi() 
    {
    	if (rPConnection.IsConnected()){
    		rPConnection.Disconnect();
    		if (rPConnection.GetFailed()) {
    			AfxMessageBox(rPConnection.GetErrorText());
    			rPConnection = ISaGsaRpConnection();
    		}
    	}
    
    	CDialog::OnOK();
    	Anmeldung api(CMenue::GetDBConnectionObject(), CMenue::GetRpConnectionObject(), this);
    	api.DoModal();
    	api.ShowWindow(SW_SHOW);
    	delete rPConnection;
    }
    

    Der zweite Dialog sein Header ist:

    #include "AppsUser.h"
    
    class Anmeldung : public CDialog
    {
    // Konstruktion
    public:
    	Anmeldung(CWnd* pParent = NULL);   // Standardkonstruktor
    	Anmeldung(CDBAnbindung dBAnbindung, CAppsUser AppUserAnbindung, ISaGsaRpConnection rPConnection, CWnd* pParent = NULL); // Standardkonstruktor mit RpConnection-Object
    	Anmeldung(CDBAnbindung dBAnbindung, ISaGsaRpConnection rPConnection, CWnd* pParent = NULL); // Standardkonstruktor mit RpConnection-Object
    
    	ISaGsaRpConnection GetRpConnectionObject();
    	void SetRpConnectionObject(ISaGsaRpConnection rPObject);
    	CDBAnbindung GetDBConnectionObject();
    	void SetDBConnectionObject(CDBAnbindung dBObject);
    	CAppsUser GetAppUserConnectionObject();
    	void SetAppUserConnectionObject(CAppsUser AppUserObject);
    ...
    

    Der erste Dialog wird dann wie folgt wieder aufgerufen:

    void Anmeldung::OnNaechsteSeite() 
    {
    	if (rPConnection.IsConnected()) {
    		CDialog::OnOK();
    
    		CMenue dUI(Anmeldung::GetDBConnectionObject(), Anmeldung::GetRpConnectionObject(), this);
    		dUI.DoModal(); 
    		delete rPConnection;
    
    	}else{
    		CDialog::OnOK();
    		CMenue dUI(this);
    		dUI.DoModal(); 
    	 }
    
    	UpdateData(false);
    }
    

    ...hab keine Ahnung, was da los sein könnte....



  • wäre es nicht besser unmodale Dialoge zu benutzen?



  • jetzt ganz blöd gefragt, warum?ich mein, der Unterschied ist doch nur, dass der modlae Dialog immer im Vordergrund ist, und der andere nicht...



  • Hallo,

    ich bin grad dabei meine Anwendung zu debuggen, um endlich auf die Spuren des Fehlers zu kommen...was mir aufgafallen ist, ist folgendes...

    Nachdem das Pgm aus dem zweiten Dialogfenster wieder zurück in das erste springt...

    CDialog::OnOK();
    CMenue dUI(Anmeldung::GetDBConnectionObject(), Anmeldung::GetRpConnectionObject(), this);
    dUI.DoModal();
    

    und der Konstruktor die Methode GetDBConnectionObjekt() aufruft...

    CDBAnbindung Anmeldung::GetDBConnectionObject()
    {
    	return m_DBAnbindung;
    }
    

    ...wird nochmal der Konstruktor der Klasse CDBAnbindung durchlaufen und alle Werte neu initialisiert, das ist doch nicht normal, oder?

    ...bitte helft mir, ich weiss nicht mehr weiter...

    gruss,

    chullain


Anmelden zum Antworten