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

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

编辑:说三道四文库 发布时间:2017-06-25 08:26
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
亚马逊推“登录与支付”功能 直接冲击PayPal Google编程之夏新里程碑:5000万行源代码 8500名学生开发者 非常实用的15款开源PHP类库 Runnable:一站式代码片段服务平台,打造编程界的YouTube 谷歌向所有开发者开放Google App Engine PHP Runtime “沟通”电子表格和矢量图形的“桥梁”:在线可视化工具Raw Facebook北极圈数据中心,Open Compute Project的力作! 最后三天!4折抢购2013移动开发者大会门票 电子书追踪统计,App Annie for eBooks上线 先驱还是模仿者?细数海外移动应用推广平台 IDC:PC出货量下滑终于放缓 联想销量再次第一 为什么说,用一块屏幕玩游戏是远远不够的? 编写代码?先熟悉一下编程语言界限吧! Spanner vs. F1:谷歌两大数据管理利器的整体对比及关联 移动设计需摒弃的几大PC应用设计方法 响应式导航设计案例解析(多图) 所见即所得:七大无需编程的DIY开发工具 前Google员工发布无痕搜索产品,阻老东家财路 VMware推出vCloud Suite及vSphere新版:可用性及性能双丰收 TIOBE 2013年10月编程语言排行榜:Groovy首次挤进Top 20 Cookie时代将结束:微软将开发跨PC、移动和Xbox跟踪技术 Web设计里需要避免的八大糟糕趋势 Groupon从ROR迁移至Node.js,响应速度大幅提升 腾讯云的Container实现 专为物联网打造的数据库TempoDB获得320万美元投资 MongoDB成为首位10亿美元初创,功臣可归功于Oracle? 程序员遇到Bug后的30种常见反应 扎克伯格豪掷3000万美元购四套房 梅耶尔和拉里佩奇也居于此 IBM研究人员:仅200条微博 就可构建人格剖析图 MDCC重磅讲师:Pebble CEO Eric Migicovsky 历届中国大数据技术大会PPT精粹(一) HTML控件"Input"中的那个“浏览”,怎样能变成英文的? 在注册的时候,如何限制用户知道后面的页面直接输入地址访问啊 DataGrid如何判断鼠标位于第几列? 怎么可以知道我的机器现在是否可以访问Internat? 为什么IFRAME总是显示不出来?厌ssss! 作一个象QQ一样的弹出页面,可以用鼠标拖动?很急阿 ResultSet的问题 大侠帮忙啊!如何在基于对话框的程序中给菜单加快捷键? SOS拜托了 请问一下,在VB中怎么样实将文本写入到一个WORD文档 pb7中如何实现让用户选定驱动器或者文件夹?有什么api函数? 专家都来吧!如何设置excel单元格的类型!问了好常时间,每人回答啊!! 我想买一本COM的入门的书,推荐就有分(急,明天就买了)! 基础知识疑问???????(每题一分,系列问题) 我想在一张图片上的某个部分做个连接请问怎么做? 如何在VB分布式开发中调用远程MTS/COM+上组件,怎么进行网络通讯? 在win98下查询dns服务器和win2000下有区别吗? 给我的NotePad做一个接口,直接和腾迅服务器相连,提供登录接口。然后说的话可以通过直接 关于ASP的日期计算问题,请大家来指导一下!!! 数组的使用? 音标如何输? .net中的窗体控制问题,在线等待,100分 插入记录的问题 快周末了,偷懒中。。。 VB分布式开发中调用远程MTS/COM+上组件,怎么进行网络通讯? 哪位大哥有空??请指教!!! 恢复MBR时可以拿任意的一张win98启动盘吗,即mbr是否跟系统有关? 图片处理 经典问题 传递设备场景的问题 请问大家如何通过一个类名来取出这个类的对象指针啊? 怎样在数据库中存储图像文件 .net,在应用程序中如何释放资源? 是否能控制交叉报表的列的排序规则 我想在一张网页上有不同的CSS风格请问怎么做? 嘿嘿,谁有domino/notes开发的命名规范? >>>>>>>EVC中ShellExecuteEx的使用问题,100分相送!<<<<<<<< 如何从数据库读出数据,然后导出为EXCEL格式? To buick555(王飞),请看看,关于EJB连接数据库的。 jdbc配置不对,SunOS5,weblogic7.0,Oracle816,报错如下:(片段) delphi中如何实现c中的'<<'和'>>'移位操作符?急..急..急..急..急.. <COM技术内幕>讲的是COM的基本原理及其实现,请问想了解COM的应用,需要看什么书啊? 怎样判断一个文件是否存在啊? 请教高手:如何做一个分帧显示的页面?(vb.net)在线等待,马上给分。 为什么用户控件是抽象类呢? 报表的保存到文件中及文件的使用问题 IIUG 的informix FAQ 如何利用日志文件记录每一步操作?请hjhing(winding)兄,leimin(黄山光明顶) 兄前来继续问题 请问有谁看过direct x8.1 里的示例程序 directsound capture,我们讨论一下好吗? 请教:我每次新建窗体都要设置窗体的Font属性,请问: 推荐几本学习linux的书,谢谢 having been done ,having done 这个非谓语动词在句子中不可以充当什么成分非谓语动词的使用不是很清楚 连词成句 1.different,few,only,out,so,is,problem,that,students,can,this,it,work,a 初中英语短文My hobbyHello!My name is Xiaoming.I’m a basketball fan.But I used to be a movie fan.My interests are changing all the time.I used to enjoy playing computer game,and I wasn’t interested in sports at all.But now,my hobby is doing you don't do this work without feeling you want to make a difference请问这句话是什么意思 what's your point 什么意思 初中英语作文《My dream》词数60-100词之间词数80-150词之间!(不好意思,开始输错老!!) 非谓语动词中 done用在什么时候 它和having been done用法有什么区别啊 是不是前者不用考虑时间? I see your My dream 初中英语作文My dream要求:1.你的梦想是什么2.你在实现梦想的途中谁帮助你最大?怎么帮?3.你为实现梦想有什么计划?一定要按要求··!那是这题目缺德你见到这烂题目 你还不急着上网 “I don't know where you are,are you near are you far”这个歌词是哪首歌的? Get your goods.是什么意思? 形容性物主代词与名词性物主代词的所有格形式有什么区别吗,分别在什么情况下使用 求一首歌 歌词是 I don't know where you are一首挺好听的歌 有一句歌词好象是是 I don't know where you are 请问是什么歌 be got a point意思 用英文如何翻译"自动安装"这个词, 为什么蝴蝶飞不过沧海? it doesn't matter that /if you don't know him well .请问it 是形式主语吗?后面的that/if 从句是主语还是宾语从句呢? 英语翻译只用一个词来表达conductchastityintegrityvirginity哪个好点 给我一双手,对你依赖,给我一双眼,看你离开,就象蝴蝶飞不过沧海没有谁忍心责怪,给我一刹那,对你宠爱,给你一辈子,送你离开,等不到天亮,美梦醒来我们都自由自在.在杂志上看到的句子,感觉 It doesn't matter if you don't know him well.if引导的是什么从句 有什么好的关于哲学方面的书推荐吗, I don't accept this kind of you,you know?翻译中文 I realized that it doesn't matter if I don't know each word.这个句子中为什么doesn't不变过去式 你们觉得统计在社会生活中有哪些应用?我在做一个社会调查,要总结一些问题!关于“统计在社会生活中的应用”,知道的都说说吧! We call this kind of shoes boots.(改为同义句) It starts with one thing I don't know why It doesn't even matter How hard you try Keep that in mind是什么意思 爱拼 IELTS 核心单词 快乐闯关疯狂猜轻松拼出好英语怎么样 Men.,We should point their relentless.请帮小弟解释下这个英文句的意思.. 蝴蝶飞不过沧海的故事 番禺哪里有小孩学英语的地方 英语问题an还是a eight-year-old boyeight的开头不是发音是a吗?那就是发字母音咯?那前面不是加a么不懂啊··· 英语翻译A bus makes four trips of 38 kilometres in the morning.请问:38 kilometres是指【4趟trip的总和公里数】还是【一个trip走的公里数】呢? she has got (three) brothers.对括号部分进行提问( )( )( )( )she( Fox is an eihgt-year-old boy.He is a good boy.He does (1) in all his lessons.He (2) school and he is always active in class.Every time the teacher asks a question,Fox always (3) his hand quickly.Sometimes his is (4),but the teacher always smiles and you got it man 是什么意思 急! 在线等 she ( ) (have)a brother and you ( ) (have ) a sister 请您们填空 This is _____difficult problem______my brother can't work it out.A.so,that B.such,that C.so a,that D.such a,that _____(a/an)1-year-old boy _____(a/an)8-year-old boy _____(a/an)11-year-old boy_____(a/an)13-year-old boy Swimming is one of those activities that can be learned early in life.Little children can learn to阅读理解 l don't know how l can work out this physics probiem.改为同意句l don't know ____ ____ work out this physics probiem know和know about哪个了解的程度更深?改变他们的主意是change their mind还是change their minds? What does the man with a cap get? I know this plan is far from perfect,but I just can't think of( )one.A.a better B.the better C.a best D.the best ____he change his mind ,please do me know.为什么选A啊,B什么不可以A Should B If C Will为什么选A啊,B什么不可以 The media's __ in the president's private life switched the attention away from the real issues.A.capacityB.concentrationC.focusD.involvement an eight-year-old boy为什么year不加s 这属于什么语法可是把连字符去掉吧years加上s也不对啊 an eight years old boy 是错的 you get the point 有关英语 The ceremony where a man and a woman get married. 动词+to have/having been done 是什么用法?比如:He claimed to have been badly treated in the supermarket when he was doing shopping yesterday.这种用法还能在哪些动词上体现呢?求创新,复制别人的回答不采纳~ you got to leave the nest at some 求用心的翻译,I pay attention to the little shit. 关于having been done 和 have been done的区别有哪位高手能够告诉我这两者分别代表什么含义和有什么区别吗?并分别引用这两个时态造两个句子详细的告诉我一下.在此谢过. 请问“get the point?RT,懂的朋友请详解!是不是有“你明白了么?/你切中要点了么?”之意?愿各位英语达人不惜吝教,小弟洗耳恭听! 上次听"飞鱼秀"说"Get it a life 中国国徽的含义 For well you know that it's a fool who plays it cool who引导的句子是怎么回事 其中it又是怎么回事 When he walked past,he knocked my mobile phone _______my desk A.down B.off C.over D.with I don't want to do this kind of work .改同义句I _____ _____ _____ to do this kind of work its's well know that 当今社会生活流行词汇有哪些啊?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘