Ich habe eine von TButton abgeleitete Komponente, die ich mit weiteren Win
SDK Featurs ergänzt habe, die von der Delphi Implementation nicht unterstützt werden. Dazu habe ich zwei neue Properties ergänzt und entsprechend die System Flags gesetzt. Das Problem ist nun, dass diese nicht mehr funktionieren, sobald ein Delphi Style aktiviert wurde.
Die neuen Properties sind:
TextAlign: TrfTextAlign
Dieses Property steuert wie der Text im Button platziert wird. Dazu werden die entsprechenden System Styles (BS_xxx) gesetzt. Das Probem ist nun, dass diese beim Einsatz von Delphi Styles nicht richtig ausgewertet werden und der Text immer Links vertikal zentriert angezeigt wird. Das Probelm ist, dass BS_CENTER ($300) auch BS_LEFT ($100) enhält (?) und die Abfrage (TextStyle AND BS_LEFT) = BS_LEFT auch bei BS_CENTER gilt. Daher sollte da zuerst nach BS_CENTER abgefragt werden und erst danach nach BS_LEFT. Auch wird im TButton StyleHook das TextFlag immer auf DT_VCENTER gesetzt und somit die BS_TOP und BS_BOTTOM komplett ignoriert. Das TextFlag sollte doch auch die beiden vertikalen Flags beachten.
WordWrap: Boolean (EDIT: Hat nichts mit den Delphi Styles zu tun sondern betrifft es immer)
Das solle Multiline Funktionalität liefern. Das ist zwar in neueren Delphis nun auch automatisch "ein", aber ich möchte die Multiline Funktion auch gerne ausschalten können. Dieses hat aber leider nun keien Funktinon mehr, weil das intern übersteuert wird.
Delphi-Quellcode:
TrfTextAlign = (talLeftTop, talLeft, talLeftBottom, talCenterTop, talCenter, talCenterBottom,
talRightTop, talRight, talRightBottom);
TrfButton = class(TButton)
private
{ Private-Deklarationen }
FMultiLine: Boolean;
FTextAlign: TrfTextAlign;
procedure SetMultiLine(Value: Boolean);
procedure SetTextAlign(Value: TrfTextAlign);
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent); override;
procedure CreateParams(var Params: TCreateParams); override;
published
{ Published-Deklarationen }
property MultiLine: Boolean read FMultiLine write SetMultiLine default True;
property TextAlign: TrfTextAlign read FTextAlign write SetTextAlign default talCenter;
end;
implementation
const
TextAligns: Array[TrfTextAlign] of Cardinal =
(BS_LEFT or BS_TOP, BS_LEFT, BS_LEFT or BS_BOTTOM,
BS_CENTER or BS_TOP, BS_CENTER, BS_CENTER or BS_BOTTOM,
BS_RIGHT or BS_TOP, BS_RIGHT, BS_RIGHT or BS_BOTTOM);
{ TrfButton }
constructor TrfButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMultiLine := True;
FTextAlign := talCenter;
end;
//-------------------------------------------------------------------------------//
procedure TrfButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
if FMultiLine then
Params.Style := Params.Style or BS_MULTILINE;
Params.Style := Params.Style or TextAligns[FTextAlign] or BS_TEXT;
end;
//-------------------------------------------------------------------------------//
procedure TrfButton.SetMultiLine(Value: Boolean);
begin
if Value <> FMultiLine then begin
FMultiLine := Value;
RecreateWnd;
end;
end;
//-------------------------------------------------------------------------------//
procedure TrfButton.SetTextAlign(Value: TrfTextAlign);
begin
if Value <> FTextAlign then begin
FTextAlign := Value;
RecreateWnd;
end;
end;
Die Frage ist nun wie ich das lösen kann, damit dieser Code für TextAlign auch bei Nutzung von Delphi Styles funktioniert. Muss ich da wirklich den ButtonStyleHook kopieren und für mich anpassen und wie kriege ich diesen dann in meine Komponente? Oder gibt es da eine einfachere objektbasierende Methode ohne Code zu kopieren?