LastActiveControl richtig auswerten

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

LastActiveControl richtig auswerten

Beitrag von willi4willi »

Wie kann ich in einem Form ermitteln, welches das letzte aktive Control war. Natürlich könnte ich mir dieses im OnExit-Ereignis merken. aber dann müsste ich das bei jedem Control.
Ich dachte daran, die Form-Eigenschaft "LastActiveControl" dafür zu verwenden, doch irgendwie funktioniert das nicht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.ActiveControl:=Edit1;
  form1.ActiveControl:=Edit2;
  Caption:=form1.ActiveControl.Name+'  '+form1.LastActiveControl.Name;
end;
Ich hätte jetzt erwartet, dass in der Titelleiste "Edit2 Edit1" stehen würde.

Was mache ich falsch? Oder ist das ein Bug, dass LastActiveControl das gleiche zurückgibt wie ActiveControl?

.
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 337
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: LastActiveControl richtig auswerten

Beitrag von Niesi »

Ich hab mir mal eine Testapp gemacht, war ja keine da ... :roll:

Da das aktive Control auch das letzte aktive Control ist/war, stimmt die Logik doch eigentlich. :mrgreen:

Ist nur unsinnig ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

wp_xyz
Beiträge: 4890
Registriert: Fr 8. Apr 2011, 09:01

Re: LastActiveControl richtig auswerten

Beitrag von wp_xyz »

Wenn man ein paar Meldungen in SetActiveControl und SetfocusControl (die beide LastActiveControl verändern) einbaut, sieht man, dass diese beiden Methoden meistens paarweise aufgerufen werden, so dass das durch die erste Methode geänderte LastActiveControl beim Aufruf der zweiten Methode überschrieben wird.

Ich denke, LastActiveControl ist nicht für den Anwendungsentwickler gedacht, sondern nur für interne Zwecke, musste aber als "public" deklariert werden, um aus anderen Units, möglicherweise den Design-Units, darauf zugreifen zu können.

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: LastActiveControl richtig auswerten

Beitrag von willi4willi »

Ich habe einmal testweise in beiden Methoden (SetActiveControl und SetfocusControl) die Rehenfolge so geändert, wie es mir logisch erschien. Also erst in FLastActiveControl die FActiveControl gemerkt und dann den Wert der von FActiveControl neu gesetzt.

TCustomForm.SetActiveControl:

Code: Alles auswählen

....

  // hier eingefügt !!!!!!!!!!!!
      if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
        FLastActiveControl := FActiveControl;

  FActiveControl := AWinControl;

  // hier entfernt !!!!!!!!!!!!!
      //if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
      //  FLastActiveControl := FActiveControl;
.... 
TCustomForm.SetFocusedControl:

Code: Alles auswählen

....
  // hier eingefügt !!!!!!!!!!!!
        if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
          FLastActiveControl := FActiveControl;

        FActiveControl := Control;

  // hier entfernt !!!!!!!!!!!!!
        //if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
        //  FLastActiveControl := FActiveControl;


....

Jetzt funktioniert es, wie erwartet.

Habe ich jetzt das Lazarus kaputt gemacht oder einen Bug beseitigt?

Was meint ihr?

.
 

Viele Grüße

Willi4Willi

------------

wp_xyz
Beiträge: 4890
Registriert: Fr 8. Apr 2011, 09:01

Re: LastActiveControl richtig auswerten

Beitrag von wp_xyz »

Schreibe darüber mal einen Bug-Report, damit es die Entwickler, die sich mit dem Designmode auskennen, zu Gesicht bekommen.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 337
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: LastActiveControl richtig auswerten

Beitrag von Niesi »

willi4willi hat geschrieben:
Mo 12. Feb 2024, 19:28
Ich habe einmal testweise in beiden Methoden (SetActiveControl und SetfocusControl) die Rehenfolge so geändert, wie es mir logisch erschien. Also erst in FLastActiveControl die FActiveControl gemerkt und dann den Wert der von FActiveControl neu gesetzt.

TCustomForm.SetActiveControl:

Code: Alles auswählen

....

  // hier eingefügt !!!!!!!!!!!!
      if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
        FLastActiveControl := FActiveControl;

  FActiveControl := AWinControl;

  // hier entfernt !!!!!!!!!!!!!
      //if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
      //  FLastActiveControl := FActiveControl;
.... 
TCustomForm.SetFocusedControl:

Code: Alles auswählen

....
  // hier eingefügt !!!!!!!!!!!!
        if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
          FLastActiveControl := FActiveControl;

        FActiveControl := Control;

  // hier entfernt !!!!!!!!!!!!!
        //if (FActiveControl<>nil) and not (FActiveControl is TCustomForm) then
        //  FLastActiveControl := FActiveControl;


....

Jetzt funktioniert es, wie erwartet.

Habe ich jetzt das Lazarus kaputt gemacht oder einen Bug beseitigt?

Was meint ihr?

.
Du könntest es verbessert haben ... :lol:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten