Zitat:
Im Prinzip dürfte es ja nicht schwer sein, das sowohl für die
VCL und FMX selber nachzubauen: Gewünschte Komponenten auf die Form und die entsprechenden Routinen zum laden der Styles einbauen.
Von wegen, das ist doch Fummelprogrammierung. Nur mit Deiner Hilfe bin ich weitergekommen. Für die Praxis ist diese Art von Programmierung nicht geeignet, da man den Aufwand nicht einschätzen kann.
Ich bin mir nicht ganz sicher was Du meinst. Gut, es hängt natürlich immer ein wenig von der Erfahrung ab, die man mit dem einen oder anderen Bereich gesammelt hat. Wenn das eine oder andere Neuland ist, ist es sicher nicht ganz so einfach, wie ich das mal so locker von mir gegeben habe.
Einen
VCL-Style kann man in der Tat nur einmal laden, beim 2. Mal gibt es eine
Exception. Sollte man vermeiden, da es da z.T. zu anderen Problemen kommen kann. Daher muss man sich merken, ob der Style schon geladen wurde.
Auf der
VCL-Seite ist es ein wenig tricky zu prüfen, ob der Style schon geladen ist, da Style-Name und Style-Dateiname nicht immer gleich sein müssen, da gibt es dann schon mal Probleme. Ich merke mir daher Dateiname und Name des Styles in einer Stringliste. Ich verwende in meinen Programmen immer so einen Auswahl-Dialog (siehe Screenshot), wo man sich den gewünschten Style auswählen und aktivieren kann.
Hier mal ein Auszug vom Source-Code, der Dir vielleicht eine Idee gibt, wie man das lösen kann (GetFieldStr ist eine eigene Prozedur, welche Elemente in einem String, getrennt durch ein betimmtes Feldtrennzeichen zurück liefert):
Delphi-Quellcode:
procedure hs_ChangeDesign(sMenu: string);
var
OK: Boolean;
// Prüfen, ob der Style schon geladen wurde
function StyleIsLoaded (var s: string): boolean;
var i: Integer;
begin
result := false;
for I := 0 to slStyles.Count-1 do begin
if GetFieldStr ('=', slStyles[i], 1) = s then begin
s := GetFieldStr ('=', slStyles[i], 2); // den Namen des Styles ermitteln und zurückgeben
Result := True;
break;
end;
end;
end;
begin
ProgStyle := sMenu;
if ProgStyle = '*Windows' then begin
TStyleManager.SetStyle('Windows');
end else begin
if TStyleManager.IsValidStyle(chkPath (AppPath) + SMenu) then begin
if FileExists (chkPath (AppPath) + sMenu) then begin
try
OK := StyleIsLoaded (sMenu);
if OK then begin
// Style ist schon geladen, SetStyle kann verwendet werden
TStyleManager.SetStyle(sMenu);
end else begin
// Style noch nicht geladen, muss erst geladen werden, dann zur Merkliste hinzufügen
TStyleManager.SetStyle(TStyleManager.LoadFromFile(chkPath (AppPath) + sMenu));
slStyles.add (Progstyle + '=' + TStyleManager.ActiveStyle.Name);
end;
except
end;
end;
end else begin
TStyleManager.TrySetStyle('Windows');
end;
end;
end;
Vom Ablauf ist es so, dass der Dialog beim Aufruf prüft, welche Style-Dateien im Programmverzeichnis liegen und liest die dann in die Dropdown-Box ein (zum Programmstart wird natürlich schon ein Style geladen, der ist dann schon in der zuvor von mir erzeugten Style-Liste - slStyles - drin).
Vielleicht kennt aber auch jemand anders noch eine einfachere Variante.