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:
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;
Variante 2:
Delphi-Quellcode:
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;
In beiden Varianten ist der Rückgabewert der Funktion immer um den Wert 4 kleiner als die Länge des Labels auf dem Formular.
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?