Problem mit EndDialog();

fish-guts

Erfahrenes Mitglied
Moin

Ich versteh hier nur Bahnhof. Ich möchte aus einer anderen Klasse die Funktion EndDialog wie folgt aufrufen:

Code:
  CLogin Login;
  Login.PasswordOkay();

Code:
void CLogin::PasswordOkay(void)
{
 EndDialog(IDD_LOGIN);
}

IDD_LOGIN ist der Dialog der Klasse "CLogin".

Dann kommt aber ein "Debug Assertion failed". Beim Debuggen verweist er auf folgendendes:

Code:
void CDialog::EndDialog(int nResult)
{
 ASSERT(::IsWindow(m_hWnd));
 if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
  EndModalLoop(nResult);
 ::EndDialog(m_hWnd, nResult);
}

Das Fenster ist schliesslich vorhanden?

Vielen Dank schon im Voraus

Gruss FG
 
EndDialog ist nicht eine Funktion zum Beenden irgendeines Dialogs, sondern die des eigenen Dialoges. Als solches ist sie als Member der CDialog-Klasse nur zum Schliessen des eigenen Dialogs gedacht.

So wie du die Funktion benutzt, gibt es den Dialog gar nicht.

"CLogin Login;" erzeugt nur ein lokales CLogin-Objekt, erzeugt aber kein HWND. Erst CreateDialog oder DoModal machen das. Dieses lokale Objekt hat NICHTS mit einem eventuell woanders erzeugtem CLogin-Dialog zu tun. Du könntest drei davon gleichzeitig haben. Oder vier.

Wenn du einen bestimmten CLogin-Dialog schliessen willst, musst du dir ein Handle oder einen Pointer drauf merken, und darauf PasswordOkay aufrufen.
 
Moin

Wenn ich die Applikation starte wird zuerst folgendes aufgerufen:

Code:
  CLogin Login;
 Login.DoModal();

Damit müsste ich das Handle doch bereits erzeugt haben?

Die Problematik sehe ich vor allem dabei, dass ich die Werte an eine andere Klasse (CLogindata) übergebe, diese verarbeite und dann wieder an CLogin übergebe um den Dialog zu schliessen.

Dann kann ich ja nicht nochmals ein DoModal(); aufrufen um einen Pointer darauf zu liefern, weil der Dialog IDD_LOGIN ja bereits läuft?

Oder muss ich in der Klasse CLogindata erneut ein solches Handle erzeugen? Wenn ja, wie das?

Gruss FG
 
Das Problem mit DoModal() ist, daß es eben einen modalen Dialog erzeugt, d.h. einen Dialog, der den Eingabefokus und alle Verarbeitung an sich reißt. Die aufrufende Anwendung steht, solange der Dialog offen ist. Nachdem DoModal nach Beendigung des Dialogs zurückkehrt, ist zwar das CDialog-Objekt noch da (bis Du es z.B. mit delete zersörst), das Fenster ist allerdings nicht mehr da und das Fensterhandle ungültig, da EndDialog schon implizit aufgerufen wurde. Wenn Dein Programm auf den Dialog zugreifen soll, während er läuft, solltest Du CreateDialog verwenden. Allerdings habe ich nicht verstanden, was Du denn erreichen willst.

Grüße, jokey2
 
Moin

Wenn das Programm startet, wird ein Login Dialog (IDD_LOGIN) über die Klasse CLogin mit DoModal(); aufgerufen.

Klickt einer auf den "Login" Button, werden die eingegeben Daten an die Klasse "CLogindata" zur Weiterverarbeitung übergeben. Die Funktion CheckLogin(CString user, CString pass) überprüft die Eingaben, und wenn alles stimmt, soll das Login Fenster geschlossen werden. thats it! Nur krieg ich das ned gebacken

Gruss FG
 
An der Stelle, wo du die Daten an CLogindata weitergibts, gib auch einen Pointer auf dich (also den CLogin-Dialog) zurück (mit this):

CLogin::Irgendwo()
{

CLogindata MeinLoginData;

MeinLoginData.Pruefmich( user, password, this );
}

In CLogindata merkst du dir den Pointer, und wenn alles passt, rufst du von dort pLoginDialog->PasswortOkay() auf.
 
Moin

Klappt! Danke danke danke danke :) :) :) :) :)

Hab alles mögliche ausprobiert, aber auf "this" wäre ich wohl nie gekommen :)

Gruss FG
 

Neue Beiträge

Zurück