Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Herausfinden wie viele Panels auf einen Panel liegen (https://www.delphipraxis.net/66449-herausfinden-wie-viele-panels-auf-einen-panel-liegen.html)

Andreas L. 29. Mär 2006 20:10


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:
ExPanel1
ExPanel2
ExPanel5 <-- Mit Absicht nicht die Nummerierung mit 3 fortgesetzt da der User zu Laufzeit auch ExPanels entfernen kann.
...
ComponentCount zählt ja leider alle Komponenten auf der Form...

Weiß wer weiter?

marabu 29. Mär 2006 20:23

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

DennisHB 30. Mär 2006 11:45

Re: Herausfinden wie viele Panels auf einen Panel liegen
 
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) then
      Inc(n);

// ... Irgend etwas danach
Oder wenn nur die Panel's gezählt werden sollen, die direkt im Sender liegen, aber nicht Panels die in Deinen ExPanelX liegen:

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

marabu 30. Mär 2006 13:12

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:
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;
Freundliche Grüße vom marabu

DennisHB 30. Mär 2006 14:19

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.

Andreas L. 30. Mär 2006 17:01

Re: Herausfinden wie viele Panels auf einen Panel liegen
 
Zitat:

Zitat von marabu
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:
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;
Freundliche Grüße vom marabu

Hmm, da bekomm ich eine Zugriffsverletzung in der Zeile "s.AddObject(wc.Name, wc);". Was nun?

marabu 30. Mär 2006 17:37

Re: Herausfinden wie viele Panels auf einen Panel liegen
 
@Dennis: alles richtig, aber du sollst die Rekursion gar nicht auf eine Ebene begrenzen:

Zitat:

Zitat von onlinehome
... ich habe ein Panel auf welchen mehrere Panels liegen. ... Auf diesen Panels liegen weitere Panels ...

@Andreas: wie testet du denn?

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  s: TStringList;
begin
  s := TStringList.Create;
  GetControls(Panel1, s);
  ShowMessage(s.Text);
  s.Free;
end;
marabu

Andreas L. 30. Mär 2006 19:16

Re: Herausfinden wie viele Panels auf einen Panel liegen
 
Zitat:

Zitat von marabu
@Dennis: alles richtig, aber du sollst die Rekursion gar nicht auf eine Ebene begrenzen:

Zitat:

Zitat von onlinehome
... ich habe ein Panel auf welchen mehrere Panels liegen. ... Auf diesen Panels liegen weitere Panels ...

@Andreas: wie testet du denn?

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  s: TStringList;
begin
  s := TStringList.Create;
  GetControls(Panel1, s);
  ShowMessage(s.Text);
  s.Free;
end;
marabu

jetzt gehts. Leider wird mir das 1te Panel angezeigt, dann das ExPanel und noch dazu das Panel welches auf dem ExPanel liegt. Ich möchte jedoch das mir nur die ExPanels angezeigt werden.

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;

Andreas L. 31. Mär 2006 09:01

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:
useEdit.Left:=(Sender as TPanel).Width-3;
useDelete.Left:=(Sender as TPanel).Width-87;
Was könnt da wohl falsch sein? Ich weise doch der Variable einen TSpeedButton zu...

bye,
Andy

Hawkeye219 31. Mär 2006 09:39

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 05:23 Uhr.
Seite 1 von 2  1 2      

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