Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Feststellen ob eine Komponente vorhanden ist? (https://www.delphipraxis.net/111709-feststellen-ob-eine-komponente-vorhanden-ist.html)

Chemiker 8. Apr 2008 06:52


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:
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;
ist leider fehlgeschlagen.

Bis bald Chemiker

SirThornberry 8. Apr 2008 07:23

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)

oki 8. Apr 2008 07:27

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:
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;
Ob das nun der Brüller ist, keine Ahnung. Aber es funzt.


Gruß oki

Chemiker 8. Apr 2008 20:57

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:
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;
Es scheint so, dass nun alle TCharts erstellt werden.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz