GroupBox.FindComponent findet nicht ... [gelöst]

Rund um die LCL und andere Komponenten
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

GroupBox.FindComponent findet nicht ... [gelöst]

Beitrag von AlterMann »

Hallo

Ich verwende (wie schon x-mal im gleichen Projekt) die FindComponent-Methode um mittels Schleife Objekte zu manipulieren.

Doch diesmal findet diese Konstruktion

Code: Alles auswählen

for a := 3 to 6 do
  begin 
   SB := (GroupBox1.FindComponent('SpeedButton'+IntToStr(a)) as TSpeedButton);
   if SB.Caption = ComboBox1.Text then ...
nichts.
SB ist nach dem Aufruf nil.
Die vier SpeedButtons SpeedButton3 bis SpeedButton6 hab ich zur Entwicklungszeit eingefügt und wenn ich sie mit

Code: Alles auswählen

     for a := 0 to ( GroupBox1.ControlCount - 1 ) do Memo1.Lines.Add(GroupBox1.Controls[a].Name);
anzeigen lasse werden sie auch aufgelistet.

Der Quelltext der Methode sieht auch unverdächtig (heißt: wie bei den funktionierenden Aufrufen) aus:

Code: Alles auswählen

Function  TComponent.FindComponent(const AName: string): TComponent;

Var I : longint;
    C : TComponent;
begin
  Result:=Nil;
  If (AName='') or Not assigned(FComponents) then exit;
  For i:=0 to FComponents.Count-1 do
    Begin
      c:=TComponent(FComponents[I]);
      If (CompareText(C.Name,AName)=0) then
        Exit(C);
    End;
end;

Ich hab auch schon versucht SB als TObject zu nehmen und erst beim Auslesen von Caption als TSpeedbutton zu casten (weil ich das an anderen Stellen wo es funktoniert auch so stehen habe), ändert aber (erwartungsgemäß) nichts.

Was überseh' ich denn schon wieder?

Danke für's Lesen
Christian
Zuletzt geändert von AlterMann am Mo 18. Apr 2022, 19:12, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

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

Re: GroupBox.FindComponent findet nicht ...

Beitrag von wp_xyz »

AlterMann hat geschrieben:
Mo 18. Apr 2022, 13:05
Der Quelltext der Methode sieht auch unverdächtig (heißt: wie bei den funktionierenden Aufrufen) aus:

Code: Alles auswählen

Function  TComponent.FindComponent(const AName: string): TComponent;
Var I : longint;
    C : TComponent;
begin
  Result:=Nil;
  If (AName='') or Not assigned(FComponents) then exit;
  For i:=0 to FComponents.Count-1 do
    Begin
      c:=TComponent(FComponents[I]);
      If (CompareText(C.Name,AName)=0) then
        Exit(C);
    End;
end;
Doch. Du rufst FindComponent als Methode der Groupbox1 auf, es werden also alle Komponenten gesucht, die der Groupbox gehören, oder andersgesagt, die Groupbox als Owner haben (nicht als Parent!). Wenn du aber im Designmode eine Komponenten aufs Formular klickst, dann wird das Formular als Owner eingetragen. Das heißt: den Speedbutton findest du, wenn du FindComponents des Formulars aufrufst:

Code: Alles auswählen

for a := 3 to 6 do
  begin 
   SB := (FindComponent('SpeedButton'+IntToStr(a)) as TSpeedButton);
   if SB.Caption = ComboBox1.Text then ...

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: GroupBox.FindComponent findet nicht ...

Beitrag von AlterMann »

Genau das war's!

Herzlichen Dank
Christian
Früher war alles besser. Und aus Holz!

Antworten