Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#1

Abgeleiteter TButton mit Delphi Styles nicht richtig

  Alt 19. Jun 2022, 15:12
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?
  Mit Zitat antworten Zitat