Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   MessageBox/Dlg per Programm schließen (https://www.delphipraxis.net/179479-messagebox-dlg-per-programm-schliessen.html)

Kraisel 10. Mär 2014 16:01

MessageBox/Dlg per Programm schließen
 
Hallo,

kann ich die MessageBox und den MessageDlg per Programm schließen, und zwar ohne Messages wie z.B. SendMessage(Application.ActiveFormHandle, WM_CLOSE, 0, 0)?

DestroyWindow(Application.ActiveFormHandle) schließt die Fenster, aber danach reagiert die MainForm nicht mehr, obwohl z.B. mein Timer noch läuft.
Auch ein Application.MainForm.SetFocus nach dem DestroyWindow hilft NICHT.

Nach CloseWindow(..) scheint alles andere richtig zu reagieren, aber die Fenster werden NUR minimiert und müssen per Klick entfernt werden.

Vielen Dank.

himitsu 10. Mär 2014 16:09

AW: MessageBox/Dlg per Programm schließen
 
Timer?

Du willst nicht zufällig eine MessageBoxTimeout haben?


Modale Fenster erstellt Delphi so, indem es alle anderen Fenster disabled (nicht über .Enable) und wenn du nur das Fenster zerschießt, wird natürlich der Rest nicht "freigegeben".



Gab es nicht vor Kurzem hier schonmal einen Thread, zum chließen vn Dialogen?
> Forensuche


Wenn es sich um eine Delphi-Form handelt, dann
Delphi-Quellcode:
Application.ActiveForm.Close;
,
und ansonsten WM_CLOSE? (Obwohl das wohl auch auf CloseWindow rauskommen würde :gruebel:)

sirius 10. Mär 2014 17:58

AW: MessageBox/Dlg per Programm schließen
 
Nimm CreateMessageDialog. Damit bekommst Du das fertige Fenste rund kannst jetzt selbst entscheiden, was du damit anstellen willst. Im Normalfall nur das:
Delphi-Quellcode:
FDlg:TForm;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Fdlg:=CreateMessageDialog('test',mtInformation,[mbYes,mbNo]);
  try
    Fdlg.showmodal;
  finally
    freeandnil(Fdlg);
  end;
end;
Und über FDlg hast du jetzt Zugriff auf die Form und kannst sie schließen (z.B.: Fdlg.Modalresult:=mrCancel).

Kraisel 10. Mär 2014 18:58

AW: MessageBox/Dlg per Programm schließen
 
Danke himitsu, danke sirius,

nein, nein, ich benötige MessageBox und MessageDlg denn:

MessageBox: ist länderspezifisch (also Yes anstatt ja usw.) und es kann in DLLs und bereits in initialization von Units genutzt werden, wenn alles andere noch gar nicht intitialisiert ist.
MessageDlg: ist eine normale Form, die mit CreateMessageDialog generiert wird. Aber von außen kommt man nicht heran, bzw. ich habe es nicht gefunden.

Das Ganze ist notwendig, wenn eine Meldung dazu führen soll, dass ein Mitarbeiter zwingend manuell z.B. einen Knopf im Schaltschrank drücken muss. Wenn dieser Knopf dann gedrückt ist, sollte die Meldung vom Schirm verschwinden.

Aber ich wiederhole: SendMessage(Application.ActiveFormHandle, WM_CLOSE, 0, 0) funktioniert einwandfrei. Ich möchte aber aus diversen Gründen die Fenster direkt und ohne MessageQueue schließen.

Ich habe hier im Forum keine Hinweise, die mich weiterbringen, gefunden.

Vielen Dank.

Rul 13. Mär 2014 18:50

AW: MessageBox/Dlg per Programm schließen
 
Zitat:

Zitat von Kraisel (Beitrag 1251430)
Aber ich wiederhole: SendMessage(Application.ActiveFormHandle, WM_CLOSE, 0, 0) funktioniert einwandfrei.
Ich möchte aber aus diversen Gründen die Fenster direkt und ohne MessageQueue schließen.

Die Applikation?

SendMessage(Applicatiom.Handle, WM_CLOSE, 0, 0);

oder nur das Meldungsfenster aus der Applikation?

Rul

Uwe Raabe 13. Mär 2014 19:03

AW: MessageBox/Dlg per Programm schließen
 
Zitat:

Zitat von Kraisel (Beitrag 1251430)
Ich möchte aber aus diversen Gründen die Fenster direkt und ohne MessageQueue schließen.

Alles was du in einer Single-Thread-Anwendung machst, ist am Ende das Abarbeiten von Nachrichten aus der MessageQueue.

Je nachdem welcher Dialog intern aufgerufen wird, hast du gar keine andere Wahl als eine Message an das Fenster zu senden. So wird z.B. bei Verwendung der alten Dialoge der Aufruf von MessageDlg in einem ShowModal landen - genauer in einer solchen Schleife:

Delphi-Quellcode:
        repeat
          Application.HandleMessage;
          if Application.Terminated then ModalResult := mrCancel else
            if ModalResult <> 0 then CloseModal;
        until ModalResult <> 0;
Du kannst allenfalls der Form-Instanz einen passenden ModalResult mitgeben. Allerdings wird das nichts, wenn die neuen Vista-und-höher-Dialoge aufgerufen werden - da gibt es keine Form-Instanz. Die MessageQueue ist hier die einzig sinnvolle Möglichkeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz