ComputNik Geschrieben 7. September 2003 Geschrieben 7. September 2003 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 :-(
Klotzkopp Geschrieben 7. September 2003 Geschrieben 7. September 2003 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 fensterVerstehe 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.
ComputNik Geschrieben 7. September 2003 Autor Geschrieben 7. September 2003 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:
Klotzkopp Geschrieben 7. September 2003 Geschrieben 7. September 2003 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.
ITSE Geschrieben 13. September 2003 Geschrieben 13. September 2003 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...
Klotzkopp Geschrieben 14. September 2003 Geschrieben 14. September 2003 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.
annita Geschrieben 21. Februar 2005 Geschrieben 21. Februar 2005 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`?
annita Geschrieben 21. Februar 2005 Geschrieben 21. Februar 2005 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);
annita Geschrieben 21. Februar 2005 Geschrieben 21. Februar 2005 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
Klotzkopp Geschrieben 22. Februar 2005 Geschrieben 22. Februar 2005 C++ unterscheidet zwischen Groß- und Kleinschreibung. Die Methode heißt DoModal, mit großem D am Anfang.
annita Geschrieben 22. Februar 2005 Geschrieben 22. Februar 2005 0 fehler 0 warnungen aber es wird nicht mal ein fenster angezeigt :confused: :confused: :confused: :confused:
annita Geschrieben 22. Februar 2005 Geschrieben 22. Februar 2005 es tut es tut :marine :marine :marine :marine :marine ein hoch auf das nicht vertrauen in vc++ buch
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden