Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   FMX - TLabel automatische Höhenanpassung (https://www.delphipraxis.net/188294-fmx-tlabel-automatische-hoehenanpassung.html)

DeddyH 17. Feb 2016 12:50

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:
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;
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?

Danke im Voraus.

Uwe Raabe 17. Feb 2016 13:02

AW: FMX - TLabel automatische Höhenanpassung
 
Kann ich jetzt gerade nicht nachvollziehen, aber sollte man die
Delphi-Quellcode:
Margins.Height
nicht zweimal berücksichtigen? Und bei
Delphi-Quellcode:
LayOut.MaxSize
nicht auch die Breite?

Darlo 17. Feb 2016 13:03

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.

DeddyH 17. Feb 2016 13:07

AW: FMX - TLabel automatische Höhenanpassung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1330644)
Kann ich jetzt gerade nicht nachvollziehen, aber sollte man die
Delphi-Quellcode:
Margins.Height
nicht zweimal berücksichtigen? Und bei
Delphi-Quellcode:
LayOut.MaxSize
nicht auch die Breite?

Ergibt sich Margins.Height nicht aus Bottom und Top? Wenn nicht, habe ich das wohl fehlinterpretiert. Und die MaxSize soll eigentlich die aktuelle Breite sein, deshalb AbsoluteRect.Width. Ich bin verwirrt.

Uwe Raabe 17. Feb 2016 16:10

AW: FMX - TLabel automatische Höhenanpassung
 
Zitat:

Zitat von DeddyH (Beitrag 1330646)
Zitat:

Zitat von Uwe Raabe (Beitrag 1330644)
Kann ich jetzt gerade nicht nachvollziehen, aber sollte man die
Delphi-Quellcode:
Margins.Height
nicht zweimal berücksichtigen? Und bei
Delphi-Quellcode:
LayOut.MaxSize
nicht auch die Breite?

Ergibt sich Margins.Height nicht aus Bottom und Top? Wenn nicht, habe ich das wohl fehlinterpretiert. Und die MaxSize soll eigentlich die aktuelle Breite sein, deshalb AbsoluteRect.Width. Ich bin verwirrt.

Moment mal -
Delphi-Quellcode:
Margins
gibt doch den Abstand zwischen zwei Controls im selben Container an, wirkt also nur außerhalb der Größe des Labels, während
Delphi-Quellcode:
Padding
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
Delphi-Quellcode:
Margins
nicht berücksichtigt werden.

Kurios: Bei
Delphi-Quellcode:
Margins.Height
wird witzigerweise
Delphi-Quellcode:
Bottom - Top
zurückgegeben, da hier schlicht das darunterliegende
Delphi-Quellcode:
TRectF.Height
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.

Kurioser: Diese Eigenschaften werden in FMX tatsächlich verwendet:
Delphi-Quellcode:
          StyleControl.SetBounds(StyleControl.Margins.Left, StyleControl.Margins.Top,
            Width - StyleControl.Margins.Width, Height - StyleControl.Margins.Height);
Das führt jetzt dazu, daß das
Delphi-Quellcode:
SetBounds
in der Breite
Delphi-Quellcode:
Width - Margins.Right + Margins.Left
und in der Höhe
Delphi-Quellcode:
Height - Margins.Bottom + Margins.Top
verwendet. Ich hätte jetzt
Delphi-Quellcode:
Width - Margins.Left - Margins.Right
und
Delphi-Quellcode:
Height - Margins.Bottom - Margins.Top
erwartet. Entweder steh' ich jetzt auf dem Schlauch oder das ist ein ganz böser Bug :gruebel:

DeddyH 17. Feb 2016 16:16

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.

bra 17. Feb 2016 17:47

AW: FMX - TLabel automatische Höhenanpassung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1330671)
Kurioser: Diese Eigenschaften werden in FMX tatsächlich verwendet:
Delphi-Quellcode:
          StyleControl.SetBounds(StyleControl.Margins.Left, StyleControl.Margins.Top,
            Width - StyleControl.Margins.Width, Height - StyleControl.Margins.Height);
Das führt jetzt dazu, daß das
Delphi-Quellcode:
SetBounds
in der Breite
Delphi-Quellcode:
Width - Margins.Right + Margins.Left
und in der Höhe
Delphi-Quellcode:
Height - Margins.Bottom + Margins.Top
verwendet. Ich hätte jetzt
Delphi-Quellcode:
Width - Margins.Left - Margins.Right
und
Delphi-Quellcode:
Height - Margins.Bottom - Margins.Top
erwartet. Entweder steh' ich jetzt auf dem Schlauch oder das ist ein ganz böser Bug :gruebel:

Margins sind ja auch der Außenabstand, also gehören theoretisch nicht mit zum Element, während Padding der Innenabstand ist, also der Abstand vom Rand des Elements zum Inhalt.

DeddyH 17. Feb 2016 18:02

AW: FMX - TLabel automatische Höhenanpassung
 
Ja, aber wieso wird dann addiert?

Uwe Raabe 17. Feb 2016 19:41

AW: FMX - TLabel automatische Höhenanpassung
 
Zitat:

Zitat von bra (Beitrag 1330684)
Margins sind ja auch der Außenabstand, also gehören theoretisch nicht mit zum Element, während Padding der Innenabstand ist, also der Abstand vom Rand des Elements zum Inhalt.

Die Verwendung von Margins ist hier schon korrekt, da die Position des (inneren) Style-Elements relativ zu seinem Parent-Control herauskommen soll. An den anderen Stellen in FMX wird auch korrekt mit den Margin-Eigenschaften Left/Right und Top/Bottom gearbeitet. Nur(?) hier wird auf Margins.Width und Margins.Height zugegriffen, die allerdings unsinnige Werte liefern.

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.

bra 18. Feb 2016 09:58

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.
Seite 1 von 2  1 2      

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