![]() |
Herausfinden wie viele Panels auf einen Panel liegen
Abend,
ich habe ein Panel (der muss nicht immer den gleichen Namen haben, wird per Sender übergeben) auf welchen mehrere Panels liegen. Die Panels haben immer einen Namen im Stil von ExPanel + Nummer (z. B. ExPanel1, etc.). Auf diesen Panels liegen weitere Panels mit verschiedenen Namen. Wie kann ich jetzt alle ExPanels ermitteln und in eine StringList speichern?
Code:
ComponentCount zählt ja leider alle Komponenten auf der Form...
ExPanel1
ExPanel2 ExPanel5 <-- Mit Absicht nicht die Nummerierung mit 3 fortgesetzt da der User zu Laufzeit auch ExPanels entfernen kann. ... Weiß wer weiter? |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Hallo Andreas,
nicht Panel.Components sondern Panel.Controls musst du durchsuchen - eventuell sogar rekursiv. Grüße vom marabu |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Delphi-Quellcode:
Oder wenn nur die Panel's gezählt werden sollen, die direkt im Sender liegen, aber nicht Panels die in Deinen ExPanelX liegen:
var
i, n: integer; // ... Irgend etwas vorher n:=0; if (Sender is TPanel) then for i:=0 to TPanel(Sender).ComponentCount-1 do if (TPanel(Sender).Components[i] is TPanel) then Inc(n); // ... Irgend etwas danach
Delphi-Quellcode:
var
i, n: integer; // ... Irgend etwas vorher n:=0; if (Sender is TPanel) then for i:=0 to TPanel(Sender).ComponentCount-1 do if (TPanel(Sender).Components[i] is TPanel) and (TPanel(TPanel(Sender).Components[i]).Parent = Sender) then Inc(n); // ... Irgend etwas danach |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Hallo Dennis,
Eigentümer (Owner - Components) aller Panels ist in der Regel die Form und dann findest du die Panels nicht im Components-Array eines Panels. Für die visuelle Hierarchie (Parent - Controls) ist das Controls-Array zuständig. Und da gibt es auch Rekursion - Panels, die auf Panels liegen, welche auf einem Panel liegen.
Delphi-Quellcode:
Freundliche Grüße vom marabu
procedure GetControls(wc: TWinControl; s: TStrings);
var i: Integer; begin s.AddObject(wc.Name, wc); for i := 0 to Pred(wc.ControlCount) do if wc.Controls[i] is wc.ClassType then GetControls(TWinControl(wc.Controls[i]), s); end; |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Für mein Verständnis...
Controls = Visuelle Element abgeleitet von TComponent Component = Allg. Element inkl nicht sichtbarer wie der TTimer und so OK dann macht Control(& ControlCount) mehr Sinn weil man sich evtl ein paar Elemente in der For-Schleife spart. aber aControl.Parent sollte doch das TWinControl sein auf dem aControl gezeichnet wird... somit kann ich doch damit die Rekursion auf eine "Ebene" begrenzen. |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Zitat:
|
Re: Herausfinden wie viele Panels auf einen Panel liegen
@Dennis: alles richtig, aber du sollst die Rekursion gar nicht auf eine Ebene begrenzen:
Zitat:
Delphi-Quellcode:
marabu
procedure TDemoForm.ButtonClick(Sender: TObject);
var s: TStringList; begin s := TStringList.Create; GetControls(Panel1, s); ShowMessage(s.Text); s.Free; end; |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Zitat:
ich habe mich mal selber versucht eine Routine zu schreiben. Da mein Kopf heute schon in der Berufschule geraucht hat denke ich mal das dies hier von der Logik nicht wirklich der Renner ist. Kompiliert wird es sogar bis zu den 2 Zeilen wo ich versuche auf den SpeedButton zu zugreifen:
Delphi-Quellcode:
function ArrangeExPanel(Sender : TObject):Boolean;
var i: Integer; useEdit: TObject; useDelete: TObject; sl: TStringlist; begin if Sender.ClassType=TPanel then begin sl:=TStringList.Create; repeat sl.add((Sender as TPanel).FindComponent('ExPanel').name); until (Sender as TPanel).FindComponent('ExPanel').name=''; begin for i:=0 to sl.count-1 do begin useEdit:=(Sender as TPanel).FindComponent('Edit_'+sl.strings[i]); useDelete:=(Sender as TPanel).FindComponent('Delete_'+sl.strings[i]); useDelete:=(useDelete as TSpeedButton); useEdit:=(useEdit as TSpeedButton); useEdit.Left:=(Sender as TPanel).Width-3; useDelete.Left:=(Sender as TPanel).Width-87; end; end; sl.free; Result:=true; end else begin Result:=false; end; end; |
Re: Herausfinden wie viele Panels auf einen Panel liegen
Anscheinend ist die Logik meines Codes doch nicht so verkehrt vorausgesetzt ich habe das mit der repeat - Until richtig verstanden. Repeat wiederholt nen Code, Until: Wenn FindComponent leer ist "(Sender as TPanel).FindComponent('ExPanel').name='';", wird die For-Schleife mit der StringList gestartet.
Leider kommt in beiden der folgenden Zeilen "Undefinierter Bezeichner: Left"
Delphi-Quellcode:
Was könnt da wohl falsch sein? Ich weise doch der Variable einen TSpeedButton zu...
useEdit.Left:=(Sender as TPanel).Width-3;
useDelete.Left:=(Sender as TPanel).Width-87; bye, Andy |
Re: Herausfinden wie viele Panels auf einen Panel liegen
useEdit und useDelete sind vom Typ TObject und ein TObject hat keine Breite...
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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