![]() |
DragDrop zwischen Controls bei OnClick und PopUpMenü
Hallöchen.
Habe mich jetzt schon unsagbar lange damit rumgeschlagen (probieren, im Forum suchen etc) aber es geht nicht. Wenn ich TButton Controls per DragDrop verschieben will, um Ihre Reihenfolge zu verändern gibt es da ein großes Problem. Das OnClick des Button sowie das PopUpMenü wird benutzt. Normalerweise würde ich es so machen: (natürlich DragMode auf dmAutomatic setzen)
Delphi-Quellcode:
Hier ist nur das Problem, daß ein DragDrop mit der linken Maustaste ausgelöst wird und somit das OnClick-Event entfällt.
procedure TaForm.btDragDrop(Sender, Source: TObject; X, Y: Integer);
begin if Source.ClassType = TButton then begin // hier der Button-Tausch end; end; procedure TaForm.btDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := (Source.ClassType = TButton); end; Mache ich das ganze manuell (DragMode = dmManual):
Delphi-Quellcode:
...dann das Problem, es kommt kein Popup-Menü mehr. Übel.
procedure TaForm.btMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin {$ifdef BETA}DebugInfo:='aForm btMouseDown';{$endif} if (Sender.ClassType = TButton) and (Button = mbRight) then begin (Sender as TControl).BeginDrag(False); end; end; |
Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
Zitat:
hab jetzt mal einen Tipp, der dich begeistern wird, benutzt einfach nicht das OnClick-Event. Du weißt doch eigentlich was ein Click ist (MouseDown, MouseUp). Wann genau sollte das Ereignis eintreten? Natürlich sobald die Maustaste über dem Button losgelassen wird. Was macht ein Drag&Drop? Nun ja, Maustaste wird gedrückt, Maus wird bewegt! Maus wird losgelassen. Jetzt musst du dir eigentlich nur die Ausgangsposition der Maus merken, wenn diese gedrückt wird. Wird diese Position weit genug verändert, so lässt du einfach ein Drag zu. Wird die Maus losgelassen, so schaust du einfach nur, ob es sich um einen Drag&Drop handelt oder nicht. Entsprechend tritt dein OnClick-Code oder halt der Drag&Drop Code ein. Gruß Der Unwissende |
Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
Wenn ich das richtig verstanden habe, so soll ich also einfach die DragDrop-Funktionen beiseite lassen und im OnMouseDown mir den TButton merken. Im onMouseUp dann entweder die Buttons-Tauschen (in meinem konkreten Fall) oder den Click ausführen.
Klingt irgendwie gut, hätte ich bei den unzähligen Versuchen eigentlich drauf kommen müssen, aber auf die einfachsten Dinge kommt man meistens nicht :wall: Werde es gleich mal versuchen, dank'Dir |
Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
Zitat:
Gruß Der Unwissende |
Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
Hab jetzt mal auf die Schnelle rumgespielt:
Delphi-Quellcode:
Muß nur noch den Cursor wechseln, am besten wohl während des onMouseMove.
var myButton : TObject;
procedure TaForm.btMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Sender.ClassType = TButton) and (Button = mbLeft) then begin myButton := Sender; end; end; procedure TaForm.btMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Sender.ClassType = TButton) and (Button = mbLeft) then begin if myButton <> FindDragTarget((Sender as TControl).ClientToScreen(Point(X, Y)), True) then begin // DragDrop end else begin // Click OnClick(Sender); end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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