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

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

编辑:说三道四文库 发布时间:2017-02-23 01:21
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
Brian Krzanich是谁?这位新CEO预示英特尔未来怎样? HTML5开发者心声:浏览器兼容性成最大问题 传微软6月下旬将发布第二代Surface 7到9英寸全有 Turbulenz:HTML5 2D和3D游戏引擎开源 携程开放平台总经理夏天:内容+高转化率成就开发者 直接拿来用!最火的Android开源项目(一) Qunar 谌振宇:旅游行业的移动化如何布局? 大数据分析“铁三角”: Teradata数据仓库、Teradata Aster与Hadoop Teradata专业服务:打造行业企业的“数据科学家” Xamarin Evolve 2013:竭尽全力让C#服务iOS与Android 史上最全!57个Web框架4轮横向对比 回顾银行数据的可用性和一致性历史 Qubole:托管在AWS平台上的Hive服务 自由操作系统 Debian 正式发布7.0版本 4月份浏览器份额:IE 8仍居第一,IE 10翻番 亚马逊正式在华推Android应用商店 收入3:7分账 不要男孩,只允许女生参加的四所编程学校 下一波App机会在哪里? JS1K 2013优胜作品公布 3D蜜蜂仅获亚军 专访:前新浪网架构师徐佳转行卖水果背后的故事 FBI密码挑战,你能解开吗? 从0到1只需一天:Twitter后PC时代物联网“敏捷”开发之路的探索 机械生物已经面世 只少个“大脑”而已 百度正式宣布3.7亿美元收购PPS视频业务 比尔·盖茨:iPad让人失望 用户需要Surface Dropbox将于今年夏天举办有史以来的第一场开发者大会 Clustrix Sierra分布式数据库系统:云计算时代的MySQL 英特尔出杀手锏 发布低功耗、高性能Silvermont微架构 10大最实用的Raspberry Pi扩展设备推荐 主流浏览器性能测试,IE10百分百完胜! TortoiseSVN的基本操作 关于mouse_event的问题。 怎样返回一个数组??——急! 资源管理器里面没有内容 偶会ACCESS,VFP,熟悉VC,有推荐的单位吗?做毕业设计也行 请问VB中如何将含有picturebox的窗体打印出来? 请教高手,一个派生类的问题 怎么用代码改变本地机的系统时间? 有谁玩过在ie中调word吗?高分相赠呀! 高手们救命呀!! 如何得到NEOPLANET风格的界面代码? 紧急请教:音量大小调整如何编?????????????? 关于double类型为null的问题。 我的Win2000突然控制台的默认值变成全屏了,请问如何改回窗口模式 我的IE浏览网页的时候,在输入框中无法输入任何东东,怎么解决? 如何让工具栏按钮按下后不弹起来?如何做到一个TOOLBAR对应一个MENUITEM,由菜单来控制TOOLBAR的隐现? VB没市场了吗? 关于EditMask的问题,是PB的Bug吗? 147分求助:那有星际108B下载 文件存在判断 如何在com中运用ado的方法实现对数据库的操作??(急!!) OpenGL的入门级问题. 大家快帮帮忙啊!这个问题很棘手,公司在催!!! 急:我得到了窗口句柄,如何通过这个窗口句柄获取对应的窗口实例?? 请解释一下以下程序 搞了这么久,java还在入门阶段,太麻烦了!我要放弃? 有条proc 的语句不会写,大家帮一下忙! thanks a lot. 关于sql server中money 字段的问题 我真的很着急,你们大家都不会吗?还没人理我的话,我只好下网看帮助了!! 请问有什么关于数据库开发的好书么? 请问,在FRAME页中点击IE“刷新”按钮后如何只刷新一个frame而不刷新整个页面?? 请教(无为):关于VC与XML 向各位大侠求救!VB6如何直接输出到打印机?(有关POS机) 请问哪里有InstallShield下载啊 在FRAME页中点击IE“刷新”按钮后,如何只刷新一个frame而不刷新整个页面?? 使用VC+ATL生成控件,在VB中设计时属性窗口设置的值保存不住,运行的时候可以保存,是什么问题 怎样在dephi中用ado调用视图 ~~~动态设置数据窗口~~~~~~~~~~~~~~~~~~~~~~~~~~~! 一两狂死郎之天衣有缝:我是琳琳,提问有关音量问题的人。请来一下!! 有关李维的ADO/MTS/COM的问题,求救! vc与xml 请教:vc与xml 如何做象IE里最大化按钮下的转动的“e"字母? help!!!!!!!高分。。关于applet和servlet通信一个问题 JVM INSTR pop ;什么意思?高手帮帮忙! 如何访问子数据窗口中文本控件的text属性。在线等待!!!!!!!!!! 有的程序Dialog控件比Visual C++所提供的要多,不只是如何实现的?是自己做的吗? 我编了一个用MODEM-MODEM拨号对传的程序。但端口检测不正确,不能拨号。 怎么用installshield 实现软件加密? 急!如何将含NULL的string给MEMO字段赋值 请教:为什么我在WinXP上装完了vs.net,却无法启动?点击出现vs的初始画面,然后什么都没了? 请问hresult的错误码的意思,在哪里可以找到? FBI死亡密码谁能把两份密码打一下,实在看不懂是什么字母,要正确! 二氧化碳在1立方分米空间内产生的压强一般有多大? 互联网对青少年有什么好的影响?有什么坏的影响? fbi 外星人FBI备忘录证实外星人可能曾于1947年造访美国?真的假的,具体说说 旅行有哪些好处和坏处写一篇英语作文 网络对青少年健康成长的影响调查报告. fbi 科普 1立方分米的冰融化为水,质量体积各是多少要过程 如何计算一辆1.8的车百公里几个油 FBI WARNING是甚意思了 容积是100升的油桶的体积比100立方分米大 权威的来 要能肯定 求~网络对青少年没有影响的证据啊~~~我周一就要参加辩论赛了,我们这次的论题是网络对青少年有没有影响,我选的是反方,也就是没有影响.虽然我知道这个论题反方估计很难翻盘,但是 谈谈网络的巨大效用,以及对自己的工作和生活会产生哪些重大影响 圆柱油桶的溶积是100L+它的体积一定是100立方分米吗 百公里多少油怎么计算 Internet从产生到如今渗透到各行各业,它对人类生活、学习、工作、娱乐等各个方面都产生了巨大的影响如何用英语翻译这句话 在直径是0.4分米的水管内,水一以每秒5米速度移动,1分钟流过的水有多少立方分米? 请问怎么就能计算出这个车百公里耗几个油! 一圆柱体容器,底面积为100cm*2,将一木块漂在水上,容器底受到水的压强增大了1000Pa已知木块有1/3的体积露出水面,求木块的体积? 一个无水观赏鱼缸中放有一块高为2.8分米,体积为4.2立方分米的假山石,如果水管以每分钟8立方分米的的速度向鱼缸内注水,至少要多长时间才能将假山石完全淹没 水管忘关,开的最大一小时能流多少立方水?希望能说的详细点…谢谢 在你的生活中,什么是最有意义的? 帮忙写一篇英语作文—“关于网络学习”200词左右.不要复制,转载的!大一的作业,希望在线写,要写的通俗一些,不要让老师一看就怀疑.分大大的,我就一点分.晕拉. 请问4分水管,放1吨水要多久呢? 英国 、法国 、德国 、美国的科学体制模式各有什么优点和缺点?文字叙述多一点,好的话会追加 求一篇关于网络的英语作文 写青少年问题的英语作文9A第三单元的作文 60字左右 有了国际互联网,我们的生活更加快捷方便,丰富多彩,所以我们可以说,它和我们的生活是息息相关的.改成反问句, FBI死亡密码上面是些什么字 急需一篇关于科学技术的英语作文 80词左右 美国的FBI跟美国的警察有什么区别?好像看美国的电影通常FBI的人比警察要大.貌似只有那些涉及到政府的案件才会让他们出场,而普通的小案子,根本看不到他们的影子,全是警察再干,为什么?到 美国联邦调查局FBI中的“死亡密码”一案解决了吗?另外,我还想问有什么国家讲英语,什么国家不是讲英语但也用英文abc的? 英语作文技巧英语作文中常用的小技巧,如 As we know(众所周知) first second third finally (1.2.3.最后) That·s all thank you啦 美国FBI是什么意思 圆柱体容器底面积为200平方厘米,里面装有深20cm的水,将一个体积为500立方厘米的是新铅球放入水中后,球圆柱体容器底面积为200平方厘米,里面装有深20cm的水,将一个体积为500立方厘米的是 科技英语作文题目是我所用的操作系统,要求是写出用的是什么系统,为什么使用该系统,和使用感受 英语解释:总之,电脑和网络使我们的生活越来越方便了. 美国街头什么牌子的车最多 求较简单的英语作文关于科学技术的,老师让演讲,不要长,简短一点, "它给我们的生活带来了便利"翻译英文 (一) 家 是 什 么 在美国洛杉矶,有一个醉汉躺在街头,警察把他扶起来,一看是当地的一位富翁.当警察说(一) 家 是 什 么在美国洛杉矶,有一个醉汉躺在街头,警察把他扶起来,一看是当地的 100公里8升油.1升油6.5.9公里要多少钱?怎么算的?3Q 联邦密探是FBI,那国际刑警的英文简称是什么? 一个正方体的纸盒中,恰好能装入一个体积6.28立方分米的圆柱体.纸盒的容积多大? 1.8升的现代100公里需要多少升油 政府机构的英语简称?(例如FBI ) 一个正方体的纸盒中恰好能装入一个体积为6.28立方分米的圆柱体.纸盒的容积有多大? 某油箱中有油100升,汽车每行驶50千米好油9升油箱剩余油量为28升时,汽车行驶路程为多少千米? 美国联邦调查局的简称FBA,它的英语全称是什么 电子词典的好处和坏处 英语作文 一根钢管外直径为15cm,内直径为7cm,长为85,如果每立方厘米钢重7.8克这根钢管有多重?这根钢管的体积是多少? fbi是什么英文的缩写? 一立方分米有多大 一根圆柱水管,内直径为20CM,水流每秒4米,这跟水管1分钟的流过多少立方分米水 有没有像FBI这样英文简写的医学术语啊?当然了,FUI不是医学术语,请大家帮个忙啊,谢谢了!比较难懂的,越多越好 英语作文 要写选修课的好处与坏处 一种圆柱形水管,内直径是20厘米,水通过水管的速度是每秒6米,这根水管每分钟可流多少立方的水? FBI 是 关于钱的好处坏处的英语作文! 一根钢管外直径为15cm,内直径为7cm,长为85cm,这钢管的体积是多少?如果每立方厘米钢重7.8g,这钢管多重有算式,最好有有思路,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn