Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VCL Skins aus Datei (https://www.delphipraxis.net/212419-vcl-skins-aus-datei.html)

Satyr 7. Feb 2023 15:28

VCL Skins aus Datei
 
Ich hoffe ich bin im richtigen Unterforum. Wenn nicht, bitte verschieben.

Ich experimentiere momentan ein wenig mit VCL Styles.
Ich möchte sie während das Programm läuft, wechseln können.

Ich habe eine ListBox auf meinem Formular und lade dort die Dateien im Style Ordner rein.
Klappt problemlos. Beim klick auf eine Stildatei, möchte ich das der Skin geladen und gesetzt wird.

Hier mein Quellcode dazu:

Delphi-Quellcode:
procedure TForm1.StyleBoxClick(Sender: TObject);
var
   stylename: string;
begin

stylename := LeftStr(StyleBox.Items[StyleBox.ItemIndex], Length(StyleBox.Items[StyleBox.ItemIndex])- 4);
ShowMessage(StyleName);

  if TStyleManager.IsValidStyle('C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles\'+StyleName+'.vsf')
  then begin
     TStyleManager.LoadFromFile('C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles\'+StyleName+'.vsf');
     ShowMessage('Ist ok');
     TStyleManager.SetStyle(StyleName);
  end;

end;
Das funktioniert. Teilweise.

Es funktioniert wenn die Styles einen kurzen Namen haben. "Auric", "AllPorts" oder sowas.
Wird geladen und gesetzt, also das Design entsprechend geändert.

Allerdings nicht wenn der Name des Styles (bzw. der Syle Datei) länger ist. "AquaGraphite", "Windows10BlackPerl" oder so. Da kommt die Fehlermeldung das der Stil nicht gefunden wurde. Was nicht sein kann, dann wäre er nicht in der ListBox.

Lasse ich den Stil von Delphi unter Projekt->Optionen->Erscheinungsbild ändern, funktioniert es. Der Skin wird also nicht kaputt sein, schätze ich.

Das alles verwirrt mich sehr...

Uwe Raabe 7. Feb 2023 16:19

AW: VCL Skins aus Datei
 
Der Dateiname ist zwar AquaGraphite.vsf, aber der Style heißt intern "Aqua Graphite".

Satyr 7. Feb 2023 16:28

AW: VCL Skins aus Datei
 
Uff, danke.

Ist da irgendeine Logik hinter? Also sowas wie "Wenn Großbuchstabe dann davor Leerzeichen" ?
Dann könnte ich das leicht anpassen. Wie man das sonst aus der Stildatei auslesen könnte weiß ich leider nicht.

mmw 7. Feb 2023 16:43

AW: VCL Skins aus Datei
 
Hallo,

so sollte es functionieren.

Delphi-Quellcode:
var
   myStyle : TStyleInfo;

begin

 if TStyleManager.IsValidStyle('C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles\'+'SmokeyQuartzKamri'+'.vsf', myStyle)

  then
    begin
     TStyleManager.LoadFromFile('C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles\'+'SmokeyQuartzKamri'+'.vsf');
     TStyleManager.TrySetStyle(myStyle.Name,true);
    end;
  end;
als Beispiel

Gruß

Satyr 7. Feb 2023 17:08

AW: VCL Skins aus Datei
 
Vielen Dank!

Es klappt und ich habe wieder etwas gelernt.

Vielen Dank :)

mytbo 7. Feb 2023 18:05

AW: VCL Skins aus Datei
 
Zitat:

Zitat von Satyr (Beitrag 1518413)
Wie man das sonst aus der Stildatei auslesen könnte weiß ich leider nicht.

Achtung: Der folgende Quelltext ist mORMot kontaminiert.
Delphi-Quellcode:
uses
  Vcl.Styles, Vcl.Themes,
  mormot.core.base,
  mormot.core.text,
  mormot.core.search,
  mormot.core.os;
 
type
  TStyleItem = record
    fileName: TFileName;
    styleName: String;
  end;

const
  STYLE_FOLDER = 'Styles';
  STYLE_SEARCHMASK = '*.vsf';

var
  styleItems: array of TStyleItem;
begin
  var styleInfo: TStyleInfo;
  var styleItemCount: Integer;
  var styleFolder: TFileName := MakePath(['c:\Users\Public\Documents\Embarcadero\Studio\22.0', STYLE_FOLDER], True);
  var styleFiles: TFileNameDynArray := FileNames(styleFolder, STYLE_SEARCHMASK);
  for var i: Integer := 0 to High(styleFiles) do
  begin
    if TStyleManager.IsValidStyle(styleFiles[i], styleInfo) then
    begin
      styleItemCount := Length(styleItems);
      SetLength(styleItems, styleItemCount + 1);
      styleItems[styleItemCount].fileName := styleFiles[i];
      styleItems[styleItemCount].styleName := styleInfo.Name;
    end;
  end;

  var styleNames: RawUtf8;
  for var i: Integer := 0 to High(styleItems) do
    AddToCsv(StringToUtf8(styleItems[i].styleName), styleNames, sLineBreak);

  ShowMessage(Utf8ToString(styleNames));
Bis bald...
Thomas

Satyr 7. Feb 2023 19:13

AW: VCL Skins aus Datei
 
Danke, ich werde morgen damit weiter rumtesten.
Mein einziges Problem ist eigentlich zu Prüfen ob ein Skin schon geladen ist, damit ich ihn mehrfach aufrufen kann, wenn ich die Liste durchgehe.

Das bekomme ich morgen hin, schätze ich.
Dein Quellcode sieht nach interessanten Infos aus, für mich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz