AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TCategoryPanel.ControlCount immer = 1
Thema durchsuchen
Ansicht
Themen-Optionen

TCategoryPanel.ControlCount immer = 1

Ein Thema von Nils S. · begonnen am 20. Mär 2015 · letzter Beitrag vom 3. Mai 2015
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.679 Beiträge
 
Delphi 12 Athens
 
#1

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 07:19
Das TCategoryPanel hat nur ein einziges Child-Control vom Typ TCategoryPanelSurface. In diesem stecken dann die einzelnen Conrols, die du sehen kannst. Du musst also nicht über die Controls von TCategoryPanel iterieren, sonden über die des TCategoryPanelSurface, was du über Cpl.Controls[0] erreichts. Die Typumwandlung mittels as ist wohl nicht mal nötig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nils S.

Registriert seit: 10. Apr 2014
36 Beiträge
 
Delphi XE5 Professional
 
#2

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 07:46
Achso.

Also ist Cpl.Controls[0] quasi das TCategoryPanelSurface und dieses enthält alle Controls.

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 (die Schleife klappt jetzt sogar ).

Aber da ich ja auch lernen und verstehen will,
warum funtkioniert z.B. bei einem TPanel Controls/ControlCount, bei einem TCategoryPanel aber nicht, bzw. wieso hat TCategoryPanel dieses Surface, was alle Controls enthält?
Und woran erkennt man sowas bei einer Komponente oder muss man die ganze Klasse durchstöbern, ob man irgendwo ein TXyzSurface findet?

Geändert von Nils S. ( 3. Mai 2015 um 08:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.679 Beiträge
 
Delphi 12 Athens
 
#3

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 08:18
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!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.398 Beiträge
 
Delphi 12 Athens
 
#4

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 11:30
Die Typumwandlung mittels as ist wohl nicht mal nötig.
Doch ist ist, denn was passiert wohl, wenn Emba diese Komponente mal umbaut?
Wenn man ein undokumentiertes Verhalten benutzt, dann sollte man wenigstens eine "kleine" Sicherheitsprüfung einbauen.
Oder man benutzt gleich den "offiziellen" Weg.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 12:11
Ein Control brauche ich nicht zu casten wenn ich davon die ChildControls haben möchte.

Wenn Emba diese Komponente umbaut und es kommen keine Controls dann kompiliert das Programm nicht. Mit einem Cast stelle ich das dann zur Laufzeit fest.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.679 Beiträge
 
Delphi 12 Athens
 
#6

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 12:25
Ein Control brauche ich nicht zu casten wenn ich davon die ChildControls haben möchte.
Genauer gesagt: ein TWinControl
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.398 Beiträge
 
Delphi 12 Athens
 
#7

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 12:38
Jupp, .Controls steckt im WinControl, bzw. genauer in TControl, aber egal.

Wenn die es mal umbauen und man bekommt ein anderes Control, dann wird man darüber vermutlich nicht die gewünschten Child-Controls erhalten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.879 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TCategoryPanel.ControlCount immer = 1

  Alt 3. Mai 2015, 13:05
Wenn nan das mal umbauen sollte, was sehr unwahrscheinlich ist, würde noch mehr nicht mehr funktionieren. Deshalb jetzt unnötige Cast durchzuführen ist imho nicht nltig. Dann müsstest Du auch alle andeten Properties casten, wer garantiert Dir das eine Caption in der Zukunft noch ein String ist?
Markus Kinzler
  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 16:17 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