请问拖放的问题(0分)

  • 主题发起人 aricyoung
  • 开始时间
A

aricyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写程序时,需要从外部程序接受拖放过来的诸如文本、图片和文件之类的数据,请问如何利用TFormatEtc.cfFormat来进行判断,然后在进行相应的操作?
我在实现的过程中发现了如下问题:
1。拖放的是文本的话,它的cfformat有两种13(CF_UNICODETEXT)、1(CF_TEXT),所以要用循环吗?正象你的程序中使用的While
2。我如果用TFormatEtc.cfFormat来判断数据后进行相应的操作后,我的拖放文件的操作就会失效了,代码都是截取你的ListBox的DragDrop例子中的,请问怎么办?
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
李颖大侠已经在1999年阐述过这个内容了,帖子可以看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=228424
我在2003年画蛇添足地补充了一些内容,正好有文本拖放的例子,你可以参考。还有什么疑
问或者不清楚的地方,希望你继续提出来,让我们一起来讨论它。
 
A

aricyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,小雨哥,家里不能上网,因我是老师所以放假在家,^-^,今天上网吧来看到你的回帖,小弟真是感激万分,先郑重的谢谢了。
我这两天一直在研究这个问题,当然中间还要拿出相亲的时间,跑题了,继续。
我昨天基本解决了拖放的问题,先说明我的程序主要是为了方便老师的使用,所以我的要求挺高的,就是我希望接受任何拖动过来的东西,如文本、图片、文件和混合数据(如从Word中拖放有文本和图片、公式等的内容,以及网页中的混合内容),我的研究当然是在你的基础上,和那个很响的Drag&Drop控件(水平太次,没有透),我解决了文本、图片、文件的拖放,这些利用 IEnumFORMATETC来进行相应的操作,这里的文件我也不是用消息的那个拖放,因为我一用FormatEtc.cfFormat 来获得拖放类型后,就一起判断了CF_HDROP了。
这里我想问问你的是混合数据的问题,我的Drag&Drop是4,它里面有个TMetaFileDataFormat的类型接受,能够从Word中接受文本和图片的混合数据,不过是存成了一张图片,那样文本信息就无法编辑了,应该怎样来接受呢?
对于网页中的文本接受在你给的帖子里,或是用你书上所说的方法就行了,对于网页中的图片,这里我发现需要用拖放文件的方法,这个也没有问题,但是当选择了网页中的又有图片又有文本的数据后(当然此时里面肯定有表格之类的)用这个方法认为拖放的数据格式就是CF_TEXT的,所以只能接受到文本,这个应该怎么接受呢?
其实我的想法是利用剪贴板和流,因我想把数据放到RichEdit中,但是将拖放的数据放到剪贴板中,因为拖放中有TStgMedium,所以我用的是SetHandle,那就需要指明数据类型,其实将图片读出来我就是用的这种方法,我指明了CF_Bitmap,可不可以呢?有没有好方法呢?哥。
另外对于网页中的混合数据,有个叫资料收藏大师(http://www.mycnknow.com)的处理是将数据显示在网页中,是怎么样实现的,我一直也在想,可以按照这种思路来讨论讨论吧,不过我就是想把数据放到RichEdit中,还要研究。
不知道我罗嗦了这么多,你有没有烦,这是我的一些想法,希望你能和我一起讨论,再次感谢你,小雨哥。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
不论是剪贴板还是拖放接口,其传递的数据格式类型都是一样的。为了更好地谈论这个问题
,我先建议你下一个剪贴板数据查看程序(见下链接),程序是我写的,其中对预定义格式
的数据,我都尽可能地给予了直接的显示,这些数据格式定义在OLE中,从CF_TEXT开始共16
个:
1: Result := 'CF_TEXT';
2: Result := 'CF_BITMAP';
3: Result := 'CF_METAFILEPICT';
4: Result := 'CF_SYLK';
5: Result := 'CF_DIF';
6: Result := 'CF_TIFF';
7: Result := 'CF_OEMTEXT';
8: Result := 'CF_DIB';
9: Result := 'CF_PALETTE';
10: Result := 'CF_PENDATA';
11: Result := 'CF_RIFF';
12: Result := 'CF_WAVE';
13: Result := 'CF_UNICODETEXT';
14: Result := 'CF_ENHMETAFILE';
15: Result := 'CF_HDROP';
16: Result := 'CF_LOCALE';
实际上,这些格式无非就是2个类型:图片或者文字。从网页中直接复制图片,产生的是三
个数据:图片(CF_DIB)、文件(CF_HDROP)、HTML(CF_HTML)。这时可以直接保存图片
或者从文件中读取图片。但是,如果是混合格式,只产生二种格式:纯文本(CF_TEXT)、
HTML(CF_HTML)。
HTML(CF_HTML)格式还是非正式格式,并不包括在OLE定义中,但是它是一个强大的数据格
式,在MSDN上有专门的资料对这个格式进行详尽的介绍。假如对这种混合文本进行分门别类
地读取(文字、排版格式、图片等等),目前只有通过Microsoft提供的MsHTML解析库来做
,或者自己写解析来处理。Word和FrontPage都是通过自己的解析器对CF_HTML格式进行解析
来获得图片的,这个格式中肯定存在 HTML 规范的排版格式,这个格式到RTF的转换网上有
代码可以搜索到。
也就是说,通过拖拉也好、剪贴板也好,都不能直接获得不需要后续处理就可以达到你想要
的结果的目标的。
http://www.01cn.net/noncgi/attach/2006/02/10/12246-Clipviw.rar
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
你说到的“资料大师”什么的,如果他是把CF_HTML数据直接显示在网页中,那他就是聪明
地利用了Microsoft的MsHTML解析库。因为显示网页用的浏览器中就包含了这个解析库。这
个解析库的东西非常之多,我曾经有对 XML 格式的文章:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3337941
其中讲到的IHTMLDocument接口就是这个库中的一个成员。
 
A

aricyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
感谢你的回答,我其实问题就是怎么样将拖放的数据和剪贴板联系起来,如何将拖放的数据放到剪贴板中,这是关键,也就是把哪些混合数据(Word和IE中的)在拖放中如何存入到剪贴板中的。我利用的是:
Clipboard.SetAsHandle(CF_BITMAP,Medium.hGlobal);但就是只能得到单个的数据,不是混合数据。
像你说的,我也看了你的程序,基本对剪贴板中数据了解深入了一些,我现在想知道如何获得CF_HTML数据呢?我从Word和IE中复制数据,都是有CF_HTML数据,怎么样从拖放的数据中获得呢?如果上面的问题解决了,我想像你说的自己解析数据,然后获得图片文字那就可以了。我是小菜,希望再能给予帮助,我都不知道怎么做了。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
由于时间因素,我可能不能完全充分地解答你希望获得的全部信息。拣简单的说吧:
1.获取 CF_HTML
这个格式就是一个纯文本的数据格式,从拖拉接口获得文本,我上面提到的帖子里,我已经
有了演示代码(就是那个 GetText 的方法)。从剪贴板中获得文本也应该很容易,就是判
断剪贴板中是否存在格式名字为“HTML Format”的段,如果存在,就把它当作文本读出来。
2.理解 CF_HTML
用过了我的“剪贴板格式查看”程序,你应该已经预先知道了这个 CF_HTML 格式有一个开
头的档案描述,类似下面的样子:
Version : 微软定义的 CF_HTML 版本
StartHTML : 从剪贴板开始到内容开始
EndHTML : 从剪贴板开始到全部结束
StartFragment : 从剪贴板开始到内容段开始
EndFragment : 从剪贴板开始到内容段结束
StartSelection : 从剪贴板开始到选择点开始
EndSelection : 从剪贴板开始到选择点结束
SourceURL : 来源 URL
接下来就是真正的 HTML 数据了。
3.解析 CF_HTML
利用微软的MsHTML库(手工导入 C:/WINDOWS/system32/MSHTML.TLB 类型库),可以找到里
面很多有用的接口,可以使用这些接口来处理解析。
4.参考资料
CF_HTML 格式:
http://msdn.microsoft.com/workshop/networking/clipboard/htmlclipboard.asp
msHTML 资料:
http://msdn.microsoft.com/workshop/browser/mshtml/reference/mshtml_editing_ref_entry.asp
 
A

aricyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚看到,谢谢啦,我手头没有工具,所以还要请教。
我用的CF_HTML的时候要首先导入mshtml.tlb,是这样?
那个CF_HTML格式的数据要在用之前,要利用RegisterClipboardFormat(HTML Format)进行注册格式的操作吗?
也就是说,当我在利用FormatEtc.cfFormat进行判断类型的时候,我直接写成这样:
while (EnumFormat.Next(1,FormatEtc, nil) <> S_FALSE)do

begin
case FormatEtc.cfFormat of
CF_HTML:GetText(DataObj,FormatEtc);
end;
end;

可以吗?
然后在利用GetText获得Html型的字符串,行吗?
 

冲浪

Unregistered / Unconfirmed
GUEST, unregistred user!
我决得这个网址大全很实用的,请大家多多支持
http://16311.855.com
 
A

aricyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
接受答案了.
 

云裳

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥好厉害啊
 
顶部