说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

这是delphi接受IE的url拖放的例子,谁用BCB写出来,送45分,只有这么多了 :(

编辑:说三道四文库 发布时间:2017-04-29 05:40
HTML文档下载 WORD文档下载 PDF文档下载
让自己的程序
可以接受OLE拖放。这需要申明一个COM对象,并支持IDropTarget接口。
下面DragDrop.pas不是我写的:
unit DragDrop;

interface

uses
  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}';

implementation

uses ComServ,unit1;

{ 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.

在自己的程序中,在FormCreate的时候,加入:

  OleInitialize(NIL);
  dd := TTMyDrop.Create;
  dd.OnDroped:=DoDroped;
  res1 := CoLockObjectExternal(dd, true, false);
  res := RegisterDragDrop(Handle, IDropTarget(dd));

其中,DoDroped在拖放发生时被调用:
procedure TForm1.DoDroped(Sender: TObject; Msg: Pchar);
begin
  ...//此处最好不要有太耗时的工作,因为被拖出的程序(比如说是浏览器)
     //要等待此事件结束
end;

在FormDestroy时:
  RevokeDragDrop(Handle);
  OleUninitialize;





一定要用COM对象吗?
用OLE2 接口就行了吧!
TTMyDrop = class(TInterfacedObject, IDropTarget)
这样用的资源更少,也不用包含与com有关的unit了,只用
包含activex就行了。
也不用产生TComObjectFactory。
没人做过吗?


你最多只能给49分,分数增加后超过了。, ?????????????什么意思?
强烈关注
我也是这样啊!
我想一次给别人一百分,,
但不能害得我分成几次给。。
看来这个问题没人能答

还有几位朋友都想送分,可惜没人能要。

flashGet 和 一拖即存 ,还有聊天宝宝, 网络收藏家都有这功能啊,为什么这就没人会呢?

我是不是该到delphi那边去问? :(
你想要吗?我刚刚写好了一个。呆会给你贴出来。
//////////////////////////////////////////////
//头文件

//---------------------------------------------------------------------------

#ifndef MyDropTargetH
#define MyDropTargetH
//---------------------------------------------------------------------------
#include "oleidl.h"
//---------------------------------------------------------------------------
class TDropBlasketMainForm;
class TMyDropTarget : public IDropTarget
{
public:
    TMyDropTarget(TDropBlasketMainForm* pForm);
    ~TMyDropTarget();
public:
    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppv);
    ULONG STDMETHODCALLTYPE AddRef(void);
    ULONG STDMETHODCALLTYPE Release(void);

    HRESULT STDMETHODCALLTYPE DragEnter(IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect);
    HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect);
    HRESULT STDMETHODCALLTYPE DragLeave( void);
    HRESULT STDMETHODCALLTYPE Drop(IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt,DWORD __RPC_FAR *pdwEffect);
private:
    int m_nRef;
    IDataObject* m_pDataObj;
    TDropBlasketMainForm* m_pForm;

    BOOL IsDataAvailable(IDataObject __RPC_FAR *pDataObj, CLIPFORMAT cfFormat);
};
#endif

/////////////////////////////////////////////////
//实现文件
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "frmDropBlasketMain.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

TMyDropTarget::TMyDropTarget(TDropBlasketMainForm* pForm)
{
    m_nRef = 0;
    m_pDataObj = NULL;
    m_pForm = pForm;
}
TMyDropTarget::~TMyDropTarget()
{
}

HRESULT STDMETHODCALLTYPE TMyDropTarget::QueryInterface(REFIID iid, void ** ppv)
{
    if (iid == IID_IUnknown)
    {
        *ppv = (IUnknown *)this;
        AddRef();
    }
    else if (iid == IID_IDropTarget)
    {
        *ppv = this;
        AddRef();
    }
    else
    {
        *ppv = NULL;
        return E_NOINTERFACE;
    }
    return S_OK;
}
ULONG STDMETHODCALLTYPE TMyDropTarget::AddRef(void)
{
    m_nRef++;
    return (ULONG)m_nRef;
}
ULONG STDMETHODCALLTYPE TMyDropTarget::Release(void)
{
    m_nRef--;
    if (m_nRef == 0)
    {
        delete this;
        return 0;
    }
    return (ULONG)m_nRef;
}

BOOL TMyDropTarget::IsDataAvailable(IDataObject __RPC_FAR *pDataObj, CLIPFORMAT cfFormat)
{
FORMATETC formatEtc = {cfFormat, 0, DVASPECT_CONTENT, -1, DWORD(-1)};

BOOL bRet = (pDataObj->QueryGetData(&formatEtc) == S_OK);
    return bRet;
}

HRESULT STDMETHODCALLTYPE TMyDropTarget::DragEnter(IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)
{
    m_pDataObj = pDataObj;

if (!IsDataAvailable(m_pDataObj, CF_TEXT))
*pdwEffect = DROPEFFECT_NONE;
    else
        *pdwEffect = DROPEFFECT_LINK;
    return S_OK;
}
HRESULT STDMETHODCALLTYPE TMyDropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)
{
if (!IsDataAvailable(m_pDataObj, CF_TEXT))
*pdwEffect = DROPEFFECT_NONE;
    else
        *pdwEffect = DROPEFFECT_LINK;
    return S_OK;
}

HRESULT STDMETHODCALLTYPE TMyDropTarget::DragLeave( void)
{
    return S_OK;
}
HRESULT STDMETHODCALLTYPE TMyDropTarget::Drop(IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt,DWORD __RPC_FAR *pdwEffect)
{
    HGLOBAL  hGlobal;
    LPCSTR   pData;

if (IsDataAvailable(pDataObj, CF_TEXT))
{
STGMEDIUM Stg;
     FORMATETC formatEtc = {CF_TEXT, 0, DVASPECT_CONTENT, -1, DWORD(-1)};
BOOL bValue = (pDataObj->GetData(&formatEtc, &Stg) == S_OK);
        if (bValue)
        {
     TCHAR *strText = (TCHAR*)GlobalLock(Stg.hGlobal);

     AnsiString strUrl = strText;

            m_pForm->AddURL(strUrl);

     GlobalUnlock(Stg.hGlobal);
    GlobalFree(Stg.hGlobal);
        }
}

    return S_OK;
}

//////////////////////////////////////////////
//使用:

在Form1:OnCreate里面:

    m_pDropTarget = NULL;
    m_pDropTarget = new TMyDropTarget(this);
    m_RegisterDragDrop(Handle, pDropTarget);

现在,就可以接受拖放了
首先声明,这部分代码,并不是从delphi那里搬过来的,而是看了mfc的部分代码,自己写成的,里面可能有不少的bug,不过,至少从ie里面,接受url拖放,是可行的了。

我的主业上面,有一个例子。
http://www.shijun.com/iel/cn/download.html
OK, 我测试完后就送分

叶老大, 学了一手,也要给人家送点分哦,不能白拿
试一试,
*.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        void __fastcall FormCreate(TObject *Sender);
protected:
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_DROPFILES, TMessage, trydo)
    END_MESSAGE_MAP(TForm)
    void _fastcall trydo(TMessage &Msg);
private:
            bool drawing;
            int xx,yy;
            // User declarations
public:

        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
*.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void _fastcall TForm1::trydo(TMessage &Msg)
{
char buffer[128];
int i,sum;
sum=DragQueryFile(HDROP(Msg.WParam),0xFFFFFFFF,NULL,0);//获得文件个数
ShowMessage(sum) ;
for(i=0;i<sum;i++)
{
DragQueryFile(HDROP(Msg.WParam),i,buffer,128);
ShowMessage(buffer);//取得文件名
}
DragFinish(HDROP(Msg.WParam));
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DragAcceptFiles(Handle,true);        
}
//---------------------------------------------------------------------------
to easypaper() :

   兄台, 您提供的例子我用了一下, 总是有点问题 可以打个包给我吗?
   cool_calf@163.net   QQ:28551
   你的 BatchAdd 做得很不错。 按钮不错。 弹出菜单的兰色条不错。
   可惜在我的机子上运行时出错。

to czylj(夭夭) :
   你列出的程序是什么?


 
使用DragDrop 4.0 ,支持 BCB5.0
RegisterDragDrop之前用OleInitialize(NULL)初始化
接受拖放呀,
不好意思,看错了
coolcalf(牛犊初生):

你遇到的问题,可能就是bilyx所说的,

少了RegisterDragDrop之前用OleInitialize(NULL)初始化 

至于我的程序出错,是很正常的,因为这只是一个程序里面的部分内容,需要其他的程序支持(在我的叶上面有)。
to easypaper() 
咦,怎么http://www.shijun.com/iel/cn/download.html 上不了,说网站没创建的。
To wowboy(星仔):
==================
http://www.shijun.com/cn/iel/index.html
study
AWS集群计算新增内存分析EC2实例 手游:鼓足力气,掰弯传统3D游戏大作 LBA兴起:未来移动广告将基于地理位置 苹果发布2013财年Q1财报:iPhone销量及营收低于预期 不再被墙后 一个全新GitHub到来 与乔布斯并肩作战的日子 Google抛弃Exchange ActiveSync WP用户获DAV支持 Facebook真的要做“Facebook Phone”? 程序员,都去写一写前端代码吧 清除山寨和广告应用,“豌豆洗白白”服务上线 谷歌另类“开源” 程度仍不及Facebook和Twitter 想在云中分一份蛋糕? 不妨试试“山寨” 为何乔布斯脾气怪糟 却能让一群最优秀的人为他卖命? 单页Web设计案例+技巧攻略(多图) IE10里的捕捉模式和响应式设计 在“亚马逊商店”出售自己:产品经理这么找工作 【CTO俱乐部第92期】大规模存储与电商架构演化实战分享 刘黎明:PaaS是非主流业务,要与IaaS融合 个人手机游戏开发者之死 为什么苹果的应用审核是个笑话? 程序员性格怪癖是才华横溢的表现,还是危险分子的征兆? JavaScript Source Map详解 8条学习编程的可靠建议 一周消息树:亲爱的GitHub,我们怎么访问不了你? [回顾] 2012年几大编程语言就业趋势分析 研发周报:微软无视W3C 拒绝遵循WebRTC标准 移动周报:夫妻档闯江湖 事业爱情双丰收 当服务器遇见锤子:第六届AWS全球创业大赛落幕 C# DataTable 和List之间相互转换的方法 iPad如何在三年内改变世界 划时代的成果:新DNA存储技术 轻而易举装下世界 关于m_hWnd 我的DreamWeaver4怎么了? 请使用过ANT的兄弟帮偶看看在编build.xml时出的这个出错信息! 动态创建TQRimage控件? 怎么知道在上网时是否有黑客程序在运行???这些东东是什么意思??? 大家认为IBM DB2是数据仓库开发的理想工具吗? 请问5000多的PC要怎么配置?? 如何用pb实现设置显示器的分辨率 怎样使我的程序在开机的时候运行? 我在窗体上画一条直线,是不是一定要在OnPaint事件中重绘它才行。有没有办法不重绘而让它能一直显示在窗体上?谢谢 。 硬盘保护卡破解--小哨兵篇 关于打印问题 统计一下,你每星期洗头的次数. 萧淑慎~幸福的形状~~~大家看看怎么样 高手请进,我急需高手帮我解决问题,非常感谢!!!!! 请教! 高手请进,我急需高手帮我解决问题,非常感谢!!!!! 从网上down了个控件,请问怎么使用?? 关于&和* 您有管理配置文件的Java原码以及类吗?? 谁能告诉我什么是多线程 复合文档的存储 LINUX真的很爽~~~ 前天发出一个喜欢歌手评选,大受欢迎,今天再提出一个:大伙举出自己认为最好的音乐网站(可以听的哦!)!!!!! 哪位朋友在广州小聪软件做的?如何?罗斯泰克科技有限公司呢? 问题,急,也很简单 http://www.csdn.net/develop/Article/14/14153.shtm 怎么用不了? 这个sql语句怎么写?关于日期。在线等 <DIV>元素定位问题?送100分!!! <DIV>元素定位问题?送100分!!! 我用ShellExecute(NULL,"open","##",NULL, NULL, SW_SHOWNORMAL)函数调用了netmeeting软件!现在怎样把它嵌入一个已经分割好的窗口中啊 大家好;有谁知道广州、深圳有没有关于JAVA方面的培训?比如J2EE具体信息能否提供一下。。多谢了。。 C 格式输出的问题,请教高手!!!!!!!!!! 数据访问技术的演变--毕业设计要翻译的东西,时间紧,马马虎虎的,给看看改改啊 我想在Memo1上显示出以下内容 水园这两天怎啦? VB开发的应用程序,如何在本地不安装ORACLE的情况下,通过ADO连接数据库? 明天就要考试了:(,第一科就是软件工程 透明图片如何制作??? 怎么让程序最小化到托盘,并不停变换图标? 一个关于打印的问题(说简单,却不会) PreTranslateMessage 中 如何截获 ctrl+N 这个消息呀? 100分奉送!!!! 怎么把SDI FRAME 窗口的系统菜单去掉啊!! 一个关于打印的问题 窗体扩展 为什么我按例子(Cker提供的)做的OpenGL的程序总运行不起来? 请问asp.net中的数据库是如何安装的? 如何调用??????????????? 请问如何在pb中备份和恢复ASA数据库 关于treeveiw控件 如何关闭网上发来的信息? 世界各国公路的标志都是以什么字母开头的指公路编号 社会改革及其在社会发展史中的作用是什么 磨床主轴用什么什么牌子的润滑油好呢? 如图是用火柴棒摆出的一系列三角形图案,按这种方法摆下去,当每边摆上100根火柴棒时,该图应共需要摆的火柴 请举出四次推动社会发展进步的改革,说说历史作用 只有——才 的逻辑关系是什么?本题属于削弱质疑类题型.结论:只有具备强大的制造业竞争水平,一个国家的经济才有高度的稳定性,即一个国家的经济有高度的稳定性→具备强大的制造业竞 测振仪测电机时是用速度还是位移还是加速度? 断路器GSM1-160M/140,1400/3P什么意思 如何让润滑油满了之后车床主轴才能启动? 测电机振动值时测的时候振幅大,该怎么取数 开关3p是什么意思 证明与,或,非三个基本逻辑可以表示任何逻辑关系? 向氯化钡溶液中通入二氧化硫气体,产出白色沉淀,离子方程是什么? 有没有关于爱和感恩的好词好句好段 哪些食物不能吃? 高压变频电缆,6/10KV变频电缆,6/10KV变频电机专用电缆,型号怎么分析?北京中澳天天电缆提供解析.中压变频电缆技术标准. 附录4中单质的标准摩尔生成吉布斯函数几乎都为-,请问这是值为零的意思吗? 怀孕时哪些东西不能吃,为什么?注:简略一点,说到重点为什么 如何用化学符号来表示单质? 材料在人类社会发展中的作用 T2N160 R125 3P MA断路器的 具体含义 MA 关键是MA 氧气的化学符号属不属于单质 油压千斤顶现在一吃力,它就自动下落,请问如何维修啊, ABB,T2N160-R125/3P/SOR22V/aux 2Q,开关是什么含义?具体一点, 请问测量电动机噪音的规则标准是什么?多远的距离来测量电动机的噪音量? 油压千斤顶10吨的,没用几次下面的回油阀漏油,怎么修理 LED设计中电流扩散层的作用是什么 为什么在氯化钡中通入二氧化碳和二氧化硫没有白色沉淀生成? 氨气对人体有害吗?怎么预防氨气中毒? 设计实验说明:保险丝能够起到保护电路的作用 日光灯灯光中是否含有紫外线? 艺术火柴好卖吗? 大棚蔬菜如何预防氨气中毒 火柴用英语怎么说 是天时不如地利也 的 是 化学中的摩尔吉布斯函数我学得不太好,能给详解一下么,你的化学一定很厉害,我很崇拜你 艺术火柴好卖吗?艺术火柴未来的市场有多大?你们觉得艺术火柴怎样?我想进些艺术火柴,放在别人的商店搞代销,觉得怎样?觉得会有人买吗? 是天时不如地利中是的意思 吉布斯函数与偏摩尔吉布斯函数有什么区别给点例子帮我理解~ 4盒火柴用英语怎么说? 用化学符号填空:一个铜离子______.为什么答案是 Cu2 为什么前面不加1? 单反镜头怎么使用?单反镜头上的各种调节的都是干什么的?、 哪些是调焦距的?、哪些是调微焦的?、从来没有接触过单反,麻烦详细点说说.最好有图指示………… 我的意思就是 镜头上的各种 思维是什么意思 用化学符号表示带2个单位正电荷的铜离子 怎么弄掉手机镜头的水蒸气 沉思的意思 什么物质能发生分解反应生成硫单质 CH1G-100/C63/3P在图纸上是什么意思? 思维是什么意思呢 7.下列溶液中通入SO2一定不会产生沉淀的是7.下列溶液中通入SO2一定不会产生沉淀的是 A. Ba(OH)2 \x09B. Ba(NO3)2 \x09C. Na2S \x09D. BaCl2 “只要 就 ”是什么逻辑关系 ”既然 那么”是什么逻辑关系“只要 就 ”是什么逻辑关系 ”既然 那么”是什么逻辑关系 沉思的意思是什么 为什么给氯化钡溶液中通入二氧化硫不产生白色沉淀? 什么是逻辑关系,举例说明 沉思是什么意思 为什么二氧化硫通入氯化钡溶液中不会产生沉淀 如何用电动势法规定AaCl的标准摩尔生成吉布斯函数? 母亲的爱作文100字 改革在社会历史发展中的作用集中表现在( )A.在一定程度上解决社会基本矛盾,促进生产力发展B.在一定程度上解决社会基本矛盾,促进阶级关系缓和请问这题答案选哪个?请给出理由, 昨天晚上做梦梦见与看见打雷闪电,就是没有下雨 而且辟得很厉害、 响声特别的真实,请问是什么预兆啊、梦境是这样的:我在另一间门口,我姐在对面,是准备吃饭来着,突然就打雷闪电了,而
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘