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

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

编辑:说三道四文库 发布时间:2017-12-13 02:19
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
LambdaNet:纯Haskell实现的人工神经网络库 专注模式识别,易道博识为海量信息输入提供便捷之门 【问底】Michael G. Noll:整合Kafka到Spark Streaming——代码示例和挑战 2014年手游和社交游戏行业重要趋势解读 腾讯副总裁罗道锋:共建全国最大安全云库 5分钟内数据精准共享 Connected Cycle 一举两得的智能自行车踏板 CES可穿戴产品前瞻:汽车厂商入局智能手表领域 果断Mark!国外程序员收集整理的PHP资源大全 Google 2015项目前瞻:智能隐形眼镜、Google X、Ara Swift的坑:如何实现enum的多选? Swift,其实没那么任性 如何利用单台服务器实现10万多个Git仓库托管 Swift的初始化方法 TIOBE 2015年1月编程语言排行榜:JavaScript成大赢家 为什么iOS开发不需要Storyboard? 仅有纽扣大小的开发板 Intel Curie “撒娇”的豌豆荚?被百度手机助手屏蔽太糟心! 【工具推荐】Pgcli—自动完成和语法高亮的Postgres命令行工具 CES 2015:挑一款机器人带回家? 夜行、睡眠与健康:CES 2015十款酷炫的可穿戴产品 Java 9中新的货币API 唯“简”不破,Apple Watch App的设计之道 Google Glass从X labs“毕业”,更换项目负责人 不进化,则消亡——互联网时代企业管理的十项实践 RedMonk 2015年1月编程语言排行榜:进击的Swift! 微信开放JS SDK,这场web巨变意味着什么? 盘点一些iOS开发技巧:Swift和Objective-C 2014年,那些“颜值”爆表的UI动画 《近匠》爱加密:谁说iOS应用不需要保护? SwiftColorArt:开源易用的Swift图片类库 人气爆棚 干货满满 中国电信天翼开放平台开放日圆满落幕 找在linux下免费gui?? 打开窗口获取原窗口信息的问题 Cbuilder安装问题,急! HelloWorld大全[接龙] 我要写一个程序在前台不需要运行后台运行可以:就像平时邮件服务品一样在前台不需要运行,而后台是提供服务的,要怎样来实现 临时表问题 多媒体教学系统开发 jbuilder中关于类的import问题? 有关远程控制的,例如抓屏,限制功能键,限制alt+f4,等等,请去http://hedaofeng.jahee.com 如何取得IE地址栏的输入信息? 急求一段ASP与SQLserver2000处理代码! 怎么创建win32 static library并输出函数?谢谢 !!!!求排列组合的简洁算法(80分) 我要对Spreadsheet的数据进行排序,用javascript怎么写 WIN32异常求救????!!!!!! 一个有深度的问题(对信号量操作不熟者请勿进) 知道为什么会出现iocopyout_chksum吗? 谁能给我《中文ACCESS开发指导手册》?? 从网上下的读不了 请问一个小问题 关于用Preferences存取注册表的问题 参数类型的问题 谁知道用什麽软件可以播放扩展名为1MP3的文件?(100分) 请问把一个二进制文件转换成文本文件,再把文本文件转换成二进制文件,该怎么做?求源代码?或有该代码的网址链接,多谢!不胜感激! main()函数里的两个参数argc、argv是什么意思?请赐教! 用HTTP上传文件,那位做过实际的应用的,帮忙... 大家上微软新闻组吧,感觉比这里快。 用jfreechart画出的图形,里边的汉字不太清楚,有没有解决的办法,要是图形小一点,模糊不清,难看死了,请问有没有解决办法?? 在vc.net中为什么新建的一个dialog,上面有双重的图象啊? asp&oracle问题 .net2003中vb升级向导有没有接口可以被其他程序调用? 以二进制方式打开文件,用ftell计算文件大小,为什么有时对有时不对? CHtmlEditView中如何实现表格的单元格大小调整? 城市夜归人 请问把一个二进制文件转换成文本文件,再把文本文件转换成二进制文件,该怎么做?求源代码?或有该代码的网址链接,多谢!不胜感激! 如何在一个网页中使用多种样式表显示多种效果? 直接用http调用代理怎么进行权限设置 CHtmlEditView中如何实现表格的单元格大小调整? 各位老大。。。如何用asp加密解密中文字符串,小生有礼了! 这段程序怎么不能运行?thinking in java 我的应用程序启动连接数据库时自动拨号,怎么去掉?? 谁给讲讲多线程!进着有分! 菜鸟问:jbuilder9比8都增加了什么功能?做了哪些改进? 给菜单加的快捷键怎么不管用呢 不能发mail 请问:这个存储过程哪儿不对呢?为什么执行不出来呢? 在dw中图片格式问题! CHtmlEditView中如何实现表格的单元格大小调整? 98启动的时候出现”press any key to continue"! 怎样将ASCII串转换成十六进制数? 在函數與過程裡中止其執行用什麼命令? CHtmlEditView中如何实现表格的单元格大小调整? 用算式7与它相反数小3的数的差是什么,结果是多少 many film crews like to s____ film in hollywood 第三题.非限定定语从句.不应该用which 这个where 是为什么? Stephanie这个名字的呢称(小名)是什么?很多英文名字都有呢称,比如Tom的呢称是Tommy、Rachel的呢称是Rach .那么Stephanie这个名字在英文里的呢称(小名)是什么、怎么读?它和Stephen的呢称一样吗?这个.. something of cocoon 这个句子怎么理解 帮用be certain of sth(对 有把握)造3个句子 快速10个对8个,听力25个对13个,听写单词8个对6个,句子1个,仔细阅读7个,选词9个,完型15个.翻译3个 四级作文还好快阅全对,听力选择对13单词对1,选词对4仔细阅读对8,完型对14,翻译对2,大概分数?能过吗 哪些具有稳定性 什么角具有稳定性?A.三角形 B.梯形 这个为什么具有稳定性 美国加油站员工遭枪击 子弹打中手机躲穆兄会领导人将首次在埃及受审 原定于穆兄会领导人将首次在埃及受审 原定于日本一男子摔死1岁女儿 只因其哭闹不飓风袭击德国致多地交通瘫痪 乘客被困新华国际时评:“三无”安倍何谈“领袖中美就推动朝鲜半岛无核化和重启六方会俄圣彼得堡将遭强飓风袭击 涅瓦河水位日本一办公室里种大麻盈利逾千万日元 美国14名男子因向未成年人传播色情图德联邦议院将召开特别会议商讨美监听事泰专家称大湄公河次区域经济合作可以提台“行政院”组改将完成最后拼图 可望盗贼跨三县入室行窃 宽城公安借监控成李克强获赠塞尔维亚国家篮球队1号球衣联合国吁募捐84亿美元 为叙及周边国四川艺考撞脸宋慧乔周慧敏 女神范十足中俄青年在京庆祝新年交通运输部:今年共巡视12家单位 发山东首位省部级被查 十八大后57名副推动形成全面从严治党新常态国际油价连跌 沙特石油大臣替欧佩克不神医世子妃女总裁的贴身保镖巫妖王万世第一妖孽星海圣人一击魔法师少年魔神龙血战士楚汉有种你爱我终极教官勾漏洞旅游喷射飞航旅游国际广场购物中心旅游天虹海鲜酒家旅游重庆长江大桥旅游呼图壁公园旅游亚洲大陆地理中心旅游龙王洞旅游延吉市人民公园旅游城门楼旅游陶瓷历史博览区旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘