{ ************************************************** **************
Source File Name : ExplorerDragDropFrm.pas
Typ : Hauptformular
Autor : Andreas Kosch
Compiler : Delphi 4.02 CSS
Betriebssystem : Windows 98
Beschreibung : Dateien via OLE Drag&Drop vom Explorer
übernehmen.
************************************************** ************** }
//unit ExplorerDragDropFrm;
unit drag;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls,
ActiveX, ShlObj, ComObj, ShellAPI;
type
TForm1 =
class(TForm, IDropTarget)
ListBox1: TListBox;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
// IDropTarget
function DragEnter(
const dataObj: IDataObject;
grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult;
stdcall;
function DragOver(grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult;
stdcall;
function DragLeave: HResult;
stdcall;
function Drop(
const dataObj: IDataObject;
grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult;
stdcall;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
OleInitialize(
nil);
OleCheck(RegisterDragDrop(
Handle, Self));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
RevokeDragDrop(
Handle);
OleUninitialize;
end;
{-----------------------------------------------------------------}
{ IDropTarget-Implementierung }
{-----------------------------------------------------------------}
function TForm1.DragEnter(
const dataObj: IDataObject;
grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult;
begin
dwEffect := DROPEFFECT_COPY;
Result := S_OK;
end;
function TForm1.DragOver(grfKeyState: Longint;
pt: TPoint;
var dwEffect: Longint): HResult;
begin
dwEffect := DROPEFFECT_COPY;
Result := S_OK;
end;
function TForm1.DragLeave : HResult;
begin
Result := S_OK;
end;
function TForm1.Drop(
const dataObj: IDataObject;
grfKeyState: Longint;
pt : TPoint;
var dwEffect : Longint): HResult;
var
aFmtEtc : TFORMATETC;
aStgMed : TSTGMEDIUM;
szBuffer :
array[0..MAX_PATH]
of Char;
i, iCount : Integer;
begin
ListBox1.Items.Clear;
if (dataObj =
nil)
then
raise Exception.Create('
IDataObject-Zeiger ist ungültig!');
with aFmtEtc
do
begin
cfFormat := CF_HDROP;
ptd :=
nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_HGLOBAL;
end;
OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
try
FillChar(szBuffer, SizeOf(szBuffer), #0);
iCount := DragQueryFile(aStgMed.hGlobal, $FFFFFFFF, @szBuffer, MAX_PATH);
for i := 0
to iCount - 1
do
begin
DragQueryFile(aStgMed.hGlobal, i, @szBuffer, MAX_PATH);
ListBox1.Items.Add(szBuffer);
end;
finally
ReleaseStgMedium(aStgMed);
end;
Result := S_OK;
end;
end.