AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnMouseUp auf Parent-Panel auslösen

Offene Frage von "smudo"
Ein Thema von smudo · begonnen am 29. Jun 2006 · letzter Beitrag vom 29. Jun 2006
Antwort Antwort
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#1

OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 13:38
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é
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#2

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 13:50
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.
Manuel
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#3

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 14:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#4

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 14:14
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;
Manuel
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#5

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 14:28
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é
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#6

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 14:44
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)
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 14:47
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
Frank Reim
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#8

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 15:28
@dataspider - das klingt schon sehr interessant, hab ich auch übernommen.
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.
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#9

Re: OnMouseUp auf Parent-Panel auslösen

  Alt 29. Jun 2006, 15:31
@H4ndy: Sorry, hab übersehen, dass du auch noch was geschrieben hattest. Deine Lösung ist soweit richtig, ich habs noch ein wenig anders:
TParentPanel.MouseUp(Button, Shift, Self.Left+X, Self.Top+Y); Im Parentpanel habe ich zur Vereinfachung das übergeordnete TPanel gespeichert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz