Ich konnte mir jetzt erstmal so behelfen, dass ich den Drop für die gesamte Application freigeschaltet habe. Im DragOver prüfe ich , ob ein zulässiges Control unterm Cursor liegt und sende an dieses die Message. Dabei ist es egal auf welcher Form, Panel, etc die Listbox liegt.
Sollte noch wer eine bessere Möglichkeit gefunden haben, ist diese natürlich gern gesehen
Mainform
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
m_PDropTarget := PDropTarget.Create(Self.Handle, True);
end;
DropTarget:
Delphi-Quellcode:
function PDropTarget.DragOver(grfKeyState: Integer; pt: TPoint;
var dwEffect: Integer): HResult;
begin
if FindDragTarget(pt, True)
is TListBox
then
dwEffect := DROPEFFECT_COPY
else
dwEffect := DROPEFFECT_NONE;
Result := S_OK;
end;
//...
function PDropTarget.Drop(
const dataObj: IDataObject; grfKeyState: Integer; pt: TPoint;
var dwEffect: Integer): HResult;
var
l_Format : TFormatEtc;
l_StgMed : TStgMedium;
begin
if FindDragTarget(pt, True)
is TListBox
then
begin
if (dataObj =
nil)
then
raise Exception.Create('
IDataObject-Zeiger ist ungültig!');
with l_Format
do
begin
cfFormat := CF_HDROP;
ptd :=
nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_HGLOBAL;
end;
OleCheck(dataObj.GetData(l_Format, l_StgMed));
try
SendMessage(TWinControl(FindDragTarget(pt, True)).Handle, WM_DROPFILES, l_StgMed.hGlobal, -1)
finally
ReleaseStgMedium(l_StgMed);
end;
end;
Result := S_OK;
end;
Gruß
Pitschki