AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Panel an Content automatisch anpassen Delphi(Firemonkey)
Thema durchsuchen
Ansicht
Themen-Optionen

Panel an Content automatisch anpassen Delphi(Firemonkey)

Ein Thema von Loko789 · begonnen am 5. Sep 2016 · letzter Beitrag vom 6. Sep 2016
Antwort Antwort
Loko789

Registriert seit: 23. Sep 2015
74 Beiträge
 
#1

Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 5. Sep 2016, 12:01
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?
bild.png

Gruß
Loko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 5. Sep 2016, 12:17
AutoSize beim Panel seh ich auch garde nicht, aber eventuell schaust du dir mal TGridLayout und TGridPanelLayout an?
$2B or not $2B
  Mit Zitat antworten Zitat
Loko789

Registriert seit: 23. Sep 2015
74 Beiträge
 
#3

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 5. Sep 2016, 12:25
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

Geändert von Loko789 ( 5. Sep 2016 um 12:50 Uhr)
  Mit Zitat antworten Zitat
Loko789

Registriert seit: 23. Sep 2015
74 Beiträge
 
#4

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 5. Sep 2016, 15:18
Kann mir jemand weiterhelfen?

Geändert von Loko789 ( 5. Sep 2016 um 15:20 Uhr)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#5

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 02:10
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;
  Mit Zitat antworten Zitat
Loko789

Registriert seit: 23. Sep 2015
74 Beiträge
 
#6

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 09:12
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;

Geändert von Loko789 ( 6. Sep 2016 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 09:31
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 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...
Angehängte Dateien
Dateityp: zip 2016-09-06_09-22-50.zip (24,0 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Loko789

Registriert seit: 23. Sep 2015
74 Beiträge
 
#8

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 10:19
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 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
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 11:40
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 )

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Panel an Content automatisch anpassen Delphi(Firemonkey)

  Alt 6. Sep 2016, 11:41
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.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 18:31 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