[gelöst] "IMMER wenn Form im Fokus"-Handler

Für Fragen rund um die Ide und zum Debugger
Antworten
heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

[gelöst] "IMMER wenn Form im Fokus"-Handler

Beitrag von heheracer »

Hi!
Ich arbeite grade an einem Projekt, bei dem IMMER wenn die Form in den Fokus gerät (.showmodal, also dass die anderen nicht anklickbar sind) eine Aktion ausgeführt werden soll. im speziellen soll hier der titel dynamisch geändert werden, je nach dem was man in den anderen forms macht. mit

Code: Alles auswählen

procedure TFormX.FormActivate(Sender: TObject);
wird das aber laut beschreibung

Code: Alles auswählen

Handler called when the form receives focus. 
This handler is called when the form receives focus for the first time at application start up and then subsequently each time focus is changed from another window of the same application to this window.
For focus changes between different applications the Application.OnActivate handler is called instead.
(wenn ich das richtig interpretiere) nur beim ersten fokusieren der form ausgeführt.

danke im vorraus
9Strike
Zuletzt geändert von heheracer am So 15. Feb 2015, 22:20, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von Michl »

Bei mir (Win7) funktioniert ein TApplicationProperties auf dem Formular abzulegen und:

Code: Alles auswählen

procedure TForm1.ApplicationProperties1Activate(
  Sender: TObject);
begin
  Caption:='Zufallszahl '+IntToStr(Random(100));
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von m.fuchs »

heheracer hat geschrieben:[code=text][...]and then subsequently each time focus is changed from another window of the same application to this window.[...]
(wenn ich das richtig interpretiere) nur beim ersten fokusieren der form ausgeführt.

Das interpretierst du nicht richtig.

Leider schreibst du nicht dazu, ob es dir nur am das Fokussieren innerhalb deiner Applikation geht. Andernfalls muss du zusätzlich auch Application.OnActivate berücksichtigen.

Übrigens: so etwas kann man leicht durch Ausprobieren herausbekommen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von heheracer »

m.fuchs hat geschrieben:
heheracer hat geschrieben:[code=text][...]and then subsequently each time focus is changed from another window of the same application to this window.[...]
(wenn ich das richtig interpretiere) nur beim ersten fokusieren der form ausgeführt.

Das interpretierst du nicht richtig.

Leider schreibst du nicht dazu, ob es dir nur am das Fokussieren innerhalb deiner Applikation geht. Andernfalls muss du zusätzlich auch Application.OnActivate berücksichtigen.

Übrigens: so etwas kann man leicht durch Ausprobieren herausbekommen.


hm ja ich glaub den teil hab ich nicht so recht verstanden. ich hab nur eine .exe, aber halt 7 units. normale wird immer "nach oben" aufgerufen. also unit4 öffnet sich. sie öffnet unit5, die unit6 usw. jetzt schließen sich alle units und ich bin wieder bei unit4. jetzt soll wieder in meinem fall der caption geändert werden. form4 wird hierbei also nicht geschlossen. es gelangt nur aus dem fokus. allerdings gibt es fälle bei den unit4 auch geschlossen wird und beim neustart soll der caption mit dem handler geändert werden.

wird die form geschlossen und dann wieder geöffnet funktioniert on activate problemlos

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von m.fuchs »

Du schreibst wirr, so kann man dir nicht helfen. Verwürfele mal bitte nicht den Begriff Form und Unit. Schreib beim OnActivate bitte dazu, welches gemeint ist. Und formulier bitte sauber und klar, was zu welchem Zeitpunkt passieren soll.

Achja, ein bisschen saubere Rechtschreibung (in der deutschen Sprache gibt es Groß-/Kleinschreibung) hilft dem Leser auch.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von heheracer »

m.fuchs hat geschrieben:Du schreibst wirr, so kann man dir nicht helfen. Verwürfele mal bitte nicht den Begriff Form und Unit. Schreib beim OnActivate bitte dazu, welches gemeint ist. Und formulier bitte sauber und klar, was zu welchem Zeitpunkt passieren soll.

Achja, ein bisschen saubere Rechtschreibung (in der deutschen Sprache gibt es Groß-/Kleinschreibung) hilft dem Leser auch.


Gut, OK. Ich versuch es so gut ich kann.
Ich habe ein Programm, das öffnet von Unit1 über ein Button Form4 (Form4.showmodal). Jetzt soll ein Handler ins Spiel kommen, der immer wenn diese Form im Fokus ist mehrere Dinge ausführt. Beim ersten Öffnen wird jetzt z. B. ein zufälliger Caption gemacht. Jetzt öffnet sich über ein Button Form5 (wie oben). Dort kann man jetzt z. B. in eine TEdit-Box den Titel für Form4 eingeben. Dabei wird die Eingabe z. B. als Public-Variable deklariert. Nach der Bestätigung über ein Button wird Form5 geschlossen. Form4 ist jetzt im Fokus -> Jetzt muss der Handler von oben nochmal ausgeführt werden. Über eine if-Schleife erkennt er spezielle Eingaben und haut z. B. eine Message raus. Wenn ich das allerdings richtig interpretiere wird der OnActivate-Handler aber hier nicht ausgeführt.

PS: Das kommt so bei mir nicht direkt im Programm vor, den Titel könnte man ja auch einfach mit Form4.Caption:=eingabe ändern.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von Michl »

In der Tat, deine Anforderung hatte ich anders interpretiert: dass du das Ereignis abfangen willst, wenn dein Programm von einem externen Programm wieder den Fokus zurück erhält.

Vielleicht stehe ich ja auf der Leitung, doch warum machst Du nicht sowas:

Code: Alles auswählen

procedure TForm4.Button1Click(Sender: TObject);
begin
  Form5.ShowModal;
  Caption:=IntToStr(Random(100))//bzw. die entsprechende Variable
end

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von heheracer »

Michl hat geschrieben:In der Tat, deine Anforderung hatte ich anders interpretiert: dass du das Ereignis abfangen willst, wenn dein Programm von einem externen Programm wieder den Focus zurück erhält.

Vielleicht stehe ich ja auf der Leitung, doch warum machst Du nicht sowas:

Code: Alles auswählen

procedure TForm4.Button1Click(Sender: TObject);
begin
  Form5.ShowModal;
  Caption:=IntToStr(Random(100))//bzw. die entsprechende Variable
end


Ja, in der Tat, das würde funktionieren ABER ich möchte ja auch das das ausgeführt wird wenn ich 1. Die Form zum ersten Mal öffne (bzw. zum zweiten Mal, nachdem ich sie einmal geschlossen habe) und 2. z. B.

Code: Alles auswählen

 Form6.ShowModal;
das wäre dann halt schon sehr viel Arbeit die ich mit einem allumfassenden Handler umgehen möchte.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von Michl »

Naja, wenn das Event "OnActivate" nicht das geeignete Ereignis ist, dann musst du dir was anderes einfallen lassen.

Z.B. kannst du nach jedem entsprechenden ShowModal eine Procedure ausführen lassen, die die entsprechenden Änderungen macht. Du könntest auch ein eigenes Event erstellen, was du dann entsprechend feuerst. Du könntest dieses auch asynchron machen. Du könntest auch in jedem Formular.OnClose dieses Event feuern usw.

heheracer hat geschrieben:das wäre dann halt schon sehr viel Arbeit
Das verstehe ich nicht. Es wäre bei Variante 1 jeweils 1 Zeile Code nach der Zeile FormXYZ.ShowModal.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von heheracer »

Michl hat geschrieben:Naja, wenn das Event "OnActivate" nicht das geeignete Ereignis ist, dann musst du dir was anderes einfallen lassen.

Z.B. kannst du nach jedem entsprechenden ShowModal eine Procedure ausführen lassen, die die entsprechenden Änderungen macht. Du könntest auch ein eigenes Event erstellen, was du dann entsprechend feuerst. Du könntest dieses auch asynchron machen. Du könntest auch in jedem Formular.OnClose dieses Event feuern usw.

heheracer hat geschrieben:das wäre dann halt schon sehr viel Arbeit
Das verstehe ich nicht. Es wäre bei Variante 1 jeweils 1 Zeile Code nach der Zeile FormXYZ.ShowModal.


Hm, ja jetzt wo ich drüber nachdenke werde ich es wohl so irgendwie machen. Danke für die Hilfe!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: "IMMER wenn Form im Fokus"-Handler

Beitrag von m.fuchs »

heheracer hat geschrieben:[...] Über eine if-Schleife [...]

Kleiner Hinweis: Das Ding heißt "bedingte Anweisung", eine Schleife ist es nicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten