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)
Code:
-TStyleLookupPropertyValues.GetValues(Proc: TGetStrProc);
-> Hat 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. (Einige werden geskippt)
Bin gerade zu müde den Code zu extrahieren / selbst auszuführen / zu debuggen, aber das sollte es sein.