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

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

FMX XE8 - StylesData lässt sich nicht ändern

  Alt 23. Dez 2015, 16: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.560 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 23. Dez 2015, 18: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

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

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

  Alt 24. Dez 2015, 09: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.560 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 25. Dez 2015, 19: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

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

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

  Alt 25. Dez 2015, 22: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

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

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

  Alt 28. Dez 2015, 10: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 11:01 Uhr)
  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 04:50 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