![]() |
Feststellen ob eine Komponente vorhanden ist?
Hallo,
wie kann man feststellen, ob eine Komponente die dynamisch erzeugt wird, unter einen bestimmten Komponenten – Name schon vorhanden ist. Mein Versuch:
Delphi-Quellcode:
ist leider fehlgeschlagen.
for I := 0 to MessStellenLst.Count - 1 do
begin if TChart(FindComponent('c'+TMSV1(MessStellenLst.Objects[i]).MaNr))=Nil then begin MessChart:= TChart.Create(ChartPanel); if not(Assigned(TChart(FindComponent('c'+TMSV1(MessStellenLst.Objects[i]).MaNr)))) then begin DiaErstellen(ChartPanel,MessChart,TMSV1(MessStellenLst.Objects[i]).MaNr, (TMSV1(MessStellenLst.Objects[i]).MaBez)); end; end; end; Bis bald Chemiker |
Re: Feststellen ob eine Komponente vorhanden ist?
Wenn du FindComponent verwendest so ist das gleichbedeutend mit Self.FindComponent
Das heißt das FindComponent bezieht sich auf die aktuelle Klasse. Du musst beim erzeugen deiner Komponente den richtigen Owner angeben. Wenn du keinen angibst kannst du auch nirgends mit FindComponent danach suchen. Gibst du als Owner Form2 an obwohl die Komponente auf Form1 liegt findet nur FindComponent von Form2 die Komponente. Was allerdings nicht vergessen werden sollte!! Die Methode heißt FindComponent. Es wird also anhand des Namens danach gesucht. Wenn du die Komponente dynamsich erzeugst spricht aber auch nix dagegen das du dir das Ergebnis auf eine Variable sicherst oder wenn es mehrere sind in einem Array/Liste. Das ist bedeutend performanter weil du in deinem Array/Liste dann nur die Komponenten hast die auch wirklich von dir gefunden werden sollen. Beim normalen FindComponenten hingegen werden alle Komponenten des Forms mit geprüft (also jedes Edit, Label etc. was du zur Designzeit plaziert hast) |
Re: Feststellen ob eine Komponente vorhanden ist?
Moin Chemiker,
meine zur Laufzeit erstellten Komponenten bekommen alle einen eindeutigen Namen. Laut OH soll '' auch gültig sein, aber das scheint dich und mich ja nicht zu interessieren. Hier meine Methode meiner Basiskomponente einen gültigen Namen beim Create zu finden.
Delphi-Quellcode:
Ob das nun der Brüller ist, keine Ahnung. Aber es funzt.
procedure TBaseCustomControl.SetFirstName;
var Counter : Integer; Component : TComponent; NewComponentName : String; begin // neuer Name if not Assigned(Application) then begin if self.Owner = nil then Component := self end else Component := Application.MainForm; Counter := 0; NewComponentName := ''; try while NewComponentName = '' do begin NewComponentName := GetNewComponentName( Copy(ClassName + InttoStr(Counter), 2, Length(ClassName + InttoStr(Counter))), Component); Inc(Counter); end; finally SetName(NewComponentName); end; end; function GetNewComponentName(NewName: string; Component: TComponent): String; var Counter : Integer; begin Result := NewName; for Counter := 0 to Component.ComponentCount - 1 do begin if Component.Components[Counter].ComponentCount > 0 then Result := GetNewComponentName(NewName, Component.Components[Counter]); if Result = '' then Exit; if Component.FindComponent(NewName) <> nil then begin Result := ''; Exit; end; end; end; Gruß oki |
Re: Feststellen ob eine Komponente vorhanden ist?
Hallo SirThornberry und oki,
Danke für die Tipps. Habe übersehen, dass ich TChar auf einem Panel erstelle und dadurch nicht mehr Form1 der Inhaber von TChart ist, sondern das Panel. Mit FindComponent wird jetzt auch nur auf dem Panel gesucht.
Delphi-Quellcode:
Es scheint so, dass nun alle TCharts erstellt werden.
for I := 0 to MessStellenLst.Count - 1 do
begin if TChart(ChartPanel.FindComponent('c'+TMSV1(MessStellenLst.Objects[i]).MaNr))=Nil then begin MessChart:= TChart.Create(ChartPanel); if not(Assigned(TChart(ChartPanel.FindComponent('c'+TMSV1(MessStellenLst.Objects[i]).MaNr)))) then begin DiaErstellen(ChartPanel,MessChart,TMSV1(MessStellenLst.Objects[i]).MaNr, (TMSV1(MessStellenLst.Objects[i]).MaBez)); end; end; end; Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz