Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TStyleBook verwenden unter Windows / Android (https://www.delphipraxis.net/211607-tstylebook-verwenden-unter-windows-android.html)

tdeck 11. Okt 2022 16:51

TStyleBook verwenden unter Windows / Android
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

philipp.hofmann 11. Okt 2022 20:43

AW: TStyleBook verwenden unter Windows / Android
 
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.

tdeck 12. Okt 2022 08:42

AW: TStyleBook verwenden unter Windows / Android
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1513125)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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