Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Panel an Content automatisch anpassen Delphi(Firemonkey) (https://www.delphipraxis.net/190153-panel-content-automatisch-anpassen-delphi-firemonkey.html)

Loko789 5. Sep 2016 11:01

Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo an alle,

Ich nutze Delphi XE8 Firemonkey dort habe ich ein sidemenue was in 2 bereiche aufgetilt ist. Habe als Demonstrationszwecke eine test-form angelegt die es besser zeigt.
Auf den 2 fabig markierten Panels liegen labels drauf die autosize und wordWrap haben(Align ist auf TOP gestellt). Der Text der in den Labels drin stehen kann ist unterschiedlich. Manchmal 2 Zeilen oder auch 4 Zeilen. Daraufhin sich die panels mit der höhe anpassen (wie bei den Labels). Diese funtion habe ich nicht gefunden. Wie kann man so etwas realisieren? Das sich das Panel dynamisch an den content anpasst?
Anhang 45771

Gruß
Loko

himitsu 5. Sep 2016 11:17

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
AutoSize beim Panel seh ich auch garde nicht, aber eventuell schaust du dir mal TGridLayout und TGridPanelLayout an?

Loko789 5. Sep 2016 11:25

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Zitat:

Zitat von himitsu (Beitrag 1346793)
AutoSize beim Panel seh ich auch garde nicht, aber eventuell schaust du dir mal TGridLayout und TGridPanelLayout an?


Hallo,

danke für den Tipp.
Dort past sich das panel dem Layout an aber ich suche etwas was sich am content orientiert und sich nach der größe des contents anpasst.

Edit: So wie bei einem TLabel. Das wird auch von der größe höher sobalt der Text umbricht.
Bzw. wie ein Div Kontainer in HTML

Loko789 5. Sep 2016 14:18

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Kann mir jemand weiterhelfen?:?::?:

dGeek 6. Sep 2016 01:10

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Das hier ist nur eine Idee... schlagt mich nicht dafür

Delphi-Quellcode:
procedure setPanelHeight(var aPanel: TPanel; var aLabel: TLabel);
var
 iDiff: Integer;
begin
 iDiff := aLabel.Height - aPanel.Height;

 if iDiff > 0 then
  aPanel.Height := aPanel.Height + iDiff;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore';

 setPanelHeight(Panel1, Label1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Label1.Caption := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.';

 setPanelHeight(Panel1, Label1);
end;

Loko789 6. Sep 2016 08:12

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Habe versucht es so dynamisch wie möglich zu lösen.

Delphi-Quellcode:
  procedure TForm1.Button2Click(Sender: TObject);
    var
      I: Integer;
      name: String;
      summe: Single;
    begin
      summe := 0;
      for I := 1 to panel2.ChildrenCount - 1 do
      begin
        name := panel2.Children.Items[I].name;
        try
          with Tlabel(FindComponent(name)) do
          begin
            summe := summe + Height;
            summe := summe + Margins.Top;
          end;
        except
        end;
      end;
      panel2.Height := summe
    end;

Der schöne Günther 6. Sep 2016 08:31

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich kenne in FireMonkey für so etwas triviales und selbstverständliches leider auch nichts. Anscheinend muss man sich das selber zusammenzimmern.

Ich würde es so machen (Video im Anhang):

Delphi-Quellcode:
   TControlHelper = class helper for FMX.Controls.TControl
      procedure makeAutoSize();
   end;

procedure TForm9.Button1Click(Sender: TObject);
begin
   ColorBox1.Height := 50.0;
   ColorBox2.Height := 50.0;
   Panel1.makeAutoSize();
end;

procedure TForm9.Button2Click(Sender: TObject);
begin
   ColorBox1.Height := 200.0;
   ColorBox2.Height := 200.0;
   Panel1.makeAutoSize();
end;

procedure TControlHelper.makeAutoSize();
var
   childIndex:   Integer;
   asControl:   TControl;
   totalRect:   TRectF;
begin
   totalRect := TRectF.Empty();

   for childIndex := 0 to Pred(ChildrenCount) do begin
      asControl := Children[childIndex] as TControl;
      if not Assigned(asControl) then Continue;

      if asControl.Stored then
         totalRect.Union(asControl.BoundsRect);
   end;

   Width := totalRect.Width + Padding.Right;
   Height := totalRect.Height + Padding.Bottom;
end;
Nicht sicher bin ich mir beim Ausschluss von Controls welche nicht "Stored = True" haben. Bei einem Panel beispielsweise findet man ein
Delphi-Quellcode:
TRectangle
als erstes Child-Element. Deswegen hast du bei dir wahrscheinlich auch bei 1 angefangen zu zählen und nicht bei Null. Wer weiß was in der nächsten FireMonkey-Version geändert wird, da sind es dann z.B. zwei Rectangles. Oder keines. Oder ganz andere Dinge. Ich hoffe nur dass diese unsichtbaren Hilfsobjekte dann weiterhin "Stored = False" haben werden...

Loko789 6. Sep 2016 09:19

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1346910)
Ich kenne in FireMonkey für so etwas triviales und selbstverständliches leider auch nichts. Anscheinend muss man sich das selber zusammenzimmern.

Ich würde es so machen (Video im Anhang):

Delphi-Quellcode:
   TControlHelper = class helper for FMX.Controls.TControl
      procedure makeAutoSize();
   end;

procedure TForm9.Button1Click(Sender: TObject);
begin
   ColorBox1.Height := 50.0;
   ColorBox2.Height := 50.0;
   Panel1.makeAutoSize();
end;

procedure TForm9.Button2Click(Sender: TObject);
begin
   ColorBox1.Height := 200.0;
   ColorBox2.Height := 200.0;
   Panel1.makeAutoSize();
end;

procedure TControlHelper.makeAutoSize();
var
   childIndex:   Integer;
   asControl:   TControl;
   totalRect:   TRectF;
begin
   totalRect := TRectF.Empty();

   for childIndex := 0 to Pred(ChildrenCount) do begin
      asControl := Children[childIndex] as TControl;
      if not Assigned(asControl) then Continue;

      if asControl.Stored then
         totalRect.Union(asControl.BoundsRect);
   end;

   Width := totalRect.Width + Padding.Right;
   Height := totalRect.Height + Padding.Bottom;
end;
Nicht sicher bin ich mir beim Ausschluss von Controls welche nicht "Stored = True" haben. Bei einem Panel beispielsweise findet man ein
Delphi-Quellcode:
TRectangle
als erstes Child-Element. Deswegen hast du bei dir wahrscheinlich auch bei 1 angefangen zu zählen und nicht bei Null. Wer weiß was in der nächsten FireMonkey-Version geändert wird, da sind es dann z.B. zwei Rectangles. Oder keines. Oder ganz andere Dinge. Ich hoffe nur dass diese unsichtbaren Hilfsobjekte dann weiterhin "Stored = False" haben werden...

Hallo Günther,

Vielen dank dafür :mrgreen::thumb:
Das hat mir sehr weitergeholfen. Ich finde es auch sehr komisch, dass so eine funktion nicht existiert. Habe auch Kolegen gefragt aber sie waren ebenfals ahnungslos.

himitsu 6. Sep 2016 10:40

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
In der VCL gab es dafür das AutoSize, an vielen Komponenten, welches die Komponente an ihren Inhalt anpasst, was man im FMX wohl "vergessen" hat. (dafür vergaß man viele der neuen Layout-Komponenten auch für die VCL zu implementieren :cry:)

Man wird doch bestimmt auch über das VisualLiveBinding was reinhacken können (an die Label.Caption/Text oder Label.Height gehängt und mit Panel.Height verknubbln)
Aber als Event selbst implementiert wird bestimmt netter sein.

Der schöne Günther 6. Sep 2016 10:41

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)
 
Für jeden speziellen Fall da irgendwelche Pfeile zu ziehen und das jedes mal anzupassen wenn sich am Inhalt etwas ändert ist aber wahrscheinlich keine so tolle Idee.


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