AGB  ·  Datenschutz  ·  Impressum  







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

VCL Skins aus Datei

Ein Thema von Satyr · begonnen am 7. Feb 2023 · letzter Beitrag vom 7. Feb 2023
Antwort Antwort
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#1

VCL Skins aus Datei

  Alt 7. Feb 2023, 15:28
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...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 16:19
Der Dateiname ist zwar AquaGraphite.vsf, aber der Style heißt intern "Aqua Graphite".
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 16:28
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.
  Mit Zitat antworten Zitat
mmw

Registriert seit: 10. Sep 2019
Ort: OWL
322 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 16:43
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ß
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 17:08
Vielen Dank!

Es klappt und ich habe wieder etwas gelernt.

Vielen Dank
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#6

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 18:05
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

Geändert von mytbo ( 7. Feb 2023 um 18:07 Uhr)
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: VCL Skins aus Datei

  Alt 7. Feb 2023, 19:13
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.
  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 08:51 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