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 DragDrop zwischen Controls bei OnClick und PopUpMenü (https://www.delphipraxis.net/60149-dragdrop-zwischen-controls-bei-onclick-und-popupmenue.html)

Pichel 3. Jan 2006 21:02


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:
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;
Hier ist nur das Problem, daß ein DragDrop mit der linken Maustaste ausgelöst wird und somit das OnClick-Event entfällt.

Mache ich das ganze manuell (DragMode = dmManual):

Delphi-Quellcode:
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;
...dann das Problem, es kommt kein Popup-Menü mehr. Übel.

Der_Unwissende 3. Jan 2006 21:43

Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
 
Zitat:

Zitat von Pichel
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.

Hi,
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

Pichel 3. Jan 2006 21:50

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

Der_Unwissende 3. Jan 2006 21:52

Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
 
Zitat:

Zitat von Pichel
hätte ich bei den unzähligen Versuchen eigentlich drauf kommen müssen, aber auf die einfachsten Dinge kommt man meistens nicht :wall:

Wem sagst du das? Hoffe es funktioniert dann auch,
Gruß Der Unwissende

Pichel 3. Jan 2006 22:33

Re: DragDrop zwischen Controls bei OnClick und PopUpMenü
 
Hab jetzt mal auf die Schnelle rumgespielt:

Delphi-Quellcode:
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;
Muß nur noch den Cursor wechseln, am besten wohl während des onMouseMove.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 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