AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi FMX XE8 - StylesData lässt sich nicht ändern
Thema durchsuchen
Ansicht
Themen-Optionen

FMX XE8 - StylesData lässt sich nicht ändern

Ein Thema von QuickAndDirty · begonnen am 23. Dez 2015 · letzter Beitrag vom 29. Dez 2015
Antwort Antwort
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#1

FMX XE8 - StylesData lässt sich nicht ändern

  Alt 23. Dez 2015, 17:11
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.
Angehängte Dateien
Dateityp: zip Styles.zip (69,0 KB, 3x aufgerufen)
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 23. Dez 2015, 19:40
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.
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#3

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 24. Dez 2015, 10:04
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.
Es sind nicht 4 text elemente, das ist nur eine test Anwendung.

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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 25. Dez 2015, 20:26
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).
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#5

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 25. Dez 2015, 23:29
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
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 28. Dez 2015, 11:25
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';
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (28. Dez 2015 um 12:01 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 28. Dez 2015, 12:45
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 28. Dez 2015, 14:08
Also wenn ich mir über das StyleBook einen benutzerdefinierten Style FooItemStyle für ein TListBoxItem anleg und dort ein TText drauf klatsche und dem gebe ich dann als StyleName moretext, dann
  • kann ich bei jedem Item per lItem.StylesData['moretext.Text'] := 'more foo'; die Daten unterjubeln
  • diese Daten anzeigen lassen, wenn ich lItem.StyleLookup := 'FooItemStyle'; setze
  • diese Daten wieder ausblenden, wenn ich lItem.StyleLookup := ''; setze

Um direkt an diese StyleRessource zu gelangen
Delphi-Quellcode:
var
  testv: TText;
  
  if Listboxitem2.FindStyleResource( 'moretext', testv ) then
    testv.Text := 'more foo';
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#9

AW: FMX XE8 - StylesData lässt sich nicht ändern

  Alt 29. Dez 2015, 11:21
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 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