Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FMX XE8 - StylesData lässt sich nicht ändern (https://www.delphipraxis.net/187697-fmx-xe8-stylesdata-laesst-sich-nicht-aendern.html)

QuickAndDirty 23. Dez 2015 16:11

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.

Harry Stahl 23. Dez 2015 18:40

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.

QuickAndDirty 24. Dez 2015 09:04

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

Zitat von Harry Stahl (Beitrag 1325157)
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?

Harry Stahl 25. Dez 2015 19:26

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).

QuickAndDirty 25. Dez 2015 22:29

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

QuickAndDirty 28. Dez 2015 10:25

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';

QuickAndDirty 28. Dez 2015 11:45

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.

Sir Rufo 28. Dez 2015 13:08

AW: FMX XE8 - StylesData lässt sich nicht ändern
 
Also wenn ich mir über das StyleBook einen benutzerdefinierten Style
Delphi-Quellcode:
FooItemStyle
für ein
Delphi-Quellcode:
TListBoxItem
anleg und dort ein
Delphi-Quellcode:
TText
drauf klatsche und dem gebe ich dann als
Delphi-Quellcode:
StyleName
moretext, dann
  • kann ich bei jedem Item per
    Delphi-Quellcode:
    lItem.StylesData['moretext.Text'] := 'more foo';
    die Daten unterjubeln
  • diese Daten anzeigen lassen, wenn ich
    Delphi-Quellcode:
    lItem.StyleLookup := 'FooItemStyle';
    setze
  • diese Daten wieder ausblenden, wenn ich
    Delphi-Quellcode:
    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';

QuickAndDirty 29. Dez 2015 10:21

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 14:31 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