Hallo Delphianer,
ich bin gerade dabei mir für einen ganz speziellen Fall eine Komponente zu basteln. Dabei bin ich auf ein Problem gestoßen für das ich aktuell keine Lösung kenne und auch nur bedingt etwas im Internet (auch bei der
DP) gefunden hatte. Die vorhandenen Threads zu dem Thema haben mir leider nicht so wirklich weitergeholfen.
Nun hoffe ich, dass ihr das könnt.
Folgendes Szenario:
Ich habe folgende Klasse (allgemeingehaltene Namen zur besseren Übersicht):
Delphi-Quellcode:
TFoo = class(TCustomControl)
private
FSomeVar: TSomeType;
protected
procedure WM_Paint(var Msg: TMessage) message WM_PAINT;
public
property OnGetSubComponents;
end;
Delphi-Quellcode:
TFooBar = class(TCustomControl)
private
FSomeVar: TFoo;
protected
procedure WM_Paint(var Msg: TMessage) message WM_PAINT;
end;
Delphi-Quellcode:
TBar = class(TCustomControl)
private
FSomeVar: TFooBar;
protected
procedure WM_Paint(var Msg: TMessage) message WM_PAINT;
public
property OnGetSomeData;
end;
Jetzt habe ich das Problem, dass ich auf den Klick auf die TFoo Komponente reagieren können muss. Die einzige Möglichkeit die ich jetzt kennen würde wäre, das Event durchzuschleifen. Also in jeder Klasse ein
ObGetSubComponents
Event erstellen und dann den Weg
TFoo (Auslöser) --> TFooBar --> TBar
durchlaufen.
Irgendwie kommt mir das aber falsch vor.
Die andere Möglichkeit wäre, dass ich (hier geht es um eine Mausklickfunktion) die Mausposition bspw. auswerte und dann errechne wo ich bin. Aber die Subkomponente selbst bietet das ja schon durch die WM_LBUTTONDOWN Message an, sodass ich da eben gar nix mehr machen müsste.
Habe ich jetzt einen grundlegenden Denkfehler wie meine Klassen aufgebaut sind, oder gibt es genau hierfür schon bestimmte Lösungsansätze? Wie macht ihr das wenn ihr unterschiedliche Komponenten ineinander verschachteln müsst?
Bin über jeden Lösungsvorschlag dankbar. Falls noch Informationen fehlen sollten, dann kann ich die gerne zur Verfügung stellen.