TLabel maximaler Font größe Berechnen, gelöst

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TLabel maximaler Font größe Berechnen, gelöst

Beitrag von corpsman »

Servus zusammen,
ich bastle hier gerade eine Anwendung in der ich auf einem TLabel einen Text maximal groß anzeigen lassen möchte,
Dazu habe ich beim TLabel das Autosize weg genommen und dann das Label so groß gemacht wie es auf meiner Anwendung eben sein soll.

Der Nachfolgende Code funktioniert, ist aber super langsam, kennt da jemand einen Besseren Weg ?

Code: Alles auswählen

Procedure TForm1.FormResize(Sender: TObject);
Var
  maxwSize: integer;
Begin
  label1.Font.Size := 1;
  While Label1.Canvas.TextWidth('75') < label1.Width Do Begin
    label1.Font.Size := label1.Font.Size + 1;
  End;
  maxwSize := label1.Font.Size - 1;
  label1.Font.Size := 1;
  While Label1.Canvas.TextHeight('75') < label1.Height Do Begin
    label1.Font.Size := label1.Font.Size + 1;
  End;
  label1.Font.Size := min(label1.Font.Size - 1, maxwSize);
  label1.Invalidate;
End; 
Zuletzt geändert von corpsman am Di 28. Jan 2025, 06:56, insgesamt 1-mal geändert.
--
Just try it

paweld
Beiträge: 85
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: TLabel maximaler Font größe Berechnen

Beitrag von paweld »

etwa so:

Code: Alles auswählen

uses
  Types, Math;

procedure TForm1.FormResize(Sender: TObject);
var
  fsw, fsh: Integer;  //font sizes
  ts: TSize;  //text size for font size 10
begin
  Label1.Font.Size := 10;
  ts := Label1.Canvas.TextExtent(Label1.Caption);
  fsw := 10 + trunc((Label1.Width - ts.Width) * 72 * (ts.Height / ts.Width) / Screen.PixelsPerInch);
  fsh := 10 + trunc((Label1.Height - ts.Height) * 72 / Screen.PixelsPerInch);
  Label1.Font.Size := Min(fsw, fsh);
  ts := Label1.Canvas.TextExtent(Label1.Caption);
  while (Label1.Font.Size > 0) and ((ts.Width > Label1.Width) or (ts.Height > Label1.Height)) do
  begin
    Label1.Font.Size := Label1.Font.Size - 1;
    ts := Label1.Canvas.TextExtent(Label1.Caption);
  end;
end;            
Grüße / Pozdrawiam
paweld

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabel maximaler Font größe Berechnen

Beitrag von wp_xyz »

Hast du schon mal das OptimalFill eines Labels ausprobiert? https://dsiders.gitlab.io/lazdocsnext/l ... lfill.html

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TLabel maximaler Font größe Berechnen

Beitrag von af0815 »

wp_xyz hat geschrieben: Mo 27. Jan 2025, 17:52 Hast du schon mal das OptimalFill eines Labels ausprobiert? https://dsiders.gitlab.io/lazdocsnext/l ... lfill.html
Das dürfte Lazarus main (vormals trunk) sein = daher Lazarus 4.99. Oder gibt es das schon länger ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabel maximaler Font größe Berechnen

Beitrag von wp_xyz »

Nein, das gibt es schon ewig, mein ältester Lazarus auf meiner Platte ist 1.4.4 und da ist es schon vorhanden.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TLabel maximaler Font größe Berechnen

Beitrag von fliegermichl »

Ha, das kannte ich auch noch nicht.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TLabel maximaler Font größe Berechnen

Beitrag von Mathias »

Ich habe es probiert.
Wen man im Opbjectinspector OptimalFill auf True stellt, und die Grösse des LAbels mit der Maus ändert, wird die Schriftgrösse angepasst.
Da habe ich mall versucht Align vom Label auf alClient zu stellen. Da wird die Grösse der Schrift nicht angepasst.

Ist dies so gewollt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabel maximaler Font größe Berechnen

Beitrag von wp_xyz »

Weiß nicht. Wahrscheinlich: unvermeidbar, weil die ganze Größenänderung der Controls sehr kompliziert ist und da hat man wahrscheinlich darauf verzichtet, sich wegen eines wenig benutzen Features einen Haufen anderer Schwierigkeiten aufzuhalsen. Ich weiß, dass es zum OptimalFill einige Bug-Reports gibt, aber ich habe das nicht weiter verfolgt.

Per Code geht es dann trotzdem:

Code: Alles auswählen

procedure TForm1.FormResize(Sender: TObject);
begin
  Label1.Height := ClientHeight;  // Label1 hat OptimalFill=true und Align=alNone
  Label1.Width := ClientWidth;
end; 

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TLabel maximaler Font größe Berechnen

Beitrag von corpsman »

*g*, cool optimal Fill kannte ich noch nicht
Mein Label ist mittels anchors an das Form gekettet, ich schau mal ob es damit geht. Evtl gibt es ja eine Methode die man Triggern kann damit sich das Label neu "berechnet" ;)
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TLabel maximaler Font größe Berechnen

Beitrag von corpsman »

Also hab nu ne Variante gefunden die funktioniert:

Code: Alles auswählen

Procedure TForm1.FormResize(Sender: TObject);
Begin
  label1.OptimalFill := false;
  Application.ProcessMessages;
  label1.OptimalFill := true;
End;
Danke.
--
Just try it

Antworten