![]() |
FMX XE8 - StylesData lässt sich nicht ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Ich erzeuge zwei TListboxItems in einer TListbox.
Auf ListboxItem1 lege ich z.b. 4 TTEXT controls. Ich setzte den Stylename für Listboxitem1 und verwende diesen stylename als stylelookup in listboxitem2. Warum kann ich nicht auf die TText-Controls in Listboxitem1 zugreifen? Was muss ich tun damit das geht?
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.ListBox, FMX.Layouts; type TForm1 = class(TForm) ListBox1: TListBox; ListBoxItem1: TListBoxItem; ListBoxItem2: TListBoxItem; Text1: TText; Text2: TText; Text3: TText; Text4: TText; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); var testv:Ttext; aitem:TListboxItem; begin Listboxitem2.StylesData['textro.Text'] := 'TEST'; //macht nichts //macht nichts testv := TText(Listboxitem2.FindStyleResource('meinlistboxitemstyle.textro')); if Assigned(testv) then testv.Text := 'BLA'; //macht nichts testv := TText(Listboxitem2.FindStyleResource('textro')); if Assigned(testv) then testv.Text := 'BLA2'; end; end. Ich habe das mal in ein mini-Testprojekt gepackt. |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Das funktioniert ein wenig anders mit den Styles. Du musst einen Style in einem Style-Book anlegen, danach kannst Du dann mit FindStyleresourc suchen.
Also auf das Listbox-Item klicken, rechte Maustaste und dann Benutzerdefinierten Style erstellen wählen. In das Listbox-Item des Styles (also im Style-Editor) fügst Du dann das TText-Element ein. |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Zitat:
Der Style Editor vom Stylebook ist halt sehr verbuggt, muss da immer mehrmals Delphi neustarten deswegen habe ich einen recht komplizierten style im Formular in der Listbox als Template erstellt. Da es ja geht und man so einen Style ertellen kann und er auch angewendet wird müsste man ihn doch auch irgendwie mit werten füllen können oder? |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Nur ist das dann nicht wirklich ein Style, sondern ein Mix von Komponenten. Da sucht man ja normalerweise mit "Findcomponent". Es mag ja sein, dass die Zuweisung einer Komponente mit einem innerhalb des Formulars erstellen Style funktioniert (indem Du den Komponenten einen Stylenamen verpasst), aber ob dieser "Style" auch bei der Verwendung mit "FindstyleResource", geht, weiß ich nicht (Du müsstest hier der Funktion bei Aufruf einmal im Debug-Modus folgen und schauen, was da verwendet wird). Würde ich mal eher nicht annehmen, sondern davon ausgehen, dass das für die Styles aus dem Style-Book gedacht ist.
Willst Du einen richtigen Style bauen, musst Du dafür den Style-Designer verwenden, wie von mir beschrieben. Die Qualität des Designers von Delphi 10 Seattle ist hier noch mal deutlich besser, als unter XE8, damit kann man schon arbeiten (auch wenn man das eine oder andere noch beachten muss). |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Intern verwendet Delphi getSytleObject um den style darzustellen in dem moment wo ApplyStyle passiert glaube ich.
Warum StylesData nicht die selbe Methode benutzt verstehe ich nicht. Findcomponent auf einen Style anzuwenden habe ich noch nicht versucht. Mals sehen ob das was bringt. Macht aber eigentlich nur sinn wenn "Stylename" ein Object zu einem Prototypen macht wie man das aus Javascript kennt |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Eine andere Idee dazu hat keiner, oder?
Ich hab herausgefunden das folgendes funktioniert....
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.ListBox, FMX.Layouts, FMX.ScrollBox, FMX.Memo; type TForm1 = class(TForm) ListBox1: TListBox; ListBoxItem2: TListBoxItem; Text1: TText; Text2: TText; Text3: TText; Text4: TText; Button1: TButton; ListBoxItem1: TListBoxItem; StyleBook1: TStyleBook; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} Function GetControlByStylename(aControl:TControl;aStylename:String):TControl; var i:integer; fcontrol:tControl; begin fcontrol:= nil; Result := nil; if aControl <> nil then begin For i := 0 to aControl.Controlscount-1 do Begin if aControl.Controls[i].StyleName = aStylename then Begin Result := aControl.Controls[i]; break; End; fcontrol := GetControlByStylename(aControl.Controls[i],aStylename); if fcontrol <> nil then Begin Result := fcontrol; break; End; End; end; end; procedure TForm1.Button1Click(Sender: TObject); var testv:Ttext; aitem:TListboxItem; i:Integer; begin { Listboxitem2.StyleLookup := 'meinlistboxitemstyle'; Listboxitem2.StylesData['textro.Text'] := 'TEST'; testv := TText(Listboxitem2.FindStyleResource('meinlistboxitemstyle.textro')); if Assigned(testv) then testv.Text := 'BLA'; testv := TText(Listboxitem2.FindStyleResource('textro')); if Assigned(testv) then testv.Text := 'BLA2'; } memo1.Lines.Clear; aItem := TListboxItem(Listboxitem2.Controls[0]); for i := 0 to aItem.ControlsCount-1 do Begin Memo1.Lines.Add(aItem.Controls[i].stylename+', '+aItem.Controls[i].classname ); End; testv := TText(GetControlByStylename(Listboxitem2,'textro')); if assigned(testv) then testv.Text := 'HHHHHH'; |
AW: FMX XE8 - StylesData lässt sich nicht ändern
ok ein kleines Update
Ich habs!!!! Wenn man einen Style auf einem Formular erstellen will muss man ihn auf einem TLayout erstellen. Dann funktioniert auch StylesData; Man kann ein TlistboxItem zwar auch einen Stylename geben...der funktioniert aber nicht mit Stylesdata.
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.ListBox, FMX.Layouts, FMX.ScrollBox, FMX.Memo; type TForm1 = class(TForm) ListBox1: TListBox; ListBoxItem2: TListBoxItem; Text1: TText; Text2: TText; Text3: TText; Text4: TText; Button1: TButton; ListBoxItem1: TListBoxItem; StyleBook1: TStyleBook; Memo1: TMemo; Layout1: TLayout; ListBoxItem3: TListBoxItem; Text5: TText; Text6: TText; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} Function GetControlByStylename(aControl:TControl;aStylename:String):TControl; var i:integer; fcontrol:tControl; begin fcontrol:= nil; Result := nil; if aControl <> nil then begin For i := 0 to aControl.Controlscount-1 do Begin if aControl.Controls[i].StyleName = aStylename then Begin Result := aControl.Controls[i]; break; End; fcontrol := GetControlByStylename(aControl.Controls[i],aStylename); if fcontrol <> nil then Begin Result := fcontrol; break; End; End; end; end; procedure TForm1.Button1Click(Sender: TObject); var testv:Ttext; aitem:TListboxItem; i:Integer; begin Listboxitem2.StylesData['textro.Text'] := 'TEST';// Das geht nicht Listboxitem3.StylesData['textllo.Text'] := 'TEST';// das geht!!!!!!!!!!!!!!!!!!!!!! { testv := TText(Listboxitem2.FindStyleResource('meinlistboxitemstyle.textro')); if Assigned(testv) then testv.Text := 'BLA'; testv := TText(Listboxitem2.FindStyleResource('textro')); if Assigned(testv) then testv.Text := 'BLA2'; } memo1.Lines.Clear; aItem := TListboxItem(Listboxitem2.Controls[0]); for i := 0 to aItem.ControlsCount-1 do Begin Memo1.Lines.Add(aItem.Controls[i].stylename+', '+aItem.Controls[i].classname ); End; testv := TText(GetControlByStylename(Listboxitem2,'textro')); if assigned(testv) then testv.Text := 'HHHHHH'; end; end. |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Also wenn ich mir über das StyleBook einen benutzerdefinierten Style
Delphi-Quellcode:
für ein
FooItemStyle
Delphi-Quellcode:
anleg und dort ein
TListBoxItem
Delphi-Quellcode:
drauf klatsche und dem gebe ich dann als
TText
Delphi-Quellcode:
moretext, dann
StyleName
Um direkt an diese StyleRessource zu gelangen
Delphi-Quellcode:
var
testv: TText; if Listboxitem2.FindStyleResource( 'moretext', testv ) then testv.Text := 'more foo'; |
AW: FMX XE8 - StylesData lässt sich nicht ändern
Ja , da bei mir der style editor aber mehrmals am tag abstürzt und mich zwingt die XE8 IDE neu zustarten haben ich die Styles auf einem extra template Formular angelegt.
Das war mein Problem: -Ich kann in einem TListBoxItem TText,TSpeedbutton und TGlyph elemente anlegen -Ich kann diesem TListboxItem einen Stylenamen im Objektinspektor geben -Ich kann diesen Stylenamen einem anderen TListboxItem in dieser Anwendung als Stylelookup geben -Das TListboxItem Zeigt dann denn Style aus Stylelookup an. -Die Eigenschaften des Styles sind dann aber nicht im per Findstyleressource oder StylesData verfügbar. Meine Lösung: -Ich kann in einem TLayout TText,TSpeedbutton und TGlyph elemente anlegen -Ich kann diesem TLayout einen Stylenamen im Objektinspektor geben -Ich kann diesen Stylenamen einem TListboxItem in dieser Anwendung als Stylelookup geben -Das TListboxItem Zeigt dann denn Style aus Stylelookup an. -Die Eigenschaften des Styles sind dann auch per Findstyleressource oder StylesData verfügbar und änderbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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