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
WeBsPaCe 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]); |
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!