![]() |
In eigener Komponente auf Klick reagieren
Morgen.
Ich habe eine Komponente von TCustomControl abgeleitet und möchte jetzt auf einen Klick reagieren. Ich verwende dafür die Botschaft WM_LBUTTONUP. Jetzt habe ich aber zwei Probleme: 1. Ich weiß nicht, wie ich die Mausposition auf der Komponente bekomme. Ich habe überlegt, dass das eventuell in lparam drinsteht, jeweils 16 Bit für X und Y-Position, aber das auslesen mit and und shr hat falsche Ergebnisse erzeugt. Ich mache es mit GetCursorPos(p) und ScreenToClient(p). Das geht, ist aber IMHO unelegant. 2. Ich denke, das müsste auch anders gehen als mit der Botschaft. Vor allem reagiert der Rahmen des Formulars, also z.B. der "Schließen"-Button nicht mehr auf Klicks. |
Re: In eigener Komponente auf Klick reagieren
Moin Manuel,
ich habe den Eindruck, dass Du es Dir zu schwer machst. TCustomControl bietet ja von sich aus das OnMouseUp (und auch OnClick, falls Du das benötigst) Nimm mal ein leeres Formular, und einen Button.
Delphi-Quellcode:
type
TMyCC = class(TCustomControl) end; implementation {$R *.dfm} procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ShowMessage('CLICK'); end; procedure TForm1.btn1Click(Sender: TObject); var MCC : TMyCC; begin MCC := TMyCC.Create(self); MCC.Parent := self; MCC.Width := 100; MCC.Height := 100; MCC.Left := 0; MCC.Top := 0; MCC.OnMouseUp := MyMouseUp; end; |
Re: In eigener Komponente auf Klick reagieren
Das ist mir klar, aber der Benutzer soll diese Events weiterhin nutzen können.
|
Re: In eigener Komponente auf Klick reagieren
Moin Manuel,
dann mach' die Eigenschaft OnClick doch sichtbar:
Delphi-Quellcode:
type
TMyCC = class(TCustomControl) public property OnClick; end; |
Re: In eigener Komponente auf Klick reagieren
Hallo Manuel,
die Methoden TControl.MouseDown, TControl.MouseMove und TControl.MouseUp sind als "protected dynamic" gekennzeichnet und können somit überschrieben werden. Gruß Hawkeye |
Re: In eigener Komponente auf Klick reagieren
Er soll auch OnMouseUp nutzen können, und das kann er ja dann nicht mehr, weil ich die schon belege.
EDIT: @Hawkeye: Ich wusste gar nicht, dass es die gibt. :mrgreen: Hab sie in der OH nicht gefunden. |
Re: In eigener Komponente auf Klick reagieren
Zitat:
Gruß Hawkeye |
Re: In eigener Komponente auf Klick reagieren
Moin Manuel,
und so:
Delphi-Quellcode:
type
TMyCC = class(TCustomControl) private FOnMouseUp : TMouseEvent; procedure MouseUp(Button: TMouseButton;Shift: TShiftState; X, Y: Integer); override; public property OnMouseUp read FOnMouseUp write FOnMouseUp; end; procedure TMyCC.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; ShowMessage('INTERNAL'); if Assigned(FOnMouseUp) then FOnMouseUp(self,Button,Shift,x,y); end; |
Re: In eigener Komponente auf Klick reagieren
Hallo,
Zitat:
Delphi-Quellcode:
Gruß
type
TMyCC = class(TCustomControl) protected procedure MouseUp(Button: TMouseButton;Shift: TShiftState; X, Y: Integer); override; published property OnMouseUp; end; procedure TMyCC.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; ShowMessage('INTERNAL'); end; xaromz |
Re: In eigener Komponente auf Klick reagieren
Egal, ich überschreibe jetzt einfach MouseUp. Die OH ist schon recht gut, nur unter den Methoden von TCustomControl stand das AFAIR nicht drin. Ist ja egal, es geht jetzt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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