打印本文 打印本文 关闭窗口 关闭窗口
使用OLE拖放不同程序间的数据
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1956  更新时间:2009/4/23 18:37:36  文章录入:mintao  责任编辑:mintao
  RegisterDragDrop(Form1.Memo1.Handle,self);//上文提到的函数

end;

 

destructor TDragAndDropOLE.Destroy;

begin

  RevokeDragDrop(Form1.Memo1.Handle);

  inherited;

end;

接下来实现Iunknown,不再做详细说明:

function TDragAndDropOLE._AddRef: integer;

begin

 result:=InterLockedDecrement(FRefCount);

 if Result=0 then Destroy;

end;

 

function TDragAndDropOLE._Release: integer;

begin

 result:=InterLockedIncrement(FRefCount);

end;

 

function TDragAndDropOLE.QueryInterface(const IID: TGUID;

  out Obj): HResult;

begin

 if GetInterface(IID,Obj) then

  result:=S_OK

 else result:=E_NOINTERFACE;

end;

最重要的IDropTarget实现:

function TDragAndDropOLE.DragEnter(const dataObj: IDataObject;

  grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;

begin

 result:=E_FAIL;

 CanDrop:=E_Fail;

 if assigned(dataObj) then

 begin

  with fe do

  begin

   cfFormat:=CF_TEXT;

   ptd:=nil;

   dwAspect:=DVASPECT_CONTENT;

   lindex:=-1;

   tymed:=TYMED_HGLOBAL;

  end;

  //大家从上面看到的fe是一种我们处理内存数据时常用的转换格式

  //这里它表示将数据格式作为文字(cfFormat),并将其存入一块

  //全局的内存区域(tymed:=TYMED_HGLOBAL),更多的格式请在win32

  //帮助中搜索TFormatEtc

  CanDrop:=dataObj.QueryGetData(fe);//按照fe指定的格式检查数据

  result:=CanDrop;

  if not Failed(result) then

   dwEffect:=DROPEFFECT_COPY

  else dwEffect:=DROPEFFECT_NONE;

  //注意这里我们设置了dwEffect,更多的取值请查看win32帮助

 end;

end;

 

function TDragAndDropOLE.DragLeave: HResult;

begin

 result:=S_OK;

end;

 

function TDragAndDropOLE.DragOver(grfKeyState: Integer; pt: TPoint;

  var dwEffect: Integer): HResult;

begin

 result:=S_OK;

 //我们不需要在这里做其余的操作,当然你可以根据自己的需要完成自己的方法

end;

 

function TDragAndDropOLE.Drop(const dataObj: IDataObject;

  grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;

var

 medium:stgMedium;

 hData:HGLOBAL;

begin

 result:=E_Fail;

 if not Fa

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口