Einzelnen Beitrag anzeigen

Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
514 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: FMX-Styles : StyleLookup zu Controls zuordnen?

  Alt Gestern, 04:43
Bei vielen Komponenten stimmt es schon, aber ganz so einfach kann es doch nicht sein.
> T weglassen und nach dem Namen suchen

TSpeedButton oder TColorListBox stehen nicht in ihren Styles

TScrollBar und TSmallScrollBar stehen in ihren Styles, aber bei denen werden sie garnicht aufglistet, obwohl es mehrere Styles dafür gibt.

Oder beim TListBoxGroupHeader wird nur der listboxplainheader gefunden,
aber beim TListBoxItem passt es aber wieder, also mehreres mit listboxitem.

Dagegen, bei der TTreeView wird auch der treeviewitemstyle vom TTreeViewItem mit gelistet



Und für eine Rückwärtssuche wäre sowas auch extrem ungünstig.
Ich kann zwar einen Style für die Vorschau direkt anzeigen, aber in einer Komponente sieht es oft schon anders aus, weil da dann Teile umarrangiert werden.
Okay das mit dem TreeViewItems ist ja mal zu lustig, hatte auch schon komisches gesehen aber das noch nicht.

Ich hab interessenshalber mal nachgeschaut, weil ich das verhalten bei ListBoxItem so auch nicht kannte bzw es nicht realisiert habe.

In FMX.Controls in TStyledControl wird eine public const string definiert:

Delphi-Quellcode:
  TStyledControl = class(TControl)
  public const
    StyleSuffix = 'style';
  ...

Dann gibts in der selben Unit/Klasse noch diese drei Funktionen:
(aus lizenztechnischen Gründen nur die Header, sollte es erlaubt sein Code für solche zwecke zu zeigen, lasst es mich wissen)

Delphi-Quellcode:

function TStyledControl.GenerateStyleName(const AClassName: string): string; // 6 Zeilen Code
Die macht eigentlich nichts anderes als:
- Result = AClassName.
- Wenn Result mit TCustom beginnt, wird es weggeschnitten.
- Wenn Result mit T beginnt, wird es weggeschnitten.
- Result + StyleSuffix (style) wird zurückgegeben (Ja, die Funktion hat einen Bug wenn das Control mit TCustomT beginnt )

Hier kommt also das "buttonstyle", "labelstyle" usw her...

Es gibt dann noch diese zwei ein-zeiler/helper funktionen:

Delphi-Quellcode:
function TStyledControl.GetDefaultStyleLookupName: string; // Eine Zeile
function TStyledControl.GetParentClassStyleLookupName: string; // Eine Zeile
Ich nehme mal an bei ListBox haben Sie noch das Root Component geprüft und bei TreeView gar nichts. Man könnte jetzt weiter gehen und schauen wie genau Embarcadero das macht, aber wahrscheinlich findest du ne bessere Alternative.

Code:
PS ...\embarcadero\studio\23.0\source\fmx> Select-String -Path "./*.pas" -Pattern "GetParentClassStyleLookupName"
Findet bei mir 14 weitere Ergebnisse...

Edit: Hab bisschen weiter gestöbert und ich denke hier ist es definiert:

(\embarcadero\studio\23.0\source\Property Editors\FmxStyleLookup.pas)
  • In der Funktion TStyleLookupPropertyValues.GetValues(Proc: TGetStrProc)...
  • Hat noch eine sub-routine AddStylesForControl(const StyleObject: TFmxObject);
  • In der Hauptroutine GetValues wird als erstes TStyleLookupPropertyValues.GetStyledControl aufgerufen.
  • In GetStyledControl wird der DefaultStyleLookupName (von FMX.Controls.TStyledControl, siehe oben) benutzt um den default stylenamen zu kriegen. (z.b. buttonstyle)
  • Das "style" wird wieder entfernt. (also zurück zu button)
  • Es wird durch die styles gelooped und die matches werden als properties aufgelistet.
  • Ein paar Komponenten werden geskippt (definiert als hardcoded strings in der selben Datei)
Bin gerade zu müde den Code zu extrahieren / selbst auszuführen / zu debuggen, aber das sollte es sein.

Edit: Formatierung
Milos

Geändert von milos (Gestern um 21:50 Uhr)
  Mit Zitat antworten Zitat