![]() |
Editcontrol
Hallo,
ich programmiere mir ein neue Edit - Control. Dieses habe ich von TCustomEdit abgeleitet und den Borderstyle auf none und die Ctl3D eigenschaft auf False gestellt um ein planes control zu bekommen. Leider wird jetzt der Text im Control an die obere linke Ecke geheftet. Kann mir jemand sagen wie ich das Control davon überzeugen kann, das dieser Text wieder mehr mittig ausgerichtet wird? Gibts da ne möglichkeit, wo ich die genaue Position von dem Text ausgeben kann? Mfg Matthias |
Re: Editcontrol
Hallo,
wenn Du in die VCL-Sourcen schaust liegt meines erachtens das Problem in UpdateHeight und AdjustHeight. Das Problem liegt hier zu einem hier:
Code:
Es wird nur AdjustHeigth aufgerufen wenn BorderStyle=bsSingle ist.
if FAutoSize{ and (BorderStyle = bsSingle)} then
begin ControlStyle := ControlStyle + [csFixedHeight]; AdjustHeight; end else ControlStyle := ControlStyle - [csFixedHeight]; Zum anderen liegt noch ein Problem in AdjustHeight:
Code:
I:=6 wenn Ctl§d=False. 6 ist zuviel wenn BorderStyle auf bsNone steht besser wäre 2.
if NewStyleControls then
begin if Ctl3D then I := 8 else I := 6; I := GetSystemMetrics(SM_CYBORDER) * I; end else Die beiden Methoden sind leider private. So kannst Du Sie nicht überschreiben. Wenn Du jedoch die die VCL-Sourcen Datei StdCtrls.pas mit in das Verzeichnis Deiner Komponente kopierst kannst Du die Änderungen direkt in der Datei machen. Das hat aber folgenden Haken -> Du kannstDeine Komponente nicht mit Sourcen weitergeben. Wg Lizenzbestimmungen und so. Du müsstest auch die geänderte StdCtrls.pas weitergeben. Das ist verboten. Wenn Dir das aber egal ist, kannst Du die beiden Methoden wie folgt abändern
Delphi-Quellcode:
Du könnest auch die Höhe der Komponente verkleinern, dann ist der Text auch in der Mitte. Dann ist die Höhe aber Fix. D.h. bei einer Font Änderung wird die Höhe nicht angepasst.
procedure TCustomEdit.UpdateHeight;
begin if FAutoSize{ and (BorderStyle = bsSingle)} then //einmal hier begin ControlStyle := ControlStyle + [csFixedHeight]; AdjustHeight; end else ControlStyle := ControlStyle - [csFixedHeight]; end; procedure TCustomEdit.AdjustHeight; var DC: HDC; SaveFont: HFont; I: Integer; SysMetrics, Metrics: TTextMetric; begin DC := GetDC(0); GetTextMetrics(DC, SysMetrics); SaveFont := SelectObject(DC, Font.Handle); GetTextMetrics(DC, Metrics); SelectObject(DC, SaveFont); ReleaseDC(0, DC); if NewStyleControls then begin if Ctl3D then I := 8 else I := 6; If BorderStyle=bsNone then // und einmal hier I:=2; I := GetSystemMetrics(SM_CYBORDER) * I; end else begin I := SysMetrics.tmHeight; if I > Metrics.tmHeight then I := Metrics.tmHeight; I := I div 4 + GetSystemMetrics(SM_CYBORDER) * 4; end; Height := Metrics.tmHeight + I; end; |
Re: Editcontrol
Tja, da gibts noch ne andere Möglichkeit: Ich programmiere meinen Eigenen CustomEdit :mrgreen:
Mfg Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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