我现在写了一个程序,需要获取从其他程序(如 IE Word)中拖放到我的窗体(视窗体或是其它控件,但不能是 TMemo TRichEdit)。怎么办哪?急死我了! 求求各位大侠帮忙啊!先谢谢各位了!
解决方案 »
- 我做的一个客户端小程序在开发计算机上能正常使用,但是不能再别的计算机上使用
- 請教post,applyUpdates,commitUpdates,Commit的区别,最好有代码证明
- 两段几乎相同的代码,pascal代码运行后成功更改了资源句柄, c++代码却不行,不得其解?
- 怎样控制IE工具条的隐藏和显示以及他的位置?
- 提供Delphi 5的下载地址就给分!(要能下)
- 问题
- 在把数据存入数据库里的表里时如何判断表里以存在了一条同样的记录并做出提示?
- 关于程序显示的问题!!!高分奉送!!!关注有分!!!
- 救命呀!我要死了!:(
- delphi7 listview动态刷新数据,不用每次刷新都清空列表
- 高手请进,如何用程序实现对摄像头的控制 分数可以在加
- 如和在一个exe里面调用一个windows Service中地函数?
Windows, ActiveX, ComObj,Dialogs,Sysutils;type
TDropEvent = procedure(Sender:TObject;Msg:Pchar)of object;
TTMyDrop = class(TComObject, IDropTarget)
private
FOnDroped: TDropEvent;
procedure SetOnDroped(const Value: TDropEvent);
protected
{Declare IDropTarget methods here}
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;
public
property OnDroped:TDropEvent read FOnDroped write SetOnDroped;
end;const
Class_TMyDrop: TGUID = '{846C94F8-7649-11D2-9836-0000E82EA1B1}';
implementationuses ComServ,DragDropUrl;{ TTMyDrop }function TTMyDrop.DragEnter(const dataObj: IDataObject;
grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
var
enumFormatEtc: IEnumFormatEtc;
f:TFORMATETC;
count:Integer;
Found:boolean;
begin
dataObj.EnumFormatEtc(DATADIR_GET,enumFormatEtc);
Found:=false;
while (enumFormatEtc.Next(1,f,@count)=S_OK)and (count>0) do
begin
if (f.cfFormat=CF_TEXT) then
begin
Found:=true;
Break;
end;
end;
if Found then
Result:=S_OK
else
begin
result:=E_INVALIDARG;
dwEffect:=DROPEFFECT_NONE;
end;
end;function TTMyDrop.DragLeave: HResult;
begin
result := S_OK;
end;function TTMyDrop.DragOver(grfKeyState: Integer; pt: TPoint;
var dwEffect: Integer): HResult;
begin
result := S_OK;
end;function TTMyDrop.Drop(const dataObj: IDataObject; grfKeyState: Integer;
pt: TPoint; var dwEffect: Integer): HResult;
var
enumFormatEtc: IEnumFormatEtc;
f:TFORMATETC;
count:Integer;
Found:boolean;
medium: TStgMedium;
begin
dataObj.EnumFormatEtc(DATADIR_GET,enumFormatEtc);
Found:=false;
while (enumFormatEtc.Next(1,f,@count)=S_OK)and (count>0) do
begin
if (f.cfFormat=CF_TEXT) then
begin
Found:=true;
Break;
end;
end;
if not Found then
begin
result:=E_INVALIDARG;
dwEffect:=DROPEFFECT_NONE;
Exit;
end;
dataObj.GetData(f,medium);
if medium.tymed =1 then
begin
if Assigned(fOnDroped) then
begin
fOnDroped(Self,PChar(GlobalLock(medium.hglobal)));
GlobalUnLock(medium.hglobal);
end;
result := S_OK;
end;
end;procedure TTMyDrop.SetOnDroped(const Value: TDropEvent);
begin
FOnDroped := Value;
end;initialization
TComObjectFactory.Create(ComServer, TTMyDrop, Class_TMyDrop,
'TMyDrop', '', ciMultiInstance{, tmApartment});
end.
unit DragDropUrl;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,activex,DragDrop,shellapi, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure DoDroped(Sender: TObject; Msg: Pchar);
procedure WMDropFiles(var msg: TWMDropFiles);message wm_dropfiles;
public
{ Public declarations } end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DoDroped(Sender: TObject; Msg: Pchar);
begin
memo1.Lines.Add(msg)
end;procedure TForm1.FormCreate(Sender: TObject);
var
dd: TTMyDrop;
res : HResult;
res1: HResult;
begin
OleInitialize(NIL);
dd := TTMyDrop.Create;
dd.OnDroped:=DoDroped;
res1 := CoLockObjectExternal(dd, true, false);
res := RegisterDragDrop(Handle, IDropTarget(dd));
//DragAcceptFiles(handle,True);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
RevokeDragDrop(Handle);
OleUninitialize;
end;procedure TForm1.WMDropFiles(var msg: TWMDropFiles);
var
numfile: integer;
i: integer;
buffer: array[0..255] of char;
begin
numfile := dragqueryfile(msg.Drop,0,nil,0);
for i := 0 to numfile-1 do
DragQueryFile(msg.Drop,i,@buffer,sizeof(buffer));
Memo1.Lines.Add(buffer);
end;end.