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 TCategoryPanel einklappen/ausklappen Align-Ausrichtung (https://www.delphipraxis.net/168928-tcategorypanel-einklappen-ausklappen-align-ausrichtung.html)

AJ_Oldendorf 19. Jun 2012 11:25

TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Hallo zusammen,
ich habe eine TCategoryPanelGroup welches 3 CategoryPanels enthält.
Das Align ist auf alClient gestellt.
Jetzt würde ich gerne, wenn man in der Anwendung das erste CategoryPanel einklappt, dass sich entweder die beiden übrigen die neu zur Verfügung stehende Height im Formular teilen oder zumindest das letzte CategoryPanel die volle Höhe bekommt. Leider bleiben die CategoryPanels in der Größe, wie sie im Objektinspektor erstellt wurden.
Das drauflegen eines TSplitter bringt leider auch kein Erfolg (->habe versucht dann damit die Height des CategoryPanels anzupassen).
Habt ihr eine Idee?

Bei Windows 7 im Ressourcenmonitor ist das Verhalten ähnlich... Dort ist es mit einem Splitter gelöst, denke ich :-)

Gruß
Alex

Bummi 19. Jun 2012 13:03

AW: TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Delphi-Quellcode:
procedure TForm5.ReMeasureCat;
var
  coll,SplitHeight, I:Integer;
begin
  coll := 0;
  for I := 0 to CategoryPanelGroup1.ControlCount-1 do
    if CategoryPanelGroup1.Controls[i] is TCategoryPanel then
      if TCategoryPanel(CategoryPanelGroup1.Controls[i]).Collapsed then inc(coll);
  if coll<CategoryPanelGroup1.ControlCount then
    begin
      SplitHeight := (CategoryPanelGroup1.Height - coll*30) div (CategoryPanelGroup1.ControlCount-coll);
      for I := 0 to CategoryPanelGroup1.ControlCount-1 do
        if CategoryPanelGroup1.Controls[i] is TCategoryPanel then
          if not TCategoryPanel(CategoryPanelGroup1.Controls[i]).Collapsed then TCategoryPanel(CategoryPanelGroup1.Controls[i]).Height := SplitHeight;
    end;
end;

procedure TForm5.CategoryPanel3Collapse(Sender: TObject);
begin
  ReMeasureCat;
end;

procedure TForm5.CategoryPanel3Expand(Sender: TObject);
begin
  ReMeasureCat;
end;

AJ_Oldendorf 19. Jun 2012 15:22

AW: TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Hallo Bummi,
das geht schonmal ganz gut.
Leider hat es ein kleinen Nachteil.
Angenommen ich habe folgende Height in meinen CategoryPanels:

Height CategoryPanel1 = 298
Height CategoryPanel2 = 238
Height CategoryPanel3 = 198

Wenn ich jetzt einen zuklappe und wieder aufklappe (sodass alle ausgeklappt sind), wird ein Mittelwert in der Height erzeugt und alle CategoryPanels bekommen die gleiche Height.
Dies führt dazu, dass natürlich Sachen abgeschnitten werden z.B. im ersten CategoryPanel.
Mir wäre es glaube ich lieber, wenn immer nur das letzte ausgeklappt CategoryPanel die "restliche" Height bekommt.

Gruß
Alex

Bummi 19. Jun 2012 15:41

AW: TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Tu' Dir keinen Zwang an, schreib es so um wie Du es brauchst ...

AJ_Oldendorf 19. Jun 2012 15:51

AW: TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Deine Denkanstöße bzgl. der Events und der Abfragen helfen mir definitiv weiter und ich werde es mir entsprechend umbauen. Vielleicht braucht den oben genannten Source jemand in dieser Variante.

Viele Grüße
Alex

DualCoreCpu 7. Nov 2019 18:29

AW: TCategoryPanel einklappen/ausklappen Align-Ausrichtung
 
Zitat:

Zitat von Bummi (Beitrag 1171583)
Delphi-Quellcode:
procedure TForm5.ReMeasureCat;
var
  coll,SplitHeight, I:Integer;
begin
  coll := 0;
  for I := 0 to CategoryPanelGroup1.ControlCount-1 do
    if CategoryPanelGroup1.Controls[i] is TCategoryPanel then
      if TCategoryPanel(CategoryPanelGroup1.Controls[i]).Collapsed then inc(coll);
  if coll<CategoryPanelGroup1.ControlCount then
    begin
      SplitHeight := (CategoryPanelGroup1.Height - coll*30) div (CategoryPanelGroup1.ControlCount-coll);
      for I := 0 to CategoryPanelGroup1.ControlCount-1 do
        if CategoryPanelGroup1.Controls[i] is TCategoryPanel then
          if not TCategoryPanel(CategoryPanelGroup1.Controls[i]).Collapsed then TCategoryPanel(CategoryPanelGroup1.Controls[i]).Height := SplitHeight;
    end;
end;

procedure TForm5.CategoryPanel3Collapse(Sender: TObject);
begin
  ReMeasureCat;
end;

procedure TForm5.CategoryPanel3Expand(Sender: TObject);
begin
  ReMeasureCat;
end;

Ausgehend von diesem Entwurf der Methode RemeasureCat habe ich für mich folgende Methode gleichen Namens geschrieben:

Delphi-Quellcode:
procedure TForm2.ReMeasureCat;
var coll,SplitHeight,I: Integer; {neu eingeführte Variablen, am 7.10.2019 um 21:11} h1,h2,h: Integer; {Ende der neuen Variablen}
begin
  for I := 0 to CategoriesLft.ControlCount-1 do
  begin
    (CategoriesLft.Controls[I] as TCategoryPanel).Height := CategoriesLft.Height;
    if I < CategoriesLft.ControlCount-1 then
    begin
      (CategoriesLft.Controls[I] as TCategoryPanel).Height := (CategoriesLft.Controls[I] as TCategoryPanel).Height - (CategoriesLft.Controls[I+1] as TCategoryPanel).Top;
      if I=1 then
      begin
        (CategoriesLft.Controls[I+1] as TCategoryPanel).Height := CategoriesLft.Height - (CategoriesLft.Controls[I+1] as TCategoryPanel).Top;
      end;
    end;
  end;
end;
Ich habe auf einer CategoryPanelGroup Komponente 2 CategoryPanel Kompos, getrennt durch einen horizontalen Splitter.

Ich will nun, dass sich die beiden Panele ihrer Höhe nach alClient ausrichten, also den gesamten freien Platz bis zum Ende der CategoryPanelGroup bzw. bis zum Beginn (Eigenschaft Top) des darauffolgenden CategoryPanels ausfüllen. Ich habe auf meiner CategoryPanelGroup zwei solche Category Panele übereinander, wobei in der Standardeinstellung beide CategoryPanele gleich hoch sind, also hale Höhe der CategorypanelGroup. Wenn ich nun meinen Splitter bewege, passt sich die Höhe des oberen Panels korrekt an, die Höhe des unteren CategoryPanel jedoch nicht. Wenn ich den Spltter zu hoch bewege, schaut die Fläche der CategoryPanelGroup hervor. Ich will aber, dass sich die die Eigenschaft Bottom des unteren Panels auf Bottom der CatogoryPanelgroup setzt.

Leider tut das der obige Code nur für das obere TCategoryPanel, nicht aber für das untere. Was muss ich da anders machen?

[OT]
Sorry für Doppelaccount. Bin User Schöni, konnte mich lange Zeit nicht einloggen, Kennwort vergessen, wollte meinen Account nun wiederherstellen aber DP hat mir auf das vergessene Kennwort den Usernamen cpux86 gegeben, statt schöni. War bisher als DualCoreCpu hier. Muss mich noch entscheiden, mit welchem Account ich zukünftig aktiv sein will.
[/OT]


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