Dialog aufruf



  • Ich habe hier ein kniffliges Problem, bei dem ich nicht weiterkomme: Mein Programm besteht aus einer exe und einer dll. Ich möchte nun bei einem Ablauf in der dll einen eigenen Dialog aufrufen, die zwingend zu bestätigen ist. Das klappt mit MeinDialog->DoModal() auch, es erscheint aber in der Taskleiste ein eigenes Symbol, und ausserdem fällt es in den Hintergrund, wenn ich das Programm anklicke. Umgekehrt, rufe ich dieselbe Funktion aus der exe heraus auf, dann klappt es genau so, wie ich es will. Der Dialog bleibt lästig im Vordergrund "kleben", bis er bestätigt wird. Und in der Taskleiste entsteht kein zweites Symbol.
    Ich finde leider keinen Unterschied zwischen den beiden Aufrufen. Hat jemand eine Ahnung, wie es zu so etwas kommen kann?

    Vielen Dank für eure Hilfe.



  • Beim erzeugen des Dialogs musst Du das Hauptfenster als Parent angeben.



  • Danke für den Tip. Wird denn der Parent im Aufruf aus der exe implizit mitgegeben?



  • Ich kann deine Beobachtungen leider nicht nachvollziehen.

    Ich habe auch eine Exe und eine MFC-Erweiterungsdll - und das klappt so:

    void CMainFrame::OnLagerArtikelarten() 
    {
    	CArtikelartenDlg dlg;
    	dlg.DoModal();
    }
    

    😕

    Der Dialog verhält sich so, wie man es von einem modalen Dialog erwartet.



  • Der Aufruf

    CArtikelartenDlg dlg;
    dlg.DoModal();
    

    kommt bei mir in der dll vor, und im einen Fall ruft die dll selbst diesen Dialog auf (wie es dann sein soll), und von der exe aus rufe ich eine Funktion in der dll auf, die mir den Dialog dann entsprechend erstellt. Es wird der gleiche Code abgearbeitet! Vielleicht liegt es daran, dass der dll-Code ziemlich alt ist, und mit MFC nicht viel am Hut hat. Ist auch keine Objektorientierung, sondern prozedural.
    Überigens, der Zeiger pParent ist in beiden Fällen NULL.



  • Auch bei der Version (Exe ruft Dll auf, die Dialog aufmacht) ist bei mir alles normal. 😕

    Bist du sicher, dass da nicht ein "Vorbearbeiter" mal das DoModal überschrieben hat zu einem nichtmodalen Verhalten?
    Passiert das nur mit einem Dialog oder auch mit welchen, die z.B. in der Exe funktionieren?



  • Mit Dialogen, die nach demselben Muster gestrickt sind, funktioniert es in der exe tadellos. DoModal ist auch nicht überschrieben. Das Verhalten des Dialogs ist auch modal, es geht erst weiter, wenn ich im Dialog den Button entsprechend bestätigt habe.



  • Hmm, komisch.

    Dann versuch doch mal, die Resource zu kopieren und eine neue Klasse dazu zu erstellen und dann kopierst du den Quellcode nach und nach rüber und testest.

    Vielleicht findest du es ja oder es geht einfach so. 🙂

    (Komplett neu erstellt hast du schon??)



  • Da magst du recht haben, dass ich dem mal richtig auf den Grund gehen sollte. Ich habe inzwischen beim Dialog den Parameter 'Modales System' auf true gesetzt. Damit bleibt zwar das zweite Symbol in der Task-Leiste, aber der Dialog bleibt immer im Vordergrund. Das reicht mir für meine Zwecke erstmal. Ich habe momentan leider keine Zeit mehr, um dies weiter zu untersuchen.

    Vielen Dank für eure Hilfe.



  • Plotter schrieb:

    Danke für den Tip. Wird denn der Parent im Aufruf aus der exe implizit mitgegeben?

    Das musst Du wissen, ob Du den Parent mituebergibst. Beim Oeffnen eines Dialogs kann man einen Parent-Parameter angeben, den man normalerweise mit dem Hauptfenster belegt.

    Wenn Du nur DoModal() aufrufst, musst Du im Konstruktor gucken, bzw. dort, wo Du den Konstruktor aufrufst.



  • Ja eben gebe ich den Parent nicht mit. Aber in einem Fall klappte es ja, im anderen nicht. Darum war ja die Frage, ob der Parent implizit mitgegeben wird. In einem Fall hätte es ein gültiger Wert sein können, im anderen nicht, weswegen dieses unterschiedliche Verhalten resultierte.


Anmelden zum Antworten