![]() |
OnMouseUp auf Parent-Panel auslösen
Hallo,
ich habe ein Parent-Panel vom Typ TPanel und darauf mehrere Panels platziert. Nun möchte ich, dass OnMouseUp nicht von den Clients, sondern vom Parent ausgelöst wird. Wie geht das zu machen? Danke René |
Re: OnMouseUp auf Parent-Panel auslösen
Also praktisch funktioniert das hier:
(Ob's schön ist, wage ich aber zu bezweifeln ;))
Delphi-Quellcode:
Ich prüfe ob das Panel einen Parent hat und ob dieses auch ein Panel ist.
procedure ChildPanel.OnMouseUp(Sender: TObject,...);
begin if (Sender is TPanel) then begin if (Sender as TPanel).Parent <> nil then begin if ((Sender as TPanel).Parent is TPanel) then begin ((Sender as TPanel).Parent as TPanel).OnMouseUp((Sender as TPanel).Parent,Button,Shift,X,Y); end; end; end; end; Wenn ja, dann löse ich dessen OnMouseUp mit den Parametern des Child-Panels aus. Edit: Du kannst auch "(Sender as TPanel).Parent" im Aufruf zu "Sender" ändern, damit du z.B. mitbekommst, welches Child-Panel das Ereignis ausgelöst/abbekommen hat. |
Re: OnMouseUp auf Parent-Panel auslösen
Das ist so schon ganz richtig, aber leider bekomme ich in diesem Falle nicht die richtigen Koordinaten. Diese brauche ich aber unbedingt.
Folgendes Problem: Wenn ich MouseUp auswerte, wird es für das Client-Panel ausgelöst, über welchem die Maustaste gedrückt wurde, egal, wohin ich die Maus in der Zwischenzeit bewegt habe. Deshalb möchte ich das Parent-Panel abfragen und anhand der Koordinaten auswerten, über welchem Client denn nun wirklich die Maustaste losgelassen wurde. |
Re: OnMouseUp auf Parent-Panel auslösen
Zitat:
Delphi-Quellcode:
procedure ParentMouseUp(Sender: Tobject,...);
var AusloeserPanel: TPanel; begin AusloeserPanel := (Sender as TPanel); ... end; |
Re: OnMouseUp auf Parent-Panel auslösen
Ich will jetzt nicht undankbar klingen, die von dir beschriebene Lösung verwende ich gerade, ich ging aber davon aus, dass es doch möglich sein muss, dass nicht die Client-Panels, sondern das Parent-Panel das Ereignis auslöst.
Trotzdem schon mal Danke René |
Re: OnMouseUp auf Parent-Panel auslösen
Kein Problem, ich glaub wir haben aneinander vorbeigeredet ^^"
Probier mal folgendes: Im OnMouseUp vom ClientPanel:
Delphi-Quellcode:
Somit dürfte (theoretisch) das OnMouseUp des Parent mit den "richtigen" Koordinaten versehen sein.
var Punkt: TPoint;
begin Punkt.X := X; Punkt.Y := Y; Punkt := (Sender as TPanel).ClientToScreen(Punkt); Punkt := ((Sender as TPanel).Parent as TPanel).ScreenToClient(Punkt); ((Sender as TPanel).Parent as TPanel).OnMouseUp((Sender as TPanel).Parent, Button, Shift, Punkt.X, Punkt.Y); Ein direktes Auslösen dürfte nicht möglich sein, glaub ich, da ja immer das ClientPanel im Weg sein wird (z.B. beim Mausklick simulieren) |
Re: OnMouseUp auf Parent-Panel auslösen
Zitat:
Du kannst dann nur ein eigenes TClientPanel von TPanel ableiten und im Constructor den ControlStyle neu setzen (ohne csCaptureMouse). Damit sollte das übergeordnete Steuerelement die Botschaft erhalten. Cu, Frank |
Re: OnMouseUp auf Parent-Panel auslösen
@dataspider - das klingt schon sehr interessant, hab ich auch übernommen.
:gruebel: Aber: Trotzdem wird das Ereignis im Parentpanel nicht ausgelöst, weil WM_MouseUp schon die Prozedur WM_MouseUp im Client-Panel ausgelöst hat, die gleiche Prozedur im Parent aber nicht mehr aufruft. |
Re: OnMouseUp auf Parent-Panel auslösen
@H4ndy: Sorry, hab übersehen, dass du auch noch was geschrieben hattest. Deine Lösung ist soweit richtig, ich habs noch ein wenig anders:
Delphi-Quellcode:
Im Parentpanel habe ich zur Vereinfachung das übergeordnete TPanel gespeichert.
TParentPanel.MouseUp(Button, Shift, Self.Left+X, Self.Top+Y);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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 by Thomas Breitkreuz