![]() |
MouseDown Procedure einer Instanz überschreiben
Die Ausgangslage:
Alle myComponent haben ein Panel als Attribut, nennen wir es FPanel. myComponent übeschreibt die MouseDown procedure von TControl und schreibt da was nützliches rein. Was ich erreichen möchte: Wenn ich auf das FPanel einer Komponente vom Typ myComponent klicke, soll die Logik, die in der MousDown procedure von myComponent liegt, ausgeführt werden. Das soll natürlich NUR für FPanel, also einer Instanz von Panel gelten, NICHT für alle Panels. Diese Änderung soll allerdings für ALLE myComponent gelten. Das heist im Designer mit den Events rumspielen bringt mir nichts. Ich muss die Änderungen in der Komponentendefinition von myComponent machen. Ich stehe da grad aufm Schlauch. Irgendwelche Ideen? :) |
AW: MouseDown Procedure einer Instanz überschreiben
Ich bin nicht sicher, ob ich Dich richtig verstanden habe, aber wieso leitest Du nicht das Panel von TPanel ab und überschreibst dort das MouseDown? Falls ich falsch liegen sollte, wäre etwas Code hilfreich.
|
AW: MouseDown Procedure einer Instanz überschreiben
Weil ich dann eine neue Komponente nur für diese Panels hätte. Das wäre zwar eine Lösung, aber keine sehr saubere. Da klopfen mir meine Chefs bestimmt auf die Finger :P
Ich versuchs mal mit Code:
Delphi-Quellcode:
Wenn ich jetzt eine Form mit einer TMyComponent erstelle und ich zur Laufzeit auf den Teil der grafischen Repräsentation der Komponente klicke, der vom Panel "überdeckt" ist, wird so wie es ist nicht TMyComponent.MouseDown ausgeführt (weil das MouseEvent ja auf dem Panel stattfand). Soll es aber!
//aus einer Komponenten-Unit
type TMyComponent = class(...TControl) private FPanel : TPanel protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; [...] implementation procedure TMyComponent.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); begin //cool stuff end; Für jede Instanz von TMyComponent nen EventHandler für FPanel.OnMouseDown einzufügen und da TMyComponent.MouseDown aufzurufen kommt nicht in Frage. Diese Funktionalität muss in der Komponentendefinition von TMyComponent sichergestellt werden. TPanel selbst kann ich nicht verändern, weil diese Änderung natürlich nicht für alle TPanels gelten soll. |
AW: MouseDown Procedure einer Instanz überschreiben
Du kannst das Event doch einfach im Constructor von TMyComponent setzen. An der Stelle, an der du auch FPanel erzeugst.
|
AW: MouseDown Procedure einer Instanz überschreiben
Oder etwas ausführlicher:
Delphi-Quellcode:
type
TMyComponent = class(TWinControl) private FPanel: TPanel; procedure PanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; public constructor Create(AOwner: TComponent); override; end; ... constructor TMyComponent.Create(AOwner: TComponent); begin inherited; Width := 200; Height := 200; FPanel := TPanel.Create(self); FPanel.Parent := self; FPanel.OnMouseDown := PanelMouseDown; end; procedure TMyComponent.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; if Button = mbLeft then ShowMessage(Format('X: %d, Y: %d', [X, Y])); end; procedure TMyComponent.PanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin self.MouseDown(Button, Shift, X, Y); end; |
AW: MouseDown Procedure einer Instanz überschreiben
Ah, stimmt, so geht das im Prinzip :thumb:
Eine Frage dazu aber noch: In TMyComponent.MouseDown ist ein inheirited drin. Wenn ich den OnMouseDown-EventHandler von FPanel so umbiege, wie ihr das vorschlagt, wohin führt dann das inheirited, wenn ich auf das Panel klicke? Auf (Vorfahr von TPanel).MouseDown oder auf (Vorfahr von TMyComponent).MouseDown? Das ist leider ziemlich entscheidend für die Funktionalität... |
AW: MouseDown Procedure einer Instanz überschreiben
Der Code wird ja im Kontext Deiner Komponente ausgeführt, daher zeigt das inherited auf den Vorfahrcode der Komponente.
|
AW: MouseDown Procedure einer Instanz überschreiben
Ok, mal schauen ob das funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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