Ich benutze in einem Programm Drag n Drop schon seit sehr langer Zeit für Edits was immer funktioniert.
Jetzt kommt aber noch ein TImage hinzu und da komme ich nicht weiter.
Das hier rufe ich beim Programmstart auf. Alles was unnötig ist (alle anderen Komponenten die angesteurt werden) habe ich entfernt.
Delphi-Quellcode:
procedure TDragDropHandler.DragDropAcceptFilesGlobal(const aForm: TForm; const Accept: LongBool);
begin
DragAcceptFiles(MainForm.Image1.Canvas.Handle, Accept);
end;
Ausgewertet wird hier
Delphi-Quellcode:
procedure TDragDropHandler.DragDropHandleProcess(Wnd: HWND; Path: string);
begin
if Assigned(MainForm) and (Wnd = MainForm.Image1.Canvas.Handle) then
MainForm.X := Y;
end;
Und hier wird DragDropHandleProcess angesteuert
Delphi-Quellcode:
procedure TComponents.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
const
BufferLength = 255;
var
QtyDroppedFiles, FileIndex: Integer;
pDroppedFilename: array [0 .. BufferLength] of Char;
begin
Handled := False;
case Msg.message of
WM_DROPFILES:
begin
QtyDroppedFiles := DragQueryFile(Msg.WParam, Cardinal(-1), nil, 0);
try
for FileIndex := 0 to QtyDroppedFiles - 1 do
begin
DragQueryFile(Msg.WParam, FileIndex, @pDroppedFilename, BufferLength);
TDragDropHandler.DragDropHandleProcess(Msg.HWND, PChar(@pDroppedFilename));
Break;
end;
finally
DragFinish(Msg.WParam);
Handled := True;
end;
end;
end;
end;
TImage hat kein
Handle und das vom Canvas scheint nicht zu funktionieren. Ich könnte das umschreiben, sodass ich kein
Handle mehr übergebe sondern die Komponente selber, also TWinControl oder vielleicht TComponent als Parameter.
Jetzt aber die Frage. Was schreibe ich in
DragDropAcceptFilesGlobal, damit Drag n Drop akzeptiert wird? Bei einem Edit zum Beispiel wäre das Edit1.Handle.
Als kleinen Pfusch könnte man ein StaticText über das Image legen, ohne Caption. Das hat ein
Handle.