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 komponente suchen über alle Forms und Datenmodule (https://www.delphipraxis.net/49431-komponente-suchen-ueber-alle-forms-und-datenmodule.html)

Schuster 11. Jul 2005 12:53


komponente suchen über alle Forms und Datenmodule
 
Hallo,

habe wiedermal ein Problem. :wall:

Wie kann ich eine Bestimmte Komponente finden.

Z.b.
eine Komponente die in einem Datenmodul sitzt sucht eine and. Komponente die irgendwo in einem
Formular sitzt aber die Formularnamen nicht namentlich bekannt sind.

Habs so probiert funkt aber nicht:
Delphi-Quellcode:
      for x:=0 to Application.ComponentCount-1 do
      if application.Components[x] is TMaxMySqlGrid then  //Prüfen welche v. meinen Grid sind
      begin
         if (application.Components[x] as TMaxMySqlGrid).Datasource.Name = Self.name then
         begin
           result:= application.Components[x]; //.Name
           exit;
         end
         else
           result:= nil;
      end;

Aya 11. Jul 2005 13:20

Re: komponente suchen über alle Forms und Datenmodule
 
Hi,

bin mir nicht sicher ob ich es richtig verstanden habe... aber so z.B. kannst du ein TEdit in allen Forms deiner App suchen:

Delphi-Quellcode:
function FindEdit(Name: String): TEdit;
var
  C, F: Integer;
begin
  Result:=nil;
  for F:=0 to Application.ComponentCount-1 do begin
    if Application.Components[F] is TForm then
      for C:=0 to TForm(Form).ComponentCount-1 do begin
        if TForm(Form).Components[C] is TEdit then begin //Wenn das was du suchst ein TEdit ist..
     if TEdit(TForm(Form).Components[C]).Name = Name then begin //Name..?
       Result:=TEdit(TForm(Form).Components[C]);
       Exit;
     end;
   end;
      end;
    end;
  end;
end;
Au'revoir,
Aya~

marabu 11. Jul 2005 13:21

Re: komponente suchen über alle Forms und Datenmodule
 
Hallo Markus,

du darfst nicht in den Komponenten der Application direkt und schon gar nicht alleine dort suchen. Dort befinden sich hauptsächlich die Formulare. Bestimmte Design-Techniken machen es sogar nötig, dass du rekursiv suchen musst - z.B. embedded child forms, frames...

Zur Veranschaulichung nimm einfach mal eines deiner Grids und gehe die chain of owners zurück bis zur Application.

Delphi-Quellcode:
var
  c: TComponent;
  sl: TStringList;
begin
  c := DBGrid;
  sl := TStringList.Create;
  repeat
    sl.Add(c.Name + ': ' + c.ClassName);
    c := c.Owner;
  until not Assigned(c);
  ShowMessage(sl.Text);
  sl.Free;
end;
Grüße vom marabu

shmia 11. Jul 2005 13:43

Re: komponente suchen über alle Forms und Datenmodule
 
In der Code-Library gibt es Hilfsfunktionen dazu:
http://www.delphipraxis.net/internal...ct.php?t=52210

Sprint 11. Jul 2005 13:56

Re: komponente suchen über alle Forms und Datenmodule
 
Delphi-Quellcode:
function GlobalFindComponent(const AName: String): TComponent;

  function ComponentFind(AComponent: TComponent; AName: String): TComponent;
  var
    I: Integer;
  begin
    Result := AComponent.FindComponent(AName);
    if not Assigned(Result) then
      for I := 0 to AComponent.ComponentCount - 1 do
      begin
        Result := ComponentFind(AComponent.Components[I], AName);
        if Assigned(Result) then
          Break;
      end;
  end;

begin
  Result := ComponentFind(Application, AName);
end;

Schuster 11. Jul 2005 14:27

Re: komponente suchen über alle Forms und Datenmodule
 
Thx to all

habs nun gelöst dank eurer Hilfe :dp:

und so schauts aus:

Delphi-Quellcode:
function TMaxMySqlQuery.FsucheGridKomponente():TComponent;
var x,f : Integer;
xform : Tform;
begin
      for f:=0 to Application.ComponentCount-1 do        //Anzahl der Komponenten feststellen
      if Application.Components[f] is TForm then         //Alle Fenster durchgehen
      begin
        xform := Tform(Application.Components[f]);     // in TForm casten

        for x:=0 to Tform(xform).ComponentCount-1 do    //Komponenten des Forms duchlaufen
        if Tform(xform).Components[x] is TMaxMySqlGrid then  //Prüfen welche v. meinen Grid sind
        begin     //DatasourceName mit Namen dieser Komp. vergleichen
          if (Tform(xform).Components[x] as TMaxMySqlGrid).Datasource.Name = Self.name then
          begin
           result:= Tform(xform).Components[x];
           exit;
          end
          else
           result:= nil;
        end;
      end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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