ich bin dabei, einen erweiterten Nachkommen von TCustomEdit zu entwickeln. Unter anderem soll dieses Edit-Feld die Möglichkeit bieten, sich während der Eingabe in der Breite anzupassen.
Für die Berechnung der Breite verwende ich ein "TControlCanvas" und die Funktion "TextWidth".
Textwidth gibt immer zu kleine Werte aus. Z.B. bei Schriftgröße 20 wird "aaaaaaaaaa" mit Breite 110 Pixel ausgegeben. Tatsächlich belegen diese 10 a's aber 135Pixel (default Font, ich glaube das ist Arial (?)).
Ist das ein Bug in ... ja, in was denn ?
Hier sind dies Methoden, mit denen die Breitenanpassung erfolgt:
Code: Alles auswählen
procedure TTSCustomEdit.TextChanged;
var
P, S: TPoint;
begin
if fAutoSizeWidth then
begin
P := CaretPos;
inherited TextChanged;
AutoSetWidth;
S.X := 0; S.Y := 0;
CaretPos := S;
CaretPos := P;
end
else
inherited TextChanged;
end;
procedure TTSCustomEdit.AutoSetWidth;
begin
InvalidatePreferredSize;
AdjustSize;
end;
procedure TTSCustomEdit.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
begin
inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace);
PreferredWidth := CalcAutoWidth; //wird von TCustomEdit =0 gesetzt
end;
function TTSCustomEdit.CalcAutoWidth: Integer;
begin
HelperCanvas.Control := Self;
HelperCanvas.Font := Self.Font;
Result := HelperCanvas.TextWidth(Self.Text);
if BorderStyle = bsSingle then
inc(Result, 6)
end;
oops: ich vergaß: HelperCanvas muss natürlich erzeugt werden. Das passiert bei mir im initialization-Teil der Unit:
Code: Alles auswählen
initialization
HelperCanvas := TControlCanvas.Create;
finalization
FreeAndNil(HelperCanvas);