Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OnMouseUp auf Parent-Panel auslösen (https://www.delphipraxis.net/72381-onmouseup-auf-parent-panel-ausloesen.html)

smudo 29. Jun 2006 14:38


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é

H4ndy 29. Jun 2006 14:50

Re: OnMouseUp auf Parent-Panel auslösen
 
Also praktisch funktioniert das hier:
(Ob's schön ist, wage ich aber zu bezweifeln ;))
Delphi-Quellcode:
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;
Ich prüfe ob das Panel einen Parent hat und ob dieses auch ein Panel ist.
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.

smudo 29. Jun 2006 15:05

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.

H4ndy 29. Jun 2006 15:14

Re: OnMouseUp auf Parent-Panel auslösen
 
Zitat:

Zitat von smudo
[...]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.

Du musst dann noch die Koordinaten für Parent umrechnen (Da jetzt ja 0,0 die obere linke Ecke des Child-Panels beschreibt). Du kannst aber auch meinen Vorschlag befolgen und anstelle von (Sender as TPanel).Parent nur Sender ans OnMouseUp übergeben um so das Clientpanel herauszubekommen:
Delphi-Quellcode:
procedure ParentMouseUp(Sender: Tobject,...);
var AusloeserPanel: TPanel;
begin
  AusloeserPanel := (Sender as TPanel);
  ...
end;

smudo 29. Jun 2006 15:28

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é

H4ndy 29. Jun 2006 15:44

Re: OnMouseUp auf Parent-Panel auslösen
 
Kein Problem, ich glaub wir haben aneinander vorbeigeredet ^^"
Probier mal folgendes:

Im OnMouseUp vom ClientPanel:
Delphi-Quellcode:
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);
Somit dürfte (theoretisch) das OnMouseUp des Parent mit den "richtigen" Koordinaten versehen sein.
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)

dataspider 29. Jun 2006 15:47

Re: OnMouseUp auf Parent-Panel auslösen
 
Zitat:

Zitat von smudo
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é

Es ist halt so, dass das Parentpanel von Windows keine Botschaft erhält.
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

smudo 29. Jun 2006 16:28

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.

smudo 29. Jun 2006 16:31

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:
TParentPanel.MouseUp(Button, Shift, Self.Left+X, Self.Top+Y);
Im Parentpanel habe ich zur Vereinfachung das übergeordnete TPanel gespeichert.


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