AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Herausfinden wie viele Panels auf einen Panel liegen
Thema durchsuchen
Ansicht
Themen-Optionen

Herausfinden wie viele Panels auf einen Panel liegen

Ein Thema von Andreas L. · begonnen am 29. Mär 2006 · letzter Beitrag vom 1. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.
(Gast)

n/a Beiträge
 
#1

Herausfinden wie viele Panels auf einen Panel liegen

  Alt 29. Mär 2006, 20:10
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 29. Mär 2006, 20:23
Hallo Andreas,

nicht Panel.Components sondern Panel.Controls musst du durchsuchen - eventuell sogar rekursiv.

Grüße vom marabu
  Mit Zitat antworten Zitat
DennisHB

Registriert seit: 25. Aug 2003
Ort: Bremen
58 Beiträge
 
Delphi 6 Personal
 
#3

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 11:45
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 13:12
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
  Mit Zitat antworten Zitat
DennisHB

Registriert seit: 25. Aug 2003
Ort: Bremen
58 Beiträge
 
Delphi 6 Personal
 
#5

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 14:19
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.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 17:01
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 17:37
@Dennis: alles richtig, aber du sollst die Rekursion gar nicht auf eine Ebene begrenzen:

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
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 30. Mär 2006, 19:16
Zitat von marabu:
@Dennis: alles richtig, aber du sollst die Rekursion gar nicht auf eine Ebene begrenzen:

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;
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#9

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 31. Mär 2006, 09:01
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Herausfinden wie viele Panels auf einen Panel liegen

  Alt 31. Mär 2006, 09:39
useEdit und useDelete sind vom Typ TObject und ein TObject hat keine Breite...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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