AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung TStyleBook verwenden unter Windows / Android
Thema durchsuchen
Ansicht
Themen-Optionen

TStyleBook verwenden unter Windows / Android

Offene Frage von "tdeck"
Ein Thema von tdeck · begonnen am 11. Okt 2022 · letzter Beitrag vom 12. Okt 2022
Antwort Antwort
tdeck

Registriert seit: 26. Jun 2006
Ort: Obertshausen
69 Beiträge
 
Delphi 11 Alexandria
 
#1

TStyleBook verwenden unter Windows / Android

  Alt 11. Okt 2022, 17:51
Hallo,

gibt es irgendwo ein gutes Tutorial wie man bei einer App für Windows und Android die TStyleBooks verwendet?

Ich möchte dem Anwender in den Einstellungen ermöglichen zwischen einem Hellen und dunklen Design zu wechseln.
Zum testen habe ich mir das FMX-Style (MaterialOxfordBlue) aus dem Get-It installiert. Aber ich komme hier irgendwie nicht weiter und die Hilfe bei Embarcadero bringt mich nicht mal ansatzweise weiter.

Ich habe es zwar geschafft das im IDE-Designer und auf den Android-Geräten das Style sauber verwendet wird. Starte ich es aber unter Windows öffnet sich das Fenster kurz und wird sofort beendet. Ohne eine Meldung!

Im Debugmodus erhalte ich eine Exception (siehe Bild), es sieht für mich danach aus als ob hier auf eine ungültige Adresse gezeigt wird. Ich weiss aber noch nicht warum.

Muss ich für Windows und Android evtl. doch getrennte StyleBooks verwenden?
Ich habe 2 Styles angelegt, 0-Default (Windows Style) und 1-Android.

Habe ich was übersehen?

Gruß
Thorsten
Miniaturansicht angehängter Grafiken
11-10-2022_17-44-53.png   11-10-2022_17-49-06.png  
Thorsten
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
891 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TStyleBook verwenden unter Windows / Android

  Alt 11. Okt 2022, 21:43
Du musst nur
TStyleManager.SetStyleFromFile(styleToUse);
mit den ausgewählten Style ausführen.
TStyleManager.SetStyleFromFile(nil);
geht auf den Standard-Style. Ich muss bei mir an einigen Stellen aber nachbessern und dann zusätzlich die Farben von
- Grids
- einigen Elementen, z.B. TTMSFMXCheckGroupPicker
die Farben manuell bzw. in ApplyStyleLookup setzen, damit die Darstellung überall richtig ist. Das kann aber auch jeweils an der verwendeten Style-Datei liegen.
Da musste ich auch einigen in der EMBT-Dark.style-Datei nachbessern, damit es für mich passte.
  Mit Zitat antworten Zitat
tdeck

Registriert seit: 26. Jun 2006
Ort: Obertshausen
69 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TStyleBook verwenden unter Windows / Android

  Alt 12. Okt 2022, 09:42
Du musst nur
TStyleManager.SetStyleFromFile(styleToUse);
mit den ausgewählten Style ausführen.
TStyleManager.SetStyleFromFile(nil);
geht auf den Standard-Style. Ich muss bei mir an einigen Stellen aber nachbessern und dann zusätzlich die Farben von
- Grids
- einigen Elementen, z.B. TTMSFMXCheckGroupPicker
die Farben manuell bzw. in ApplyStyleLookup setzen, damit die Darstellung überall richtig ist. Das kann aber auch jeweils an der verwendeten Style-Datei liegen.
Da musste ich auch einigen in der EMBT-Dark.style-Datei nachbessern, damit es für mich passte.
Hallo Philipp,

>> TStyleManager.SetStyleFromFile(styleToUse);
ich schaue mir die Funktion nachher mal an. Aber mich wundert es etwas, da ich eben nicht aus einem File das ganze nutze sondern aus dem StyleBook, ich möchte kein nachladen eines Styles. Deswegen übernehme ich die Styles in ein Stylebook und übernehme diese Resource ja in den Code. Aber vielleicht habe ich da ja auch einen Denkfehler.
Aktuell habe ich die Stylefunktionen aus dem Windowscode ausgeklammert, da mein Code unter Android ohne Probleme funktioniert.

Ich habe 7 Styles in je einem Stylebook geladen, darin sind jeweils die Windows und Android Version enthalten.

Zur Auswahl habe ich in meinen Programmeinstellungen eine Combobox mit dem Namen CB_Layout, im FormCreate nutze ich folgenden Code um diese Funktion mit einer Auswahl zu füllen:
Code:
// Layout
// V1.1967
// 11.10.2022 TD
//
{$ifdef ANDROID} // Aktuell nur unter Android, Windows erzeugt eine Exception
    with CB_Layout
     do begin
       Items.AddObject( StyleBook1.StyleName,StyleBook1 );
        Items.AddObject( StyleBook2.StyleName,StyleBook2 );
         Items.AddObject( StyleBook3.StyleName,StyleBook3 );
          Items.AddObject( StyleBook4.StyleName,StyleBook4 );
           Items.AddObject( StyleBook5.StyleName,StyleBook5 );
            Items.AddObject( StyleBook6.StyleName,StyleBook6 );
             Items.AddObject( StyleBook7.StyleName,StyleBook7 );
              ItemIndex:= 0;   // Starte mit 0 als Standard
     end;
{$endif ANDROID}


// Geräteeinstellungen laden, Position, Layout, Kundendaten usw.
// V1.1963
// 03.09.2022 TD
//
SaveState.StoragePath := TPath.GetHomePath;    // Einstellungen dauerhaft speichern

 // Stream unterstützt nur Cardinaltypen, deswegen die Type in
 // Bytes zerlegen und einzeln ablegen bzw laden
 //
  if SaveState.Stream.Size > 0 then
  begin
    ReadStreamCfg := TBinaryReader.Create(SaveState.Stream);
     PtrGeraeteDaten:= @GeraeteDaten;
      PtrByte:= PtrGeraeteDaten;

    try
      for xfor := 0 to sizeof( GeraeteDaten )-1 do
        begin
          inByte := ReadStreamCfg.ReadByte;
            PtrByte^  := inByte;
                 inc(PtrByte);
        end;
         PtrByte:=NIL;
    finally
      ReadStreamCfg.Free;
    end;
  end;


// Übernehme die Daten aus der Geräteconfig
//
 ...
   CB_Layout.ItemIndex := GeraeteDaten.intStyleIndex; // Übernahme letztes Layout
 ...

 // Bei Windows ausblenden!!!
 //
  {$ifdef MSWINDOWS}
     // LayOut läuft aktuell nicht unter Windows
      CB_Layout.Visible := false;
       CB_Layout.Enabled := false;

  {$endif MSWINDOWS}
Und bei OnSaveState lege ich die Einstellungen entsprechend ab. Aber diese Funktionen haben mit dem Problem nichts zu tun.
Auch ohne diese erhalte ich die Exception unter Windows (nur unter Windows)

Code:
// Geräteeinstellungen speichern, Position, Layout, Kundendaten usw.
// V1.1963
// 03.09.2022 TD
//
procedure TForm1.FormSaveState(Sender: TObject);
var
   WriteStreamCfg : TBinaryWriter;
   xfor  : integer;
   PtrByte: PByte;
   PtrGeraeteDaten : pointer;
   OutByte : byte;

begin
 // Bei Windows
  {$ifdef MSWINDOWS}
      GeraeteDaten.winTop    := Top;
      GeraeteDaten.winLeft   := Left;
      GeraeteDaten.winHeight := Height;
      GeraeteDaten.winWidth  := Width;

  {$endif MSWINDOWS}

 // Stream unterstützt nur Cardinaltypen, deswegen die Type in
 // Bytes zerlegen und einzeln ablegen bzw laden
 //
   SaveState.Stream.Clear;
    WriteStreamCfg := TBinaryWriter.Create( SaveState.Stream );
      PtrGeraeteDaten:= @GeraeteDaten;
       PtrByte:= PtrGeraeteDaten;

   try
       for xfor := 0 to sizeof( GeraeteDaten )-1 do
        begin
          OutByte := PtrByte^;
           WriteStreamCfg.Write( OutByte);
                 inc(PtrByte);
        end;
         PtrByte:=NIL;
   finally
      WriteStreamCfg.Free;
   end;
end;
Beim Change der CB_Layout nutze ich diese dann um das Style zu aktivieren und die aktuelle Einstellung in meiner Config abzulegen.

Code:
// Layoutauswahl
// V1.1967
// 11.10.2022 TD
//
procedure TForm1.CB_LayoutChange(Sender: TObject);
begin

// Android
{$ifdef ANDROID}
  with CB_Layout
   do
    begin
     if ItemIndex >= 0
       then StyleBook := TStyleBook( Items.Objects[ItemIndex]);
     end;
  GeraeteDaten.intStyleIndex := CB_Layout.ItemIndex;
{$endif ANDROID}
end; // TForm1.CB_LayoutChange
Thorsten
Thorsten
  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 00:36 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