Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ComponentCount (https://www.delphipraxis.net/118872-componentcount.html)

XXcD 16. Aug 2008 22:13


ComponentCount
 
Hallo,
ich habe gerade ein ganz winziges Problem.

So eine Frage habe ich schonmal gestellt und dann hat auch alles funktioniert, aber hier weiß ich einfach nicht weiter.

Ich habe zwei Panels in einer Scrollbox.
Wenn ich jetzt
Delphi-Quellcode:
Scrollbox1.ComponentCount
ausführe bekomme ich 0 zurück.
Eigentlich müsste dort ja 2 stehen.

Meine Struktur sieht so aus:

Code:
+Form2
|-Panel2
  |-PageControl1
    |-TabSheet1
      |-Scrollbox1
Woran könnte das liegen?

mkinzler 16. Aug 2008 22:28

Re: ComponentCount
 
Ist die ScrollBox auch der Owner oder nur der Parent?

omata 16. Aug 2008 22:33

Re: ComponentCount
 
Zur Designzeit wird scheinbar nur der Parent gesetzt, der Owner der Panels ist nicht die Scrollbox. Dies kannst du nur hinbekommen, wenn du die Elemente in der Scrollbox zur Laufzeit erstellst und richtig zuweist.

mkinzler 16. Aug 2008 22:35

Re: ComponentCount
 
Owner ist bei Erzeugung durch den Formulardesigner immer das Formular

omata 16. Aug 2008 22:40

Re: ComponentCount
 
Oder du sammelst dir die Elemente selber zusammen...
Delphi-Quellcode:
type
  TResult = array of TObject;

:
:

function TForm1.GetScrollboxElemente(Scrollbox: TScrollbox): TResult;
var i:integer;
    Component:TComponent;
begin
  setlength(Result, 0);
  for i:=1 to Self.ComponentCount do begin
    Component:=Self.Components[i-1];
    if Component is TWinControl then
      if (Component as TWinControl).Parent = Scrollbox then begin
        setlength(Result, length(Result)+1);
        Result[high(Result)]:=Component;
      end;
  end;
end;

XXcD 16. Aug 2008 22:54

Re: ComponentCount
 
Ahh ich hab jetzt hier was rausgefunden:
http://www.delphi-forum.de/topic_Pro...ee302ef5cc7cbf

Ich muss nicht ComponentCount sondern ControlCount nehmen.

Mich würde jetzt noch interessieren, warum das jetzt nicht mehr mit Componentcount funktioniert?

Ich bin mir zu 100% sicher, dass das mal funktioniert hat.
Und zwar so:

Delphi-Quellcode:
procedure TForm1.GetObjectByName(Sender: TObject);
  var
      i: Integer;
  begin
      for i := ScrollBox1.ComponentCount - 1 downto 0 do
      begin
            if Scrollbox1.Components[i] is TPanel then
      if TPanel(Scrollbox1.Components[i]).Name = (Sender as TPanel).Parent.Name then begin
      if TPanel(Scrollbox1.Components[i]).AutoSize = false then begin
        TPanel(Scrollbox1.Components[i]).AutoSize:=true;
      end
      else
      begin
        TPanel(Scrollbox1.Components[i]).AutoSize:=false;
       TPanel(Scrollbox1.Components[i]).Height:=17;
      end;
      end;
      end;
  end;

mkinzler 16. Aug 2008 22:55

Re: ComponentCount
 
Bei WinControls gibt es nur den Owner

sx2008 16. Aug 2008 23:22

Re: ComponentCount
 
Es gibt Components[] und Controls[] und jeweils dazugehörend ComponentCount und ControlCount.
Beide Arrays bilden einen Baum ab bei dem das Formular an der Spitze (oder an der Wurzel, je nach Sichtweise) steht.

Das Components[]-Array spiegelt die Besitzverhältnisse wieder.
Fast alle Komponenten gehören dem Formular.
Bei einer TTable oder TQuery gehören die TField-Objekte zum Beispiel dem TTable oder TField-Objekt.

Dagegen spiegelt das Controls[]-Array die visuellen Verhältnisse.
Es wird genau der Baum abgebildet, den du in deinem 1. Beitrag gezeigt hast.
Jeder Versuch, diesem Baum irgendwie auf Components[] zurückzuführen ist sinnlos.
Richtig ist, Controls[] und ControlCount zu verwenden.

XXcD 17. Aug 2008 00:48

Re: ComponentCount
 
Ok, dann weiß ich jetzt wieder mehr :-D
Dann bedanke ich mich vielmals.
Aber trotzdem komisch, dass das mit ComponentCount vor einiger Zeit mal bei mir funktioniert hat.


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