Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Label-Font passend verkleinern (https://www.delphipraxis.net/162763-label-font-passend-verkleinern.html)

hoika 5. Sep 2011 07:17

Label-Font passend verkleinern
 
Hallo #,

ich lade den Inhalt eines Labels aus einer DB.
Auf den Inhalt habe ich fast keinen Einfluss.
Der Text soll aber immer vollständig dargestellt werden.

Die gewünschte Lösung: Font verkleinern, bis es passt.

Delphi-Quellcode:
procedure TForm1.FitQuestionFont;
var
  iMaxLength: Integer;
  iCurLength: Integer;
  iFontSize : Integer;
begin
  Application.ProcessMessages;
  iMaxLength:= Label1.Width;
  iCurLength:= Label1.Canvas.TextWidth(LblQuestion1.Caption);
  if iCurLength>iMaxLength then
  begin
    for iFontSize:= Label1.Font.Size-1 downto 1 do
    begin
      Label1.Font.Size:= iFontSize;
      Application.ProcessMessages;
      iCurLength:= Label1.Canvas.TextWidth(Label1.Caption);
      if iCurLength<=iMaxLength then Break;
    end;
  end;
end;
Das kann man auch noch etwas komprimieren, ich weiss.
Ist aber nicht das Problem.

Problem ist, dass es ohne die Application.ProcessMessages nicht geht
(funktioniert nicht, weil in FormActivate), mit dem A.Pro kann man dem
Label praktisch zusehen, wie es kleiner wird.
Ein Visible False kleppt auch nicht.

Wie bekomme ich das Verkleinern ohne "Zuschauer" hin ?

AutoSize fällt übrigens flach.


Danke


Heiko

DeddyH 5. Sep 2011 07:18

AW: Label-Font passend verkleinern
 
Ein temporärer TCanvas mit demselben Font?

hoika 5. Sep 2011 07:38

AW: Label-Font passend verkleinern
 
Hallo, das klappt nicht.

MyCanvas.TextWidth(LblQuestion1.Caption);

Hier kommt die Meldung Leinwand/Bild erlaubt kein Zeichnen

Egal, hebe ich mir für Version 1.1 auf ...

Danke


Heiko

DeddyH 5. Sep 2011 07:41

AW: Label-Font passend verkleinern
 
Vielleicht klappt es mit MSDN-Library durchsuchenDrawText und DT_CALCRECT?

Medium 5. Sep 2011 08:13

AW: Label-Font passend verkleinern
 
Ein Canvas allein ist auch nichts. TCanvas stellt nur Zeichenmethoden bereit, aber keine eigene Zeichenfläche in dem Sinne von Speicher für Gezeichnetes. (Ja, der Name ist nicht sonderlich gut gewählt...) Mit einem temporären TBitmap sollte das wunderbar klappen.

himitsu 5. Sep 2011 08:31

AW: Label-Font passend verkleinern
 
Wann wird diese Methode aufgerufen?
Etwa noch bevor die Form (das Parent) sichtbar sind?

Ein TLabel hat kein eigenes Canvas. Es zeichnet sich auf dem Canvas seines Parents. (z.B. die Form oder ein Panel)

Und bezüglich dem ProcessMessages: Es ist so optimiert, daß es sich erst neu zeichnet, wenn der Parent das nächste mal neu gezeichnet wird und da wird vermutlich auch erst der neue Font kurzzeitig zugewiesen, wärend des Zeichnens.
Außerhalb des Zeichnens ist dem Canvas meistens den Font des Parents zugewiesen :wink:

PS: Delphi-Referenz durchsuchenTStaticText ist das "echte" Label des Windows (als eigentständiges Control)

TLabel ist optimiert, um weniger GDI-Objekte zu benötigen (vermutlich wegen den Beschränkungen unter Win31/9x) und damit es schneller ist.

freejay 7. Sep 2011 14:03

AW: Label-Font passend verkleinern
 
Warum setzt Du denn den Text nicht einfach erst ein, wenn Du die Font-Größe schon berechnet hast?

Einem leeren Label kann man schließlich nicht "zusehen"... ;-)


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