MessageBox eines Threads modal aufrufen



  • Habe in der Hoffnung, dass es funktioniert, jetzt nochmal den Laptop angemacht, aber funktioniert nicht.

    _matze schrieb:

    Eine MessageBox ist immer modal.

    Also MessageBox(NULL, "Fehlerbeschreibung..", "Fehler", MB_ICONSTOP); erscheint bei mir seltsamerweise nicht modal..

    Ich versuche mal, die MessageBox außerhalb des Threads::Execute() aufzurufen, denn bei dortigem Show() eines Forms gabs vorhin auch Probleme..

    //Edit: Okay, habs jetzt so gelöst:

    bool Check = true;
    
    void __fastcall TThread1::Execute()
    {
      ...
      if(...)
        Check = false;
      ...
    }
    //-------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender) //Enabled und auf 100ms
    {
      if(Check == false)
      {
        Check = true;
        MessageBox(NULL, "Fehlerbeschreibung..", "Fehler", MB_ICONSTOP|MB_TASKMODAL);
      } 
    }
    

    Kann mir denn wer erklären, warum es bei Form->Show() und beim Aufruf von MessageBoxen Probleme gibt, wenn diese in dem Execute() eines TThreads aufgerufen werden?

    Grüße,halloei



  • halloei schrieb:

    Also MessageBox(NULL, "Fehlerbeschreibung..", "Fehler", MB_ICONSTOP); erscheint bei mir seltsamerweise nicht modal..

    Eine MessageBox ist ein modaler Dialog. Es gibt halt verschiedene Arten. Eine normale MessageBox blockiert einfach nur den aufrufenden Thread.

    halloei schrieb:

    denn bei dortigem Show() eines Forms gabs vorhin auch Probleme..

    halloei schrieb:

    warum es bei Form->Show() und beim Aufruf von MessageBoxen Probleme gibt, wenn diese in dem Execute() eines TThreads aufgerufen werden?

    Was denn für Probleme? Es wäre vermutlich sinnvoll, das mal näher zu erläutern! 😉



  • _matze schrieb:

    Was denn für Probleme? Es wäre vermutlich sinnvoll, das mal näher zu erläutern! 😉

    Auf meinem Form sind die Elemente dynamisch zur Laufzeit erstellt und als ich diese noch im Thread aufgerufen habe, waren die Elemente total durcheinander und krumm und das Programm stürzte beim Beenden mit der Fehlermeldung "Ungültiges Fensterhandle" oder so ab..



  • halloei schrieb:

    _matze schrieb:

    Was denn für Probleme? Es wäre vermutlich sinnvoll, das mal näher zu erläutern! 😉

    Auf meinem Form sind die Elemente dynamisch zur Laufzeit erstellt und als ich diese noch im Thread aufgerufen habe, waren die Elemente total durcheinander und krumm und das Programm stürzte beim Beenden mit der Fehlermeldung "Ungültiges Fensterhandle" oder so ab..

    Wo gab's denn ein ungültiges Handle? Da hilft es, sich den Callstack (Aufrufliste) mal näher anzusehen.



  • Wenn du willst, dass eine Messagebox immer über einem bestimmten Fenster erscheint und dieses solange blockiert, musst du als ersten Paramter das Handle des Fensters übergeben.



  • Powerpaule schrieb:

    Wenn du willst, dass eine Messagebox immer über einem bestimmten Fenster erscheint und dieses solange blockiert, musst du als ersten Paramter das Handle des Fensters übergeben.

    Noch etwas schärfer: wenn du NULL als Fensterhandle übergibst, läufst du Gefahr, den Stack zu beschädigen.
    http://blogs.msdn.com/oldnewthing/archive/2005/02/23/378866.aspx



  • Pack den Aufruf von ...->ShowModal();

    in eine Funktion OHNE Patrameter und rufe diese mit Synchronize auf!

    Dann startet das Teil im HauptThread und blockiert den, bis der Dialog beendet wird.

    Gruss
    Frank



  • Powerpaule schrieb:

    Wenn du willst, dass eine Messagebox immer über einem bestimmten Fenster erscheint und dieses solange blockiert, musst du als ersten Paramter das Handle des Fensters übergeben.

    ..Wie wäre denn der Handle eines Forms..? 😕



  • Form->Handle... hätte man drauf kommen könne, wenn man ein Mal in die Hilfe guckt.



  • DocShoe schrieb:

    Form->Handle... hätte man drauf kommen könne, wenn man ein Mal in die Hilfe guckt.

    Hab geschaut, aber weiß nie, wonach ich wirklich suchen soll..
    Jetzt kann ich zumindest wieder die Dialoge in einem Thread aufrufen; vielen Dank!


Anmelden zum Antworten