使用TBlobField遇到的问题(100分)

  • 主题发起人 主题发起人 Jams
  • 开始时间 开始时间
to Sand
连了那么多遍,终于上来了!是否是问题太多了?
我刚发现一个新大陆!
用OleContainer1.DoVeb(ovOpen);可以激活Ole容器。如写字板状态。在写字板状
态可以用全选-->而后粘贴到粘贴板上,使用Word可将粘贴的内容显现出来。就是有
了人工干预,这对大批量处理将不利!是否有自动完成的做法?
Sand, 你的办法我试一试,但能否解释一下几个名词?
IDataObject--的作用是什么?
IoleObject;--的作用是什么?

Foleobject:=ole1.OleObjectInterface; //该条语句的作用?
FOleObject.QueryInterface(IDataObject, DataObject);//同上!我用的
是Table,该条语句可否使用?
 
To jams
其实我也只是一知半解。这些都是从Olectrls.dcu里看到的,然后看看
帮助,就这么出来了。
1。 IoleObject;--的作用是什么?
帮助里说“The IOleObject interface is the principal means by which an embedded object provides basic functionality to, and communicates with, its container.”
2。 Foleobject:=ole1.OleObjectInterface; //该条语句的作用?
OleObjectInterface是Ole对象的IoleObject接口,如果要直接
调用Ole的Api的话,需要这个接口。
OleSetClipboard(dataobject)就是个Ole函数。
3。 IDataObject--的作用是什么?
IDataObject是Ioleobject的一部分。按F1可以查到帮助,我所知道的也是从
help中得到的。
4。FOleObject.QueryInterface(IDataObject, DataObject);
我的感觉是指针赋值。

你发现的新大陆我也知道,可是就是不知道怎么自动完成。
希望能得到理想的答案。
 
to Sand
以上的程序没说明如何将“内容”粘贴到粘贴板上,是否还是指OleContainer呢?
 

OleSetClipboard(dataobject);//放到剪贴板
MsWord := CreateOleObject('Word.Basic');
MsWord.FileNew;
Msword.APpshow;
MsWord.Insert('Hello!');
Msword.EditPaste; //粘贴到剪贴板 --应为从剪贴板拷贝到Word.
拷贝到word的是Ole对象。
另外,如果能向激活的那个Oleserver发送消息,并使它接受的话,那么
你就能实现自动生成了。
 
to Sand
刚才运行到
FOleObject.QueryInterface(IDataObject, DataObject);
一句,出错,应是何问题?
再将思路捋一下!
将TBlob读数据-->TMemoryStream;
OleContainer1从TMemoryStream读数据;//验证一下

//粘贴数据,是否是你加的那段程序呢?有无先后次序?

打开Word文档;
使用MsWord.EditPaste粘贴数据;
 
to Sand
刚才运行到
FOleObject.QueryInterface(IDataObject, DataObject);
一句,出错,应是何问题?。//我不知道,我没有出现问题。
//环境的问题?我用的是Delphi4.0(build 5.33)
//lib path:=$(DELPHI)/Lib;$(DELPHI)/Bin;
$(DELPHI)/Imports;$(DELPHI)/Lib/delphi2
再将思路捋一下!
将TBlob读数据-->TMemoryStream;
OleContainer1从TMemoryStream读数据;//验证一下
//粘贴数据,是否是你加的那段程序呢?有无先后次序?
打开Word文档;
使用MsWord.EditPaste粘贴数据;

我觉得思路是对的,但是就是粘贴的问题。
另外粘贴的是Olecontainer对象而不是其中的正文,也是个问题。
如果实在是不行的话,你可以先通过saveasdocument &
InsertFile(filename)来救急。但那样速度不行,太慢了。

我要回家了,不能和大家讨论剩下的问题,希望回来是已经有了
明确的答案。

此外,我听说有什么内存文件的办法,如果能把它运用到
Tolecontainer.saveasdocument的方法上话,可能也能解决。



 
TO jams:

我已经解决了粘贴OLE容器内容的问题,程序部分代码如下:
Ole1为Ole容器
Begin
Ole1.doverb(ovOpen);
keybd_event(VK_CONTROL ,0,0,0);
keybd_event($41,0,0,0); //ctrl_a
keybd_event($43,0,0,0); //ctrl_c
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);//释放ctrl被按下的状态
MsWord := CreateOleObject('Word.Basic');
MsWord.FileNew;
Msword.APpshow;
Msword.EditPaste;
msword.appclose;

这样就可以实现OLE容器内的内容的粘贴,不过还有两个问题:
一是OLE容器必须激活,想不看到都不行(visible:=false no use)
二是由此带来的界面混乱问题
我没有时间在进行实验了,如果你能解决这两个问题,别忘了告诉我
获得发个mail给我你的方法。
 
To Sand
你的方法很好,但还有几个疑问:
1、能否使用命令结束“写字板”,命令为何?如何取得有关的命令?
2、使用你的方法将“写字板”的内容粘贴到Word时是以图片的方式,其中的内容
不能修改,而若在“写字板”上人工‘全选|复制’后,在Word下则是非图片内容,
也就是说在“写字板”状态下是否还存在其它格式的‘复制’命令?
3、请注意给你的加分题示!
 
解决完该问题既开始论功行赏!踊跃竞答!
 
To Sand
你的方法很好,但还有几个疑问:
1、能否使用命令结束“写字板”,命令为何?如何取得有关的命令?

你的"写字板"指的是什么?如果是olecontainer,则用 close方法.

2、使用你的方法将“写字板”的内容粘贴到Word时是以图片的方式,其中的内容
不能修改,而若在“写字板”上人工‘全选|复制’后,在Word下则是非图片内容,
也就是说在“写字板”状态下是否还存在其它格式的‘复制’命令?

我用我的方法确实是在Word下则是非图片内容,不知道在你那儿出了什么问题?
//think hard.

 
大家讨论的热火朝天,我看的头都晕了,不过还算是有了点意思。
我以前做过相反的事,在Word中拷贝东西,贴到OleContainer中,现在你要做相反的
了。
看看前面的,我想要拷贝OleContainer中的内容(不是整个对象),肯定得激活
写字版了,毕竟OleContainer不能解释它所嵌入的对象的内容,只有靠激活Ole
服务来解释数据。关键是能不能在激活是不让OleCOntainer变化太大了。实际上,
我们在使用CreateObjectfromFile方法时就激活了服务,只不过没有显示出来而
已。
 
接受答案了.
 
后退
顶部