| Autor |
Beitrag |
Stoffel1984
      
Beiträge: 219
Win NT, Win 2000
D6 Prof
|
Verfasst: Mo 19.09.05 22:23
Hallo,
wie kann ich überprüfen ob meine Anwendung bereits einen MessageDlg
ausgegeben hat - Hintergrund ist, ich möchte vermeiden, dass mehrere MessageDlgs
nacheinander erscheinen.
Danke!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 19.09.05 22:33
Wenn Du einfach nur wissen willst, ob bereits ein MessageDlg offen ist, gibt es mindestens zwei Möglichkeiten:
1. Setzen einer Variablen
Funktioniert aber nur bei explizit ausgelösten MessageDlgs, in dem Du immer, wenn Du einen öffnest, eine Variable auf True setzt.
2. Überprüfung des Enabled-Status der Mainform
MessageDlgs (und andere Modal-Fenster deaktivieren vor ihrer Anzeige jegliche Formulare (außer sich selbst). Daher kann man, wenn man die Mainform auf "enabled" prüft relativ sicher modal geöffnete Formulare feststellen. Da die VCL aber nicht alle Informationen direkt an Enabled weiterreicht, kann es notwendig sein, den Aktivierungsstatus des Hauptfensters per WinAPI abzufragen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Stoffel1984 
      
Beiträge: 219
Win NT, Win 2000
D6 Prof
|
Verfasst: Mo 19.09.05 22:38
Hallo Ben,
Danke für deine Hilfe.
Mhh das Problem ist, dass ShowMainForm = false ist
und das Programm in der TNA schlummert....
Das Programm gibt die Dialoge in einer Schleife raus.
Ich möchte jedoch nicht, dass wenn ein Dialog geöffnet ist ein weiterer erscheint.
Sondern der alte gelöscht wird und ein neuer angezeigt wird.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 19.09.05 22:54
Dann kannst Du mit Screen.ActiveForm.ModalResult := mrCancel; das aktuelle Meldungsfenster schließen. Auf nicht-modale Fenster hat das keine Auswirkung.
Achtung: Das Fenster schließt sich erst im nächsten Idle-Zyklus. Du musst also per (z.B.) PostMessage (KEIN SendMessage!!!) dafür sorgen, dass das nächste Formular erst nach dem Schliießen des Meldungsfensters aktiviert wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| Type TMainform = class(TForm) private procedure WMUser(var MSG: TMessage); message WM_USER; procedure CloseModalDlgs; end;
Procedure TMainform.WMUser(var Msg: TMessage); begin end;
Procedure TMainform.CloseModalDlgs; var AF: TForm; begin AF := Screen.ActiveForm; If Assigned(AF) Then AF.ModalResult := mrCancel; PostMessage(Handle, WM_USER, 0, 0); end; |
Achtung: Ungetestet!
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|