![]() |
Unterschiedliche Textlängen bei Design bzw. Berechnung
Hallo DPler,
ich habe folgendes Phänomen: Wenn ich der Label-Eigenschaft Caption (AutoSize ist True) einen Text zuweise, wird die Länge/Weite des Labels automatisch auf die notwendige Länge für die vollständige Darstellung des Textes gesetzt. Soweit so gut und richtig. Nun habe ich auch eine Funktion (GetTextWidth), in der ich unabhängig von einem Formular die Weite eines übergebenen Textes berechnen möchte. Zur korrekten Berechnung wird auch ein Font-Objekt mit übergeben. Ich habe für die Berechnung zwei Varianten versucht: Variante 1
Delphi-Quellcode:
Variante 2:
function GetTextWidth(const AValue: string; AFont: Font): Integer;
var lCanvas: TCanvas; lRect: TRect; begin {temporäre Zeichenfläche erzeugen und mit AFont initialisieren} try lCanvas := TCanvas.Create; try lCanvas.Handle := GetDC(0); lCanvas.Font := AFont; {Zeichenkette temporär zeichnen und neu berechnen} SetRect(lRect, 0, 0, Screen.Width, Screen.Height); DrawText(lCanvas.Handle, PChar(Trim(AValue)), -1, lRect, DT_CALCRECT or DT_EXPANDTABS or DT_WORDBREAK); finally ReleaseDC(0, lCanvas.Handle); lCanvas.Free; end; except SetRect(lRect, 0, 0, 0, 0); end; Result := lRect.Right; end;
Delphi-Quellcode:
In beiden Varianten ist der Rückgabewert der Funktion immer um den Wert 4 kleiner als die Länge des Labels auf dem Formular.
function GetTextWidth(const AValue: string; AFont: Font): Integer;
var lLabel: TLabel; begin lLabel := TLabel.Create(nil); try lLabel.Font := AFont; lLabel.Caption := AValue; Result := lLabel.Width; finally lLabel.Free; end; end; Dies ist natürlich unschön, wenn ich auf Grund dieser Berechnung zur Laufzeit z.B. die Größe eines Formulars setzen möchte und nach der Zuweisung des Textes an ein ebenfalls erst zur Laufzeit erzeugtes Label dieses dann aber tatsächlich länger ist und dann näher am rechten Formularrand ist als geplant. Warum ist das Ergebnis der Berechnung der Textlänge mit einer der beiden Varianten also nicht identisch zur der im Designer? |
AW: Unterschiedliche Textlängen bei Design bzw. Berechnung
ich verwende
Delphi-Quellcode:
, also im Prinzip Deine erste Funktion soweit reduzieren, dass nach der Font Zuweisung nur noch Canvas.TextWith aufgerufen wird.
Canvas.TextWidth
Delphi-Quellcode:
Sehe aber gerade, es kommt der gleiche Wert heraus, wie in Deiner ersten Funktion, also wohl auch abweichend. Wobei bei Label.Width wohl von Haus aus ein Rand mit eingerechnet wird? (Habe hier leider nicht den VCL-Source parat)
function GetTextWidth2(const AValue: string; AFont: TFont): Integer;
var lCanvas: TCanvas; begin try lCanvas := TCanvas.Create; try lCanvas.Handle := GetDC(0); lCanvas.Font := AFont; Result := lCanvas.TextWidth(AValue); finally ReleaseDC(0, lCanvas.Handle); lCanvas.Free; end; except Result := 0; end; end; |
AW: Unterschiedliche Textlängen bei Design bzw. Berechnung
Hallo Satty67,
dein Hinweis Zitat:
Auf dem Formular hatte ich ein TcxLabel (Developer Express) verwendet und dieses hat einen feststehenden Rand von 4 Pixeln. Meine Berechnungsfunktion ist also in beiden Varianten korrekt und ich muss nur beachten, welche Komponente ich weiter verwende. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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