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.