Wo ist hier der Unterschied?

Rudi Raser

Grünschnabel
Hallo zusammen,

wo genau ist hier der Unterschied:

1)
CWaitDialog *pDlg;
pDlg = new CWaitDialog;
pDlg->Open("",0,0);

2)
CWaitDialog test;
test.Open(" ",0,0);

Rufe ich eine nicht modale Dialogbox mit 1) auf geht alles. Rufe ich sie mit 2) auf erscheint kurz die Box und wird sofort wieder mittels destroy aufgelöst. Ich würde Sie aber gerne mit 2) aufrufen, was mache ich da falsch?

Source sieht so aus

CWaitDialog::Open(CString message, short nLower, short nUpper)
{
Create(IDD_MELDUNG);
CenterWindow();
SetDlgItemText(IDC_MELDUNG,message);
ShowWindow (SW_SHOW);
m_progress.SetRange(nLower,nUpper);
UpdateWindow();
}

Was mache ich falsch?

Gruß
Rudi
 
1)
CWaitDialog *pDlg;
pDlg = new CWaitDialog;
pDlg->Open("",0,0);
Hier wird ein CWaitDialog-Objekt auf dem Heap mit new alloziert. Es existiert so lange, bis es deleted wird. Wenn das nicht passiert, entsteht ein Memory-Leck, das sogar nach Beendigung deines Progamms bestehen bleibt.

2)
CWaitDialog test;
test.Open(" ",0,0);
Dieses CWaitDialog-Objekt wird auf dem Stack erzeugt. Es ist lokal und damit temporär und wird zerstört, sobald die Verarbeitung den Gültigkeitsbereich des Objektes (den {}-Block) verlässt, in dem es deklariert wurde. Wahrscheinlich sorgt der bei der Zerstörung aufgerufene Destruktor dafür, dass das Fenster entsprechend geschlossen wird.
Lokale, temporäre Dialogobjekte solltest du nur erzeugen, um sie modal mit DoModal() zu öffnen. Die Verarbeitung wird erst nach dem DoModal() fortgesetzt, wenn der Dialog wieder geschlossen wird und deshalb wird auch der Gültigkeitsbereich nicht zuvor verlassen.
 
Zuletzt bearbeitet:
JA! Das ist die Erklärung :) Danke!

Jetzt habe ich aber ein neues Problem. Erzeuge ich per 2) meinen nicht modalen Dialog wird er so lange offen gehalten bis der Gültigkeitsbereich zu Ende ist, dann wird der Destructor aufgerufen welcher das Fenter schließt. So weit alles ok. Allerdings kann ich das geöffnete Fenster weder verschieben noch regiert ein Button darin. Wo kamm das jetzt wieder dran liegen?

Erzeuge ich das Objekt mit 1) geht natürlich alles.
 
Die zweite Möglichkeit ist eigentlich die richtige für modale Dialoge, also welche, die das restlcihe Programm stoppen, bis die von ihnen geforderten Eingaben gemacht ('Okay' gedrückt oder so) worden sind und sie geschlossen werden. Für deinen nicht modalen (modeless) Dialog solltest du tatsächlich die new-Methode benutzen und den verwendeten Pointer eventuell zum Member des Hauptfensters machen.

Was das von dir genannte Verhalten verursacht, kann ich auch nicht genau sagen.
 

Neue Beiträge

Zurück