Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: VCL-Styles von wo wird geladen?

  Alt 7. Jan 2025, 18:45
OK, das ist in der Tat nicht so offensichtlich und dazu auch noch recht komplex. Deswegen hier zunächst mal beschränkt auf den konkreten Fall.

TDBMemo verwendet wie gesagt den TMemoStyleHook aus Vcl.StdCtrls. Dort findet man in der Methode UpdateColors folgenden Code:
Delphi-Quellcode:
procedure TMemoStyleHook.UpdateColors;
const
  ColorStates: array[Boolean] of TStyleColor = (scEditDisabled, scEdit);
  FontColorStates: array[Boolean] of TStyleFont = (sfEditBoxTextDisabled, sfEditBoxTextNormal);
var
  LStyle: TCustomStyleServices;
begin
  LStyle := StyleServices;
  if LStyle.Available then
  begin
    Brush.Color := LStyle.GetStyleColor(ColorStates[Control.Enabled]);
    if seFont in Control.StyleElements then
      FontColor := LStyle.GetStyleFontColor(FontColorStates[Control.Enabled])
    else
      FontColor := TWinControlClass(Control).Font.Color;
  end;
end;
löamn
Die Hintergrundfarbe wird hier Brush.Color zugewiesen und aus dem aktuellen Style mit der Methode GetStyleColor und dem Parameter scEdit bzw. scEditDisabled ermittelt. Das landet in der Unit Vcl.Styles in der Methode TCustomStyle.DoGetStyleColor, was uns zu folgenden Zeilen führt:
Delphi-Quellcode:
    scEdit: Result := TSeStyle(FSource).Colors[ktcEdit];
    scEditDisabled: Result := TSeStyle(FSource).Colors[ktcEditDisabled];
Die entsprechenden Werte werden in der Unit Vcl.StyleAPI (in älteren Version ist das noch ein INC-File) in der Methode TSeStyleSource.FillColorsAndFonts gesetzt:
Delphi-Quellcode:
  StyleObject := GetObjectByName('edit');
  if StyleObject <> nil then
  begin
    Colors[ktcEdit] := StyleObject.Color;
    Colors[ktcEditDisabled] := StyleObject.Color;
  end;
Um also die Hintergrundfarbe eines TDBMemo zu manipulieren muss man die Color Eigenschaft des Objekts Edit im Style entsprechend verändern. (Wir sehen hier übrigens auch, dass es keine separate Farbe für Disabled gibt.)

Für das TDBRichEdit ist ja nun der TRichEditStyleHook zuständig. Für den Hintergrundfarbe sorgt die Message EM_SETBKGNDCOLOR, die in der Methode EMSetBkgndColor implementiert ist.
Delphi-Quellcode:
procedure TRichEditStyleHook.EMSetBkgndColor(var Message: TMessage);
begin
  if seClient in Control.StyleElements then
  begin
    Message.LParam := ColorToRGB(StyleServices.GetStyleColor(scEdit));
    Handled := False;
  end;
end;
Dies ist netterweise der gleiche Aufruf wie beim TMemoStyleHook, womit wir wieder bei der Color Eigenschaft des Objekts Edit sind.

Nochmal zur Erinnerung: Die Änderung der Edit-Color im Style hat Auswirkungen auf eine ganze Menge Controls - nicht nur die beiden oben genannten.

Wie gesagt, etwas komplex aber grundsätzlich kein Hexenwerk.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat