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 Zugriff auf beliebiges Element eines Forms (https://www.delphipraxis.net/124532-zugriff-auf-beliebiges-element-eines-forms.html)

Xong 20. Nov 2008 15:09


Zugriff auf beliebiges Element eines Forms
 
Hi DPler!

Ich habe ein Formular. Auf diesem Formular sitzt irgendwo ein Dockpanel.
Auf diesem Dockpanel erzeuge ich zur Laufzeit eine Toolbar mit dem Namen "Toolbar1".
Diese Toolbar kann nun vom Nutzer in andere Dockpanel verschoben oder gänzlich gelöst werden (als eigenständiges kleines Fenster, wie man es auch von Word kennt).

Wie kann ich zur Laufzeit ermitteln, wo sich "Toolbar1" befindet?

Wie bekomme ich außerdem Zugriff auf "Toolbar1", wenn ich nur den Namen (Komponentenname) zur Verfügung habe?

LG,
Xong

nahpets 20. Nov 2008 15:23

Re: Zugriff auf beliebiges Element eines Forms
 
Hallo,

versuche es mal flach zu formulieren:

Gehe durch die Komponenten der Applikation und für jede gefundene Komponente durch alle Komponenten dieser Komponente, bis du fündig geworden bist.

Sowas in der Art:
Delphi-Quellcode:
for i := 0 to Application.ComponentCount - 1 do begin
  if Application.Components[i].ComponentCount > 0 then
    with Application.Components[i] do begin
      // das dann rekursiv weiter
    end;
  end;
end;
Bei Formularen ggfls. auch mit form.ControlCount und form.Controls[i], eventuell auch mit Application.Components[i].FindComponent('Toolbar1')...

Zugriff per Typcast auf die gefunden Komponente:
Delphi-Quellcode:
If Components[i] is TToolbar then with Components[i] As TToolbar do begin...

Xong 20. Nov 2008 16:00

Re: Zugriff auf beliebiges Element eines Forms
 
Herzlichen Dank für deine Antwort.
Ich vermutete, dass es schon eine fertige Funktion gibt.

Meine Lösung:
Delphi-Quellcode:
{
  Rekursive Suche nach einer Komponente anhand ihres Namens

  Parameter
    s:     Name der gesuchten Komponente
    parent: Startkomponente, bei der mit der Suche begonnen werden soll.

  Rückgabewert
    Gibt bei Erfolg die gesuchte Komponente zurück, bei Misserfolg nil.
}
function FindComponentByName(s: TComponentName; parent: TComponent): TComponent;
var i: Integer;
begin
  if parent.Name = s then begin
    // Gefunden!
    Result := parent;
  end else begin
    if parent.ComponentCount > 0 then begin
      for i:=0 to parent.ComponentCount - 1 do begin
        Result := FindComponentByName(s,parent.Components[i]);
        if Result <> nil then
          break;
      end;
    end else begin
      Result := nil;
    end;
  end;
end;

DeddyH 20. Nov 2008 16:04

Re: Zugriff auf beliebiges Element eines Forms
 
Wobei die Zeile
Zitat:

Delphi-Quellcode:
if parent.ComponentCount > 0 then begin

überflüssig ist ;)

mkinzler 20. Nov 2008 16:15

Re: Zugriff auf beliebiges Element eines Forms
 
Lieber eine Zuviel als eine zu wenig :zwinker:

DerDan 20. Nov 2008 16:46

Re: Zugriff auf beliebiges Element eines Forms
 
Zitat:

Zitat von DeddyH
Wobei die Zeile
Zitat:

Delphi-Quellcode:
if parent.ComponentCount > 0 then begin

überflüssig ist ;)

Dann gäbe es aber denn Fall, das Result undefiniert ist.


mfg
DerDan


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