![]() |
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 |
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. |
AW: TStyleBook verwenden unter Windows / Android
Zitat:
>> 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:
Und bei OnSaveState lege ich die Einstellungen entsprechend ab. Aber diese Funktionen haben mit dem Problem nichts zu tun.
// 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} Auch ohne diese erhalte ich die Exception unter Windows (nur unter Windows)
Code:
Beim Change der CB_Layout nutze ich diese dann um das Style zu aktivieren und die aktuelle Einstellung in meiner Config abzulegen.
// 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;
Code:
Thorsten
// 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz