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 Drag&Drop startet beim Doppelklick automatisch (https://www.delphipraxis.net/214503-drag-drop-startet-beim-doppelklick-automatisch.html)

Alallart 21. Jan 2024 18:21

Drag&Drop startet beim Doppelklick automatisch
 
Ich hab bisher wenig mit D&D gearbeitet, deshalb finde ich den Fehler nicht. Hier ein Beispiel mit zwei Panelen, die gegenseitig die Caption wechseln. Es funktioniert. Das Problem ist aber, dass wenn ich eines der Panele doppelklicke, ebenfalls der Drag beginnt. Sollte eigentlich nicht. Danach muss ich den Vorgang erst mit ESC wieder abbrechen.

Natürlich greifen beide Panele auf die gleiche Prozeduren.

Delphi-Quellcode:
procedure TForm1.Panel1DblClick(Sender: TObject);
begin
  ShowMessage('Das war ein Doppelklick');
end;

procedure PositionWechseln(Sender, Source: TObject);
var
  Temp: String;
begin
  if (Sender is TPanel) and (Source is TPanel) then
  begin
    Temp := TPanel(Sender).Caption;
    TPanel(Sender).Caption := TPanel(Source).Caption;
    TPanel(Source).Caption := Temp;
  end;
end;

procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  TempName: String;
begin
  if (Source is TPanel) then
    PositionWechseln(Sender, Source);
end;

procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if (Source is TPanel) then
    Accept := True;
end;

procedure TForm1.Panel1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  if (Target = nil) then
    MessageBeep(0); // Wenn Drag'n'Drop-Operation nicht erfolgreich abeschlossen wurde...
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TPanel) then
    if Button = mbLeft then
      TPanel(Sender).BeginDrag(False, 10);
end;

jaenicke 21. Jan 2024 18:46

AW: Drag&Drop startet beim Doppelklick automatisch
 
Auch bei einem Doppelklick drückst du die Maustaste logischerweise, also landest du auch im MouseDown. Zu dem Zeitpunkt kann Windows ja auch noch nicht wissen, ob du erneut klicken wirst.

Du kannst im MouseUp an der gleichen Stelle den Dragvorgang aber direkt wieder abbrechen oder du stellst DragMode auf automatisch, dann sollte das automatisch richtig laufen.

Uwe Raabe 22. Jan 2024 00:30

AW: Drag&Drop startet beim Doppelklick automatisch
 
Ich kann das hier nicht reproduzieren. Mit den übergebenen Parametern bei BeginDrag ist das auch zu erwarten. Es muss also noch etwas anderes sein. Kannst du ein Beispielprojekt hier anhängen, damit wir mehr Informationen kriegen?

Stolle58 22. Jan 2024 08:55

AW: Drag&Drop startet beim Doppelklick automatisch
 
Benutze Lieber das Event MouseMove.

So mache Ich das jedenfalls.

Delphi-Quellcode:
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Shift = [ssLeft] then
  begin
    BeginDrag(True, 10);
  end;
end;

Alallart 22. Jan 2024 09:54

AW: Drag&Drop startet beim Doppelklick automatisch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1532358)
Ich kann das hier nicht reproduzieren. Mit den übergebenen Parametern bei BeginDrag ist das auch zu erwarten. Es muss also noch etwas anderes sein. Kannst du ein Beispielprojekt hier anhängen, damit wir mehr Informationen kriegen?

Anbei der Quellcode des Beispielprojekts. Um das Problem zu reproduzieren eines der Panele doppelklicken.

Alallart 22. Jan 2024 09:59

AW: Drag&Drop startet beim Doppelklick automatisch
 
Zitat:

Zitat von Stolle58 (Beitrag 1532361)
Benutze Lieber das Event MouseMove.

Ich habe es gerade ausprobiert, scheint zu klappen. Bisher keine Probleme.

Danke.

Uwe Raabe 22. Jan 2024 13:04

AW: Drag&Drop startet beim Doppelklick automatisch
 
So sollte es auch gehen:
Delphi-Quellcode:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  { bei DblClick enthält Shift noch ein ssDouble, aber auch alles andere außer ssLeft soll ja vermutlich kein Drag auslösen }
  if (Sender is TPanel) and (Button = TMouseButton.mbLeft) and (Shift = [ssLeft]) then
    TPanel(Sender).BeginDrag(False, 10);
end;
Bei einem Doppelklick werden ja auch zwei MouseDown Events ausgelöst. Den zweiten erkennt man mit
Delphi-Quellcode:
ssDouble in Shift
.


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