![]() |
VCL-Styles von wo wird geladen?
Hallo, ich bräuchte mal wieder euere Hilfe.
Ich habe einen vorhanden Stil Auric.vsf aus dem Verzeichnis C:\Users\Public\Documents\Embarcadero\Studio\23.0\ Styles im Bitmap-Styles-Designer geladen, das Style.png exportiert, bearbeitet und wieder geladen (aktualisiert). Die Änderungen sind sichtbar. Danach unter dem Namen Test.vsf und auch den Objects Namen auf Test gespeichert. So, nun habe ich unter den Project Optionen das Erscheinungsbild und setze dies als Standardstil ein. 1. Die Änderungen sind nicht sichtbar! 2. Jetzt lösche ich die Datei test.vsf aus dem Verzeichnis C:\Users\Public\Documents\Embarcadero\Studio\23.0\ Styles wieder. 3. Die gelöschte Datei habe ich trotzdem noch unter den Project Optionen stehen, kann auch mir vom TestStyle die Vorschau ansehen. Fragen über Fragen?!? Frage 1: Woher nimmt das Fenster Projectoptionen das Erscheinungsbild? Aus dem o.g. Verzeichnis kanns wohl nicht sein, das die Datei dort nicht mehr existiert. Frage 2: Warum waren die Änderungen im Projekt Stil nicht sichtbar? Die Projekt .res habe ich schon mal gelöscht und auch das Projekt komplett neu erzeugen lassen. Keine Änderung, die test.vsf wird immer noch angezeigt. Wer von euch kann mir erklären wie das ganze mit den Styles im Detail funktioniert? Lieben Dank. LG Harry |
AW: VLC-Styles von wo wird geladen?
Hallo,
vielleicht hilft das Bitmap-Styles-Designer: Die Datei test.vsf öffnen Objects Im Inspektor rechts den Namen löschen und die Datei unter gleichen Namen speichern, dann löschen. Delphi-IDE Project\Quelltext anzeigen die Zeile TStyleManager.TrySetStyle('test'); löschen. dann Project\Optionen\Manifest\ Laufzeit Themes aktivieren deaktivieren. compilieren. Anschließend kann man die Laufzeit Themes wieder aktivieren. |
AW: VCL-Styles von wo wird geladen?
Danke für die Antwort. Das mit der gelöschten Datei hat funktioniert.
Was ich nach wie vor nicht kapiere ist, warum die Änderungen in meiner App nicht wirksam sind. Im Bitmap-Styles-Designer Stil Test sind die Änderungen vorhanden nachdem ich das png aktualisiert habe. Nun versuche ich die Hintergrundfarbe im DBMemo und im DBRichEdit zu ändern (der bei Auric schwarz ist), die Schrift im DBRich teilweise auch schwarz und somit nicht lesbar. Deshalb möchte ich die Hintergrundfarben etwas heller haben. Funzt ab nicht. DBMemo und DBRichEdit sind unter Objekte nicht verfügbar. Muss ich die etwa neu anlagen um die Farbe zu ändern? Für weitere Tipps wäre ich außerordentlich dankbar. LG Harry |
AW: VCL-Styles von wo wird geladen?
Bei TDBMemo kann man direkt sehen, dass es den Style für das TMemo verwendet:
Delphi-Quellcode:
Beim TDBRichEdit wird implizit in der Parent-Class TCustomRichEdit festgelegt, dass der TRichEdit-Style verwendet wird:
class constructor TDBMemo.Create;
begin TCustomStyleEngine.RegisterStyleHook(TDBMemo, TMemoStyleHook); end;
Delphi-Quellcode:
Das bedeutet aber auch, dass deine Änderungen nicht nur für diese beiden von dir genannten Controls wirksam sind, sondern auch für alle anderen, die diesen Styles zugeordnet sind.
class constructor TCustomRichEdit.Create;
begin TCustomStyleEngine.RegisterStyleHook(TCustomRichEdit, TRichEditStyleHook); end; |
AW: VCL-Styles von wo wird geladen?
Hallo Uwe,
ich schnall gar nichts! Im Bitmap-Styles-Designer finde ich unter Objects nur den DBNavigator und DBGrid, aber kein DBMemo oder DBRichEdit, auch kein TCustomRichEdit. Wo muss ich eigentlich jetzt die Hintergrundfarbe für diese Objekte ändern, unter Objects (aber da sind die nicht vorhanden), im Image selbst (png), oder muss ich erst die Objekte unter Objects anlegen? Ich hatte das mit dem Erscheinungsbild einfacher vorgestellt. Ist ja auch ganz einfach, wenn man die Styles so nutzen kann wie sie sind. Aber Änderungen sind wohl sehr schwierig, vor allem, wenn man das ganze nicht richtig kapiert. Vielleicht könntest du mir etwas Nachhilfe geben? LG Harry |
AW: VCL-Styles von wo wird geladen?
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:
löamn
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; 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:
Die entsprechenden Werte werden in der Unit Vcl.StyleAPI (in älteren Version ist das noch ein INC-File) in der Methode TSeStyleSource.FillColorsAndFonts gesetzt:
scEdit: Result := TSeStyle(FSource).Colors[ktcEdit];
scEditDisabled: Result := TSeStyle(FSource).Colors[ktcEditDisabled];
Delphi-Quellcode:
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.)
StyleObject := GetObjectByName('edit');
if StyleObject <> nil then begin Colors[ktcEdit] := StyleObject.Color; Colors[ktcEditDisabled] := StyleObject.Color; end; 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:
Dies ist netterweise der gleiche Aufruf wie beim TMemoStyleHook, womit wir wieder bei der Color Eigenschaft des Objekts Edit sind.
procedure TRichEditStyleHook.EMSetBkgndColor(var Message: TMessage);
begin if seClient in Control.StyleElements then begin Message.LParam := ColorToRGB(StyleServices.GetStyleColor(scEdit)); Handled := False; end; end; 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. |
AW: VCL-Styles von wo wird geladen?
Ok, lieben Dank Uwe.
Mal sehen ob ich damit einigermaßen klar komme. LG Harry |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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