Entwickler-Ecke

Sonstiges (Delphi) - FindComponent


WeBsPaCe - Sa 02.04.05 12:03
Titel: FindComponent
Moin... ;)

Ich möchte per FindComponent alle Komponenten eines gewissen Typs finden. Sonst muss man ja immer als Parameter den Namen der Komponenten angeben.

Danke schonmal. ;)


Sprint - Sa 02.04.05 12:17


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure FindComponentByType(Owner: TComponent; const ClassName: String; Result: TList);
var
  I: Integer;
begin

  Result.Clear;

  for I := 0 to Owner.ComponentCount - 1 do
    if Owner.Components[I].ClassNameIs(ClassName) then
      Result.Add(Owner.Components[I]);

end;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList;
begin

  List := TList.Create;
  FindComponentByType(Self, 'TImage', List);
  // ...
  List.Free;

end;


WeBsPaCe - Sa 02.04.05 12:20

Danke!! :D Werd's sogleich ausprobieren!! ;)


WeBsPaCe - Sa 02.04.05 12:45

Jop. Funktioniert genauso, wie ich wollte. Danke, danke!! :flehan:

Mit FindCmponent geht's halt nicht. Werd nächstes Mal auch nach anderem gucken. ;)


WeBsPaCe - Sa 02.04.05 13:01

Hmm.. Was ist der Owner bzw. Parent von allen Forms? :gruebel:

Wenn ich mir die anzeigen lassen will mit

Delphi-Quelltext
1:
2:
ShowMessage(Form1.Parent.Name);
ShowMessage(Form1.Owner.Name);

dann bekomm ich beim ersten eine Access-Violation und beim zweiten bekomm ich nix zurück. :shock:


Sprint - Sa 02.04.05 13:10

In deinem Fall ist der Owner von Form1 TApplication. Da musst du ClassName benutzen.


WeBsPaCe - Sa 02.04.05 13:12

Also, wenn wir grad mal deinen Code von da oben nehmen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList;
begin

  List := TList.Create;
  FindComponentByType(TApplication, 'TImage', List);
  // ...
  List.Free;

end;

:gruebel:


Sprint - Sa 02.04.05 13:18

Statt TApplication musst du Application nehmen. Das wird aber mit TImage nicht funktionieren. In der Regel findest du bei Application nur TForm's.


WeBsPaCe - Sa 02.04.05 13:19

Genau die will ich auch suchen. ;)


WeBsPaCe - Sa 02.04.05 13:22

Hmm... So hatte ich's aber... Und so geht's nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Blublabb;
var
i: Integer;
begin
for i := 0 to Application.ComponentCount - 1 do
if Application.Components[i].ClassNameIs('TForm'then begin
ShowMessage('0');
end;
end;

Er bringt kein einziges Mal die ShowMessage. :(


Sprint - Sa 02.04.05 13:24

Das Problem ist ja, das der Klassenname deiner Form z.B. TForm1 ist. Also müsstest du da mit "is TForm" prüfen.
Schreib doch lieber mal, was du ganz genau vor hast. Dann kann man da besser drauf eingehen.


WeBsPaCe - Sa 02.04.05 13:27

Ich brauch einfach alle Forms, weil ich auf jedem Formular zur Laufzeit ein TImage erstellen will. ;)


Sprint - Sa 02.04.05 13:31


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin

  for I := 0 to Application.ComponentCount - 1 do
    if Application.Components[I] is TForm then
      ShowMessage(Application.Components[I].Name);

end;


Funktioniert auf jeden Fall bei TForm's die von Delphi erstellt worden sind. Bei dynamisch-erstellten Form's ist es abhängig wie du sie erstellt hast.


WeBsPaCe - Sa 02.04.05 13:37

Hätte ich auch selber draufkommen können. :autsch:
Bin halt grad ziemlich beschäftigt mit GFS-Dokumentation. ;)

Jetzt bekomm' ich weiter hinten im Code bei

Delphi-Quelltext
1:
BkgrndImage.Parent := Application.Components[i];                    

jedoch diese Meldung da:

Quelltext
1:
[Error] Unit1.pas(79): Incompatible types: 'TWinControl' and 'TComponent'                    

Wenn ich allerdings statt Application.Components[i]; einfach Form1 schreib' (und ich teste ja im Moment auch nur mit Form1) dann geht es. :gruebel: Form1 ist doch TForm und somit auch TComponent oder? Fehlt da nur eine Eigenschaft? :gruebel:


Sprint - Sa 02.04.05 13:42

user profile iconWeBsPaCe hat folgendes geschrieben:

Quelltext
1:
[Error] Unit1.pas(79): Incompatible types: 'TWinControl' and 'TComponent'                    

Wenn ich allerdings statt Application.Components[i]; einfach Form1 schreib' (und ich teste ja im Moment auch nur mit Form1) dann geht es.

Da musst du typecasten.


Delphi-Quelltext
1:
BkgrndImage.Parent := TForm(Application.Components[XXX]);                    


WeBsPaCe - Sa 02.04.05 13:51

Ok. Vielen, vielen, vielen Danke!! :flehan: :flehan: ;)

Das "Gesammtergebnis" ist hier [http://www.delphi-forum.de/viewtopic.php?p=236724#236724] zu "bewundern". :lol:

Danke!!