Also ist Cpl.Controls[0] quasi das TCategoryPanelSurface und dieses enthält alle Controls.
So ist es.
Um an die einzelnen Controls zu kommen müsste ich jetzt Cpl.Controls[0].Controls[i] verwenden, was aber nicht geht.
Daher muss ich die Typumwandlung mit as wohl machen
Eigentlich reicht hier auch eine Umwandlung in TWinControl, denn dort wurden die Eigenschaften Controls und ControlCount eingeführt.
Aber da ich ja auch lernen und verstehen will,
warum funtkioniert z.B. bei einem TPanel Components/ComponentCount, bei einem TCategoryPanel aber nicht, bzw. wieso hat TCategoryPanel dieses Surface, was alle Controls enthält?
Das ist ein durchaus übliches Pattern (siehe auch TCategoryButtons). Die Instanz von TCategoryPanelSurface ist nicht unbedingt genau ein TCategoryPanelSurface, sondern kann auch davon abgeleitet sein. Die tatsächlich verwendete Klasse wird in der virtuellen Methode GetCategoryPanelSurfaceClass bestimmt, die in einer Ableitung von TCategoryPanel durchaus etwas anderes zurückgeben kann.
Und woran erkennt man sowas bei einer Komponente oder muss man die ganze Klasse durchstöbern, ob man irgendwo ein TXyzSurface findet?
Ich finde sowas eigentlich immer durch Analyse der Sourcen (mach ich immer als Erstes, wenn eine neue Version rauskommt). Gerade für diesen Fall führt ein Blick in die Methode GetChildren meist schnell in die richtige Richtung.
So ein schickes
UML-Diagramm wäre da sicher ganz hilfreich, aber das müsste nicht nur jemand einmal erstellen, sondern auch regelmäßig pflegen. Bis dahin gilt:
Use the source, Luke!