Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular focus verlieren, Ereignis gesucht
Bronstein - Di 04.07.06 13:34
Titel: Formular focus verlieren, Ereignis gesucht
Habe eine Anwendung (Formular mit eingabefeldern usw.).
Wenn dieses Formular jetzt den Focus verliert möchte ich, dass ein Ereignis auftritt.
Sprich wenn ich das Programm minimiere, auf den Desktop mit der Mausklicke oder wenn ich ein anderes Programm aufrufe.
Gibt es so ein Ergeinis und wenn ja wie heißt es bzw. wie kann ich das implementieren
alias5000 - Di 04.07.06 13:42
OnDeactivate
Gruß alias5000
crowley - Di 04.07.06 13:46
deine Variable Application hat eine Ereignisroutine OnDeactivate, die du dafür verwenden kannst...
dafür musst du in deinem MainForm eine Funktion ergänzen
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) procedure AppDeactivate(Sender: TObject); private public end;
implementation
procedure TMainForm.FormCreate(Sender: TObject); begin Application.OnDeactivate := AppDeactivate; end;
procedure TMainForm.AppDeactivate(Sender: TObject); begin end; |
Edit: Alias5000 war schneller... klar... du kannst auch das OnDeactivate deiner Forms dafür verwenden, dann müsstest du aber gegebenenfalls für jedes Form diese Funktion nachpflegen... im Application.OnDeactivate kannst du das an zentraler Stelle... es bietet sich auch die TApplicationEvents- Komponente dafür an
alias5000 - Di 04.07.06 13:56
Klar, aber er will ja anscheinend nur für ein Formular, wenn man der Überschrift folgt :wink:
Bronstein - Di 04.07.06 14:01
so kann es klappen.
Wie kann ich wenn das Ereignis TForm1.ApplicationEvents1Deactivate auftritt, das Preogramm wieder aktivieren. So dass das Formular wieder sichtbar ist.
Das benötige ich, da ich mit einer Datenbank arbeite und diese erst wieder gesperrt wird wenn man auf speichern klickt. genau das möchte ich hier abfragen
Bronstein - Di 04.07.06 14:30
ZU meiner vorherigen Frage ist das die Antwort:
Application.Restore
Das Ereignis tritt aber nicht auf wenn ich zu einem anderen Programm wechsle möchte ich auch, dass das Programm sichtbar bleibt bis man die Daten gespeichert hat.
Doch das Ereignis tritt da nicht auf, auch wenn ich einfach neben meinem Programm auf den Desktop klicke soll das Programm aktiviert werden
crowley - Di 04.07.06 14:49
okay... warte mal... lass mich mal zusammenfassen, ob ich das, was du willst, richtig verstanden habe:
Du hast eine Datenbankanwendung geschrieben. In deiner Eingabemaske hast du einen Speichern- Knopf. Du möchtest verhindern, dass deine Anwendung erst "deaktiviert" werden kann, wenn man vorher auf Speichern gedrückt hat. Ansonsten soll dein Programm wieder in den Vordergrund gestellt werden, sobald man zu einer anderen Anwendung wechselt oder auf den Desktop klickt oder die Anwendung minimiert, ja ?
Bronstein - Di 04.07.06 14:51
ganz genau das ist mein Problem
crowley - Di 04.07.06 15:13
dann mach doch einfach im Deactivate einen
MessageDlg('Noch ungespeicherte Änderungen. bla. Jetzt speichern?', mtWarning, [mbYes, mbNo], 0)
und wenn ja angegeben wird, speicherst du... denke, es ist extrem anwenderunfreundlich, wenn ich nicht ein anderes Prog öffnen kann oder sonst irgendwas machen darf...
Bronstein - Di 04.07.06 15:57
Ja so hatte ich das vor, aber der springt mir überhaupt nicht in diese prozedure, wenn ich zu einem anderen Programm wechsle auf den Desktop klicke
crowley - Di 04.07.06 16:24
hab das gerade mal bei mir ausprobiert... bei mir wird eher das Event zu oft aufgerufen ;)
also folgenden Quelltext hab ich... hab hier ein form mit einem button und den appmessages:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject); begin if Button1.Tag = 0 then begin Button1.Tag := 1; BringWindowToTop(Handle); ShowMessage('Zuerst den Knopf drücken!'); Button1.Tag := 0; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if Button1.Tag <> 2 then Button1.Tag := 2 else Button1.Tag := 0; end; |
denke, dir fehlte das BringWindowToTop. Damit wird deine Anwendung wieder in den Vordergrund gestellt und deine Message angezeigt...
Bronstein - Mi 05.07.06 07:54
Ja OK das funktioniert so einigermaßen, das Ereignis tritt zumindest immer auf.
Wenn ich aber unten in der Startleiste/ Taskleiste ein anderes Programm auswähle, tritt zwar das Ereignis auf. Das andere Programm überdeckt aber trotzdem mein Programm.
Wie bring ich mein Programm also vor das andere Programm das ich unten ausgewählt habe.
Mit den Befehlen funktioniert es nicht:
- BringWindowToTop(Handle);
- Application.Restore;
- FormStyle := fsStayOnTop; //Form in den "StayOnTop" Modus bringen
FormStyle := fsNormal; //Form wieder "normalisieren"
- Form1.Show
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!