Einzelnen Beitrag anzeigen

tdeck

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

AW: TStyleBook verwenden unter Windows / Android

  Alt 12. Okt 2022, 08: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