AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Drag&Drop startet beim Doppelklick automatisch
Thema durchsuchen
Ansicht
Themen-Optionen

Drag&Drop startet beim Doppelklick automatisch

Ein Thema von Alallart · begonnen am 21. Jan 2024 · letzter Beitrag vom 22. Jan 2024
Antwort Antwort
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#1

Drag&Drop startet beim Doppelklick automatisch

  Alt 21. Jan 2024, 18:21
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;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 21. Jan 2024, 18:46
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 22. Jan 2024, 00:30
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Stolle58

Registriert seit: 4. Aug 2023
Ort: Frankfurt
25 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 22. Jan 2024, 08:55
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;
Reinhold
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#5

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 22. Jan 2024, 09:54
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.
Angehängte Dateien
Dateityp: zip DP_DragAndDrop_Problem.zip (2,0 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#6

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 22. Jan 2024, 09:59
Benutze Lieber das Event MouseMove.
Ich habe es gerade ausprobiert, scheint zu klappen. Bisher keine Probleme.

Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Drag&Drop startet beim Doppelklick automatisch

  Alt 22. Jan 2024, 13:04
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 ssDouble in Shift .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 02:43 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