![]() |
FMX - TLabel automatische Höhenanpassung
Mahlzeit,
gegeben seien ein TLabel mit Align Top und eine beliebige andere Komponente (z.B. ein Panel oder ein TabControl) mit Align Client. Der Text des Labels wird zur Laufzeit gesetzt. Ich möchte erreichen, dass sich dieses je nach Text und Ausrichtung des Geräts dynamisch in der Höhe anpasst. AutoSize steht auf false, WordWrap auf true, momentan wird zu Testzwecken an verschiedenen Stellen (Events) der folgende Code durchlaufen.
Delphi-Quellcode:
Unter Windows klappt das recht gut, z.B. im OnPainting des Formulars. Unter Android und iOS hingegen stimmt die Höhe überhaupt nicht. Bin ich völlig auf dem Holzweg, oder habe ich etwas übersehen?
procedure TfrmDingens.SetLabelHeight(const ALabel: TLabel);
var Layout: TTextLayout; begin Canvas.BeginScene; try Layout := TTextLayoutManager.DefaultTextLayout.Create(ALabel.Canvas); try Layout.BeginUpdate; try Layout.TopLeft := PointF(0, 0); Layout.MaxSize := PointF(ALabel.AbsoluteRect.Width, MAXINT); Layout.Text := ALabel.Text; Layout.WordWrap := ALabel.TextSettings.WordWrap; Layout.HorizontalAlign := ALabel.TextSettings.HorzAlign; Layout.VerticalAlign := ALabel.TextSettings.VertAlign; Layout.Font.Assign(ALabel.TextSettings.Font); Layout.RightToLeft := false; finally Layout.EndUpdate; ALabel.Size.Height := ALabel.Margins.Height + Layout.TextRect.Height; end; finally Layout.Free; end; finally Canvas.EndScene; end; end; Danke im Voraus. |
AW: FMX - TLabel automatische Höhenanpassung
Kann ich jetzt gerade nicht nachvollziehen, aber sollte man die
Delphi-Quellcode:
nicht zweimal berücksichtigen? Und bei
Margins.Height
Delphi-Quellcode:
nicht auch die Breite?
LayOut.MaxSize
|
AW: FMX - TLabel automatische Höhenanpassung
Hi,
hatte das selbe Problem und bin dann auf Memos umgestiegen. Über Memo.Lines.Count kann man dann entsprechend der Schriftgröße die benötigte Höhe ermitteln. |
AW: FMX - TLabel automatische Höhenanpassung
Zitat:
|
AW: FMX - TLabel automatische Höhenanpassung
Zitat:
Delphi-Quellcode:
gibt doch den Abstand zwischen zwei Controls im selben Container an, wirkt also nur außerhalb der Größe des Labels, während
Margins
Delphi-Quellcode:
den Abstand zu den inneren Elementen angibt, sich aber nicht auf den Abstand des Texts zum Labelrand auswirkt. Insofern ist die Angabe der Breite wohl korrekt, aber bei der Höhe dürfte
Padding
Delphi-Quellcode:
nicht berücksichtigt werden.
Margins
Kurios: Bei
Delphi-Quellcode:
wird witzigerweise
Margins.Height
Delphi-Quellcode:
zurückgegeben, da hier schlicht das darunterliegende
Bottom - Top
Delphi-Quellcode:
befragt wird (wer nimmt denn auch ein Rechteck als Speicher für die Ränder :roll:). Eigentlich macht diese Angabe aber bei Rändern keinen Sinn.
TRectF.Height
Kurioser: Diese Eigenschaften werden in FMX tatsächlich verwendet:
Delphi-Quellcode:
Das führt jetzt dazu, daß das
StyleControl.SetBounds(StyleControl.Margins.Left, StyleControl.Margins.Top,
Width - StyleControl.Margins.Width, Height - StyleControl.Margins.Height);
Delphi-Quellcode:
in der Breite
SetBounds
Delphi-Quellcode:
und in der Höhe
Width - Margins.Right + Margins.Left
Delphi-Quellcode:
verwendet. Ich hätte jetzt
Height - Margins.Bottom + Margins.Top
Delphi-Quellcode:
und
Width - Margins.Left - Margins.Right
Delphi-Quellcode:
erwartet. Entweder steh' ich jetzt auf dem Schlauch oder das ist ein ganz böser Bug :gruebel:
Height - Margins.Bottom - Margins.Top
|
AW: FMX - TLabel automatische Höhenanpassung
o.O, irgendwo habe ich etwas von "Plattform der Zukunft" gelesen. Vielleicht sollte ich mich mal nach einem DeLorean mit funktionstüchtigem Flux-Kompensator umschauen :mrgreen:. Zwischenzeitlich habe ich auch ein wenig herumexperimentiert und z.B. herausgefunden, dass es noch schlimmer wird, wenn man den Text vertikal zentriert definiert hat (inwiefern sich die vertikale Ausrichtung auf die benötigte Höhe auswirken soll, will mir nicht ganz in den Kopf). Naja, erst einmal Danke für Deine Mühe, ich quäle mich morgen weiter mit diesen Banalitäten.
|
AW: FMX - TLabel automatische Höhenanpassung
Zitat:
|
AW: FMX - TLabel automatische Höhenanpassung
Ja, aber wieso wird dann addiert?
|
AW: FMX - TLabel automatische Höhenanpassung
Zitat:
Man kann das gerne probieren:
Delphi-Quellcode:
program Project75;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Types, FMX.Types; procedure Main; var margins: TBounds; begin margins := TBounds.Create(TRectF.Empty); try margins.Left := 10; margins.Right := 8; Writeln(margins.Width:1:1); // liefert -2 finally margins.Free; end; end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: FMX - TLabel automatische Höhenanpassung
Ich denke man sollte die Width und Height hier einfach nicht verwenden. Was soll denn die Höhe/Breite eines Außenabstands überhaupt sein? Die Summe der Abstände oder die Größe des umgebenden Rechtecks? Ist beides nicht wirklich einleuchtend.
Dasselbe gilt auch für Padding. Ich habe gesehen, du hast da schon einen Quality-Eintrag erstellt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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