![]() |
Wo ist das original Style der Controls?
Hallo Zusammen,
bei einer neuen Android App haben die Controls einen vordefinierten Style. Wenn ich den Style zur Laufzeit aus der Datei laden
Delphi-Quellcode:
wird der Style wie erwartet umgestellt. Jetzt ist die Frage, wie kann ich den Style wieder entfernen? Einen default Style als File habe ich noch nicht gefunden.
TStylemanager.SetStyleFromFile( INIStyle );
Hat jemand eine Idee? Gruß Kostas |
AW: Wo ist das original Style der Controls?
Probier mal
Delphi-Quellcode:
TStylemanager.SetStyle(nil);
|
AW: Wo ist das original Style der Controls?
Könnte ein
Code:
da weiterhelfen?
Vcl.Themes.TStyleManager.UnRegisterStyle();
|
AW: Wo ist das original Style der Controls?
Zitat:
|
AW: Wo ist das original Style der Controls?
Perfekt Uwe,
genau so gehts. Nur der Vollständigkeitshalber UnRegisterStyle() gibt es bei FMX nicht. Dankeschön. :-) Gruß Kostas P.S. Sag mal Uwe gibt es etwas was du nicht kennst. |
AW: Wo ist das original Style der Controls?
Zitat:
|
AW: Wo ist das original Style der Controls?
Er weiß nur grade nicht was das sein könnte. :lol:
|
AW: Wo ist das original Style der Controls?
Halo Zusammen,
hat jemand eine Idee wie der Name des aktiven Styles abgerufen werden kann? So geht es nicht, das result ist immer leer auch wenn der Style über
Delphi-Quellcode:
gesetzt wurde:
TStylemanager.SetStyleFromFile( INIStyle )
Delphi-Quellcode:
Hintergrund der Frage ist, wenn ich den default Style über Uwes Methode setze
TStyleManager.ActiveStyle(nil).StyleName oder TStyleManager.ActiveStyle(self).StyleName
Delphi-Quellcode:
funktioniert es zwar einwandfrei. Ich darf die Methode nur kein zweites mal aufrufen da ansonsten die Meldung kommen "doppelte Namen sind nicht zulässig" oder so ähnlich. Wenn also der Standard-Style bereits gesetzt ist, darf er nicht erneut gesetzt werden. Ich könnte das zwar selbst verwalten, ich dachte nur es muss doch eine Möglichkeit geben abzufragen welcher Style gerade gesetzt ist. Übrigens, es geht hier um ein Android FMX Projekt!
TStylemanager.SetStyle(nil);
Gruß Kostas |
AW: Wo ist das original Style der Controls?
Bitte verbessert mich, es ist bestimmt falsch, aber wenn ich der FMX Doku folge, sollte ein
Delphi-Quellcode:
als Ergebniss den Stil liefern, oder ?!
FMX.Styles.TStyleManager.ActiveStyle( INIFile )
Also so in etwa:
Delphi-Quellcode:
var
MeinStil : TFmxObject; begin MeinStil := TStyleManager.ActiveStyle( INIFile ); end; |
AW: Wo ist das original Style der Controls?
Zitat:
Delphi-Quellcode:
StyleName ist immer leer.
TStyleManager.ActiveStyle( INIStyle ).StyleName
[Edit] Was soll eigentlich der Parameter beim ActiveStyle das habe ich auch nicht verstanden. Gruß Kostas |
AW: Wo ist das original Style der Controls?
ActiveStyle gibt doch ein TFMXObject zurück. Bei einem TFMXObject gibt StyleName den Stilnamen für das FMX-Objekt an. Wenn das TFMXObject aber ein Style ist, dann müsste der Name des Styles im Property Name stehen.
|
AW: Wo ist das original Style der Controls?
Zitat:
Aber dem Namen nach klingt für mich eine INI schonmal total falsch. Wo kommt denn dieser Blödsinn mit dem IniFile her? Gibt da einfach NIL rein, so wie du es auch beim SetStyle machst, also bei dem SetStyle mit den zwei Parametern, denn das mit einem Parameter gibt da auch nur ein NIL weiter. Kannst ja mal danach suchen, aber nirgendwo was zu finden, nichtmal eine dieser leeren Pseudo-Hilfeseiten ala "Das ist Methode ABC in Klasse XYZ. Hier steht nichts Sinnvolles, bitte hilf uns das zu füllen". TStyleManager.StyleResourceForContext TBehaviorServices.SupportsBehaviorService IDeviceBehavior.GetOSPlatform |
AW: Wo ist das original Style der Controls?
Ich habe hier mal ein Demo womit Du unabhängig von externen Style Dateien bist.
Ich habe als Resource Styles eingefügt die Delphi mitbringt
Delphi-Quellcode:
Bei Programm Start wird eine ComboBox mit Styles gefüllt, im OnChange wird gewechselt und Du brauchst Dir um den Namen keine Sorge machen.
c:\Users\Public\Documents\Embarcadero\Studio\19.0\Styles\Android\*.fsf und \iOS\*.fsf
Das Demo sollte fit für Android und iOS sein, aber da das nicht gerade mein Steckenpferd ist, bitte ich bei Fehler um Nachsicht. Wichtig: Die Resourcen Namen müssen mit den OS + ComboBox Namen passen Beispiel ComboBox Name "Dark" steht in Resource als "AndroidDark" und kommt von Datei "AndroidDark.fsf"
Delphi-Quellcode:
Ich hoffe das es funktioniert da dies alles nur Theorie ist und Dir irgendwie weiterhelfen kann.
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Ani, FMX.Layouts, FMX.Gestures, FMX.Styles, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ListBox; type TForm1 = class(TForm) StyleBook1: TStyleBook; ToolbarHolder: TLayout; ToolbarPopup: TPopup; ToolbarPopupAnimation: TFloatAnimation; ToolBar1: TToolBar; ToolbarApplyButton: TButton; ToolbarCloseButton: TButton; ToolbarAddButton: TButton; ComboBoxStyle: TComboBox; procedure ToolbarCloseButtonClick(Sender: TObject); procedure FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure ComboBoxStyleChange(Sender: TObject); private FGestureOrigin: TPointF; FGestureInProgress: Boolean; { Private declarations } procedure ShowToolbar(AShow: Boolean); public { Public declarations } procedure AddComboItem(AText: string); end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = vkEscape then ShowToolbar(not ToolbarPopup.IsOpen); end; procedure TForm1.ToolbarCloseButtonClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var DX, DY : Single; begin if EventInfo.GestureID = igiPan then begin if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags) and ((Sender = ToolbarPopup) or (EventInfo.Location.Y > (ClientHeight - 70))) then begin FGestureOrigin := EventInfo.Location; FGestureInProgress := True; end; if FGestureInProgress and (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then begin FGestureInProgress := False; DX := EventInfo.Location.X - FGestureOrigin.X; DY := EventInfo.Location.Y - FGestureOrigin.Y; if (Abs(DY) > Abs(DX)) then ShowToolbar(DY < 0); end; end end; procedure TForm1.ShowToolbar(AShow: Boolean); begin ToolbarPopup.Width := ClientWidth; ToolbarPopup.PlacementRectangle.Rect := TRectF.Create(0, ClientHeight-ToolbarPopup.Height, ClientWidth-1, ClientHeight-1); ToolbarPopupAnimation.StartValue := ToolbarPopup.Height; ToolbarPopupAnimation.StopValue := 0; ToolbarPopup.IsOpen := AShow; end; procedure TForm1.AddComboItem(AText: string); var lbi: TListBoxItem; begin lbi := TListBoxItem.Create(ComboBoxStyle); lbi.Parent := ComboBoxStyle; lbi.Text := AText; ComboBoxStyle.AddObject(lbi); end; procedure TForm1.FormCreate(Sender: TObject); begin AddComboItem('Default'); if TOSVersion.Platform = pfAndroid then begin AddComboItem('Dark'); AddComboItem('Dark2'); AddComboItem('DarkBlue'); AddComboItem('Light'); AddComboItem('Light2'); AddComboItem('Wear'); AddComboItem('WearDarkBlue'); AddComboItem('GoogleGlass'); end else if TOSVersion.Platform = pfiOS then begin AddComboItem('Black'); AddComboItem('Transparent'); end; ComboBoxStyle.ItemIndex := 0; end; procedure TForm1.ComboBoxStyleChange(Sender: TObject); var resname: string; style: TFMXObject; begin if ComboBoxStyle.ItemIndex > 0 then begin if TOSVersion.Platform = pfAndroid then resname := 'Android' else if TOSVersion.Platform = pfiOS then resname := 'iOS'; resname := resname + ComboBoxStyle.Selected.Text; // style := TStyleManager.GetStyleResource(resname); style := TStyleStreaming.LoadFromResource(HInstance, resname, RT_RCDATA); // ich glaube das ist richtig if style <> nil then TStyleManager.SetStyle(style); end else TStyleManager.SetStyle(nil); end; end. |
AW: Wo ist das original Style der Controls?
Delphi-Quellcode:
Wenn es diese Ressource nicht gibt, dann knallt eine Exception und style wird niemals NIL sein.
style := TStyleStreaming.LoadFromResource(HInstance, resname, RT_RCDATA); // ich glaube das ist richtig
if style <> nil then Einzige Ausnahme: Es gibt eine Ressouce, welche so heißt, es aber keine Style-Ressource ist. |
AW: Wo ist das original Style der Controls?
Zitat:
Zitat:
So steht es in der .RC Datei
Delphi-Quellcode:
Ich schrieb doch was Source macht oder ist das falsch mit den .fsf Dateien?
AndroidDark RCDATA "C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\19.0\\Styles\\Android\\AndroidDark.fsf"
Weil wenn das Deine einzige Sorge ist bin ich irgendwie sehr zufrieden mit mir. Es gibt echt viele Möglichkeiten um Styles zu laden, ich hatte die Befürchtung das ich eine völlig falsche nehme. Den Resourcenpart kann man auch in ein Daten-Module auslagern um mehr Ordnung/Trennung zu halten. edit Ich hab es gerade mal durchgespielt, also Deine Befürchtung des es knallt/eine Exception wird geworfen wenn Resource X nicht gefunden wird kann ich leider nicht nachvollziehen da Style dann NIL ist. Erst ein erfolgreiches LoadFromResource macht aus Style kein NIL. Ich habe einfach einen Unsinn Eintrag in die ComboBox geadded und in der "if style <> nil then" ein Label umbennen lassen, wenn Resource OK dann Label = Name der Resource, bei NIL bleibt das Label leer ohne Exception. Das gleiche passiert wenn jemand extern eine Resource löscht, wählt man dann die gelöschte aus passiert gar nichts. Man könnte ja vielleicht auch bei Laufzeit die vorhandenen Resourcen per Enum durchforsten lassen und nicht so primitiv wie ich es mache. Das war halt mein erster Versuch, mittlerweile ist aus "if TOSVersion.Platform = pfAndroid then" ein "case TOSVersion.Platform of" geworden. |
AW: Wo ist das original Style der Controls?
Hallo Zusammen,
zumindest bei meinem Android 6.0.1 Device funktioniert es nicht. Mit Button2 lade ich den Style AndroidJet.style in den TStyleManager. Der Style wird geladen und umgestellt. Funktioniert einwandfrei. Mit Button1 lade ich den default Style, funktioniert ebenfalls einwandfrei. Mit Button3 frage ich jetzt jeweils den StyleName und gebe es jeweils in Edit1 + Edit2 aus. Der Style Name ist jedes mal leer.
Delphi-Quellcode:
procedure TForm1.bt1Click(Sender: TObject);
begin //Auf Tag Style schalten (den default Style verwenden) TStyleManager.SetStyle(nil); end; procedure TForm1.bt2Click(Sender: TObject); var StylePath: string; begin //Auf Nacht Style schalten StylePath := TPath.GetSharedDocumentsPath + PathDelim + 'fmxstyles' + PathDelim; TStyleManager.SetStyleFromFile(StylePath + 'AndroidJet.style'); end; procedure TForm1.bt3Click(Sender: TObject); var MeinStil: TFmxObject; begin edit1.text := TStyleManager.ActiveStyle(nil).StyleName; MeinStil := TStyleManager.ActiveStyle(nil); edit2.text := MeinStil.StyleName; end; Mittlerweile mache ich das jetzt anders. Die Methode
Delphi-Quellcode:
dauert in meiner Android Anwendung mit einigen Controls 5 Sekunden zum laden. Also muss der Anwender für jedes Umschalten 5 Sekunden warten.
TStyleManager.SetStyleFromFile
Jetzt mache ich es wie folgt: Auf der Form habe ich drei StyleBooks. StyleBooks1 hat keinen Style damit ich den default Style nutzen kann. Die Anwendung wird also mit default Style geladen. Ich benötige zwei weitere Styles zur Auswahl. StyleBooks1 + StyleBooks2 werden bei OnCreate über einen Thread geladen. Das dauert die gleiche Zeit also 10 Sekunden insgesamt, weil es in einem Thread läuft ist es egal. Auf das Style umschalten geht dann Pfeil schnell.
Delphi-Quellcode:
procedure TfrMain.FormCreate(Sender: TObject); begin TThread.CreateAnonymousThread(procedure begin TThread.Synchronize(TThread.CurrentThread, Procedure var StylePath: string; begin StylePath := TPath.GetSharedDocumentsPath + PathDelim + 'fmxstyles' + PathDelim; sb2.LoadFromFile(StylePath + INIStyle1); sb3.LoadFromFile(StylePath + INIStyle2); actStyle.Enabled := true; end); end).Start; end; procedure TfrMain.actStyleExecute(Sender: TObject); begin actStyle.Checked := not actStyle.Checked; if actStyle.Checked then frMain.StyleBook := sb3 else frMain.StyleBook := sb2; end; Gruß Kostas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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