AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VCL-Styles von wo wird geladen?

Ein Thema von HCB · begonnen am 6. Jan 2025 · letzter Beitrag vom 8. Jan 2025
Antwort Antwort
HCB

Registriert seit: 12. Feb 2020
192 Beiträge
 
Delphi 12 Athens
 
#1

VCL-Styles von wo wird geladen?

  Alt 6. Jan 2025, 11:49
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

Geändert von TBx ( 6. Jan 2025 um 19:51 Uhr)
  Mit Zitat antworten Zitat
fred42

Registriert seit: 1. Jan 2025
2 Beiträge
 
#2

AW: VLC-Styles von wo wird geladen?

  Alt 6. Jan 2025, 17:22
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.
  Mit Zitat antworten Zitat
HCB

Registriert seit: 12. Feb 2020
192 Beiträge
 
Delphi 12 Athens
 
#3

AW: VCL-Styles von wo wird geladen?

  Alt Gestern, 12:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: VCL-Styles von wo wird geladen?

  Alt Gestern, 14:37
Bei TDBMemo kann man direkt sehen, dass es den Style für das TMemo verwendet:
Delphi-Quellcode:
class constructor TDBMemo.Create;
begin
  TCustomStyleEngine.RegisterStyleHook(TDBMemo, TMemoStyleHook);
end;
Beim TDBRichEdit wird implizit in der Parent-Class TCustomRichEdit festgelegt, dass der TRichEdit-Style verwendet wird:
Delphi-Quellcode:
class constructor TCustomRichEdit.Create;
begin
  TCustomStyleEngine.RegisterStyleHook(TCustomRichEdit, TRichEditStyleHook);
end;
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HCB

Registriert seit: 12. Feb 2020
192 Beiträge
 
Delphi 12 Athens
 
#5

AW: VCL-Styles von wo wird geladen?

  Alt Gestern, 18:10
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: VCL-Styles von wo wird geladen?

  Alt Gestern, 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
HCB

Registriert seit: 12. Feb 2020
192 Beiträge
 
Delphi 12 Athens
 
#7

AW: VCL-Styles von wo wird geladen?

  Alt Heute, 12:22
Ok, lieben Dank Uwe.
Mal sehen ob ich damit einigermaßen klar komme.

LG Harry
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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 by Thomas Breitkreuz