AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie DragDrop-Ende signalisieren?

Ein Thema von Benmik · begonnen am 1. Jan 2022 · letzter Beitrag vom 2. Jan 2022
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#1

Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 16:43
In meinem Programm realisiere ich DragDrop sowohl innerhalb der Delphi-Anwendung als auch nach außerhalb; Letzteres mit der The-Drag-and-Drop-Component-Suite-for-Delphi von Sven Harazim (ehemals Anders Melander). Das funktioniert auch.

Wenn ich anfange, ein Objekt zu ziehen, dann startet Delphi DragDropBegin - zu diesem Zeitpunkt ist ja noch nicht klar, wohin das Objekt geht. Wenn ich es nun in ein anderes Windows-Programm außerhalb der Delphi-Anwendung ziehe und dann wieder zurückkehre, dann hat die Delphi-Anwendung nicht mitbekommen, dass DragDrop vorbei ist. Es gibt zwar bei der Komponente das Ereignis AfterDrop, das auch ausgelöst wird, aber es gelingt mir nicht, damit das Delphi-DragDrop abzubrechen, und auch das manuelle Setzen des Mauszeiger zeigt keine Wirkung. Müsste man sowas wie DragFinish senden, und wenn ja, wie? Oder wie macht man das?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 17:30
Kannst du mal ein minimales Codebeispiel zeigen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 19:48
Hallo Uwe,

Frohes Neues Jahr!

Anbei ein Minimalbeispiel, leider muss dazu die erwähnte Komponente installiert sein. Das Beispiel besteht lediglich aus der Form mit einem TPanel darauf, dazu noch ein DropFileSource. Für die Demonstration muss es die Datei "C:\Temp\Test01.jpg" noch nicht mal geben.

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  Panel1.Caption := 'C:\Temp\Test01.jpg';
  Panel1.DragMode := dmAutomatic;
end;

procedure TForm3.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  DropFileSource1.Files.Clear;
  DropFileSource1.Files.Add(Panel1.Caption);
end;

procedure TForm3.DropFileSource1GetDragImage(Sender: TObject; const DragSourceHelper: IDragSourceHelper; var Handled: Boolean);
var
  Pt: TPoint;
begin
  GetCursorPos(Pt);
  Handled := Succeeded(DragSourceHelper.InitializeFromWindow(Panel1.Handle, Pt, TCustomDropSource(Sender) as IDataObject));
end;

procedure TForm3.Panel1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  DropFileSource1.Execute(False);
end;

Geändert von Benmik ( 1. Jan 2022 um 19:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
902 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 21:15
Wenn du das StartDrag-Event des Panels benutzt, dann sollte das Ende beim OnEndDrag-Event des Panels behandelt werden können. Oder kommt das auch nicht an?
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 21:59
Das OnEndDrag-Event des Panels findet nicht statt, wenn ich zur Anwendung zurückkehre (z.B. mit ALT-TAB), sondern erst, wenn ich wieder auf das Panel klicke. Bis dahin zeigt der Mauszeiger aber "Kein-DragDrop" und die DragDrop-Aktion ist offensichtlich noch nicht abgeschlossen, was ich gern programmatisch erreichen würde.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wie DragDrop-Ende signalisieren?

  Alt 1. Jan 2022, 23:01
Wenn du DragSource.Execute(False) (oder nur Execute) aufrufst, wird das DragDrop synchron gestartet und gibt im Result das Ergebnis der Operation zurück. Damit das VCL-Dragging nicht weiter dazwischen funkt, solltest du das über einen Aufruf von Abort am Ende des StartDrag-Events beenden.

Das sollte insbesondere auch beim asynchronen Aufruf erfolgen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:34 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