Zum Inhalt springen

Probleme mit MFC Dialog


ComputNik

Empfohlene Beiträge

Hallo,

Ich habe einen Dialog in meinen Resourcen.

Diesen will ich außerhalb des "Erzeuger" Fensters Laden.

Aufgerufen wird es aus einem Menu.

Der Menubefehl funktioniert und ist mit MessageBox erfolgreich getestet.

der aufruf lautet:

CDialog dlg(IDD_WECKER);

dlg.DoModal();

das "Papa" Fenster ist viel kleiner als das Dialog Fenster. Jedenfalls stürzt die anwendung ab und man muss sie richtig abmurxen.

Ich hab jedenfalls keine ahnung wie ich das hinbekommen soll.

das domodal öffnet zwar den dialog aber im Papa fenster, danach stürzt die anwendung ab.

könnt ihr mir sagen wie ich das problem lösen kann?

ich bin total fertig mit den Nerven die ganze Nacht durch bis um 7:00 und nix hinbekommen :-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von ComputNik

CDialog dlg(IDD_WECKER);

dlg.DoModal();

Normalerweise verwendet man nicht CDialog selbst, sondern leitet eine Klasse davon ab. Mit der Basisklasse kann man nicht viel machen, außer statische Texte anzuzeigen und abzufragen, ob der Benutzer OK, Abbrechen oder Schließen betätigt hat.

das "Papa" Fenster ist viel kleiner als das Dialog Fenster.
Das sollte kein Problem sein.

Jedenfalls stürzt die anwendung ab und man muss sie richtig abmurxen.
Meinst du damit, die Anwendung reagiert nicht mehr? Das liegt dann vermutlich daran, dass DoModal nie zurückkommt.

das domodal öffnet zwar den dialog aber im Papa fenster
Verstehe ich nicht. Was soll das heißen?

könnt ihr mir sagen wie ich das problem lösen kann?
Nicht ohne weitere Information darüber, wie der Dialog aussieht, und warum du keine Klasse von CDialog abgeleitet hast.
Link zu diesem Kommentar
Auf anderen Seiten teilen

So:

Ich hab ne Dialoganwendung (eine analoge Uhr).

Die Sache Funkitoniert so das ich ein Ziffernblatt aus einer resource lade dann die Zeit ermittel und die Zeiger male.

anschließend lade ich die resource wieder und male die Zeiger neu .......

so jetzt hab ich zusätzlich ein Menu angezeigt.

Über einen Punkt will ich ein neues Dialogfeld öffnen in dem man dann einen Wecker stellen kann.

Da sind dann Checkboxen die Sagen (Wecker verwenden Ja/Nein) Zeit etc...

Wenn ich dann im Wecker stellen dialog auf OK klicker soll im Hauptfenster entsprechend auf die Werte reagiert werden.

Zur Zeit Klicker ich auf das Menü "Wecker Stellen" das Dialogfeld Wecker öffnet sich im erzeugerfenster. Wird aber da es größer ist als das erzeugerfenster abgeschnitten und nicht vollständig angezeigt.

Nach einer Sekunde (Wenn ich die Uhr neu zeichne) verschwindet das dialogfeld "Wecker Stellen".

Und nun Ich nix Plan davon wie ich was von irgend wo ableiten soll.

im prinzip such ich sowas wie im VB. Wo man sagt Form2.show

:confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von ComputNik

Da sind dann Checkboxen die Sagen (Wecker verwenden Ja/Nein) Zeit etc...

Wenn ich dann im Wecker stellen dialog auf OK klicker soll im Hauptfenster entsprechend auf die Werte reagiert werden.

Dann musst du eine Klasse von CDialog ableiten, weil du sonst keine Möglichkeit hast, auf diese Steuerelemente zuzugreifen.

Das macht aber der Klassenassistent für dich. Starte den Klassenassistent, während die Dialogresource des Wecker-Dialogs angezeigt wird (z.B. über das Kontextmenü), dann sollte er dich fragen, ob er für diese Dialogresource eine Klasse anlegen soll.

Von dieser Klasse legst du dann eine Instanz an (an Stelle von CDialog), ohne Dialog-ID als Parameter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Außerdem solltest du vielleicht darauf achten, dass du deinen CDialog nicht im Stack anlegst mithilfe lokaler Objekte (z.B. CDialog mydialog();) und es danach passiert, dass die Funktion die das Objekt erzeugt hat zu Ende geht. Dann werden nämlich auch alle lokalen Variablen gelöscht, und dein Dialog lebt auch nicht weiter.

Erzeuge den Dialog im Stack z.B.


CDialog * mydialog;

mydialog = new CDialog();

mydialog->doModal();

Nun bleibt dein Dialog auch bestehen wenn die aufrufende Funktion zu Ende geht...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von ITSE


CDialog * mydialog;
mydialog = new CDialog();
mydialog->doModal();
[/code]

Nun bleibt dein Dialog auch bestehen wenn die aufrufende Funktion zu Ende geht... [/b]

Aber dann wird der Zeiger mydialog, der ja jetzt auf dem Stack angelegt wurde, zerstört, und man kann die Dialoginstanz nie wieder freigeben -> Speicherleck.

Normalerweise ist es unproblematisch, Instanzen von Dialogklassen, die man modal verwenden will, auf dem Stack anzulegen, weil man so vorgeht:

- Instanz erzeugen

- Initialisieren

- Anzeigen mit DoModal

- (evtl.) Werte auslesen

Wenn der Dialog nicht gerade Informationen von einem zum nächsten Aufruf behalten soll, ist das Anlegen auf dem Heap nicht sinnvoll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...
hm.. ich hab zu diesem thema auch noch ein problem... hoffentlich kann mir jemand helfen

CNameDlg *mydialog;

mydialog = new CNameDlg();

mydialog->doModal();

error C2039: 'doModal' : Ist kein Element von 'CNameDlg'

WARUM`?

und wenn ich das benutze tut sich gar nix :(

m_dlgNamen.Create(IDD_Name_2, this);

m_dlgNamen.ShowWindow(SW_SHOW);

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ich hab schon ne menge ausprobiert mit zeigern auch schon und mit eigentständigen funktionen...

es tut sich nix...

kann man vllt mir sagen worauf man achten muss, bzw. was ich vergessen konnte?

ach und warum kann man den beitrag nur innerhalb von 15 min ändern... hab ja noch nie gesehn :confused:

jetzt spam ich hier ja total rum :D;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...