如何对OLEContainer中的Ole对象进行操作?(200分)

  • 主题发起人 主题发起人 回了
  • 开始时间 开始时间

回了

Unregistered / Unconfirmed
GUEST, unregistred user!
比如
如何把画笔的图片存盘?
如何把Word的数据读出?
如何使用Execel以及MatLab的功能?
在那里可以查到VBA的文档?Delphi如何调用VBA?

小弟很菜,请大家多多指教,
200不够可以在加
 
画笔的图片可以用“流”存盘
Word,Exexel的数据用Server组件
matlab没试过
Vba找MSDN

 
>>Delphi如何调用VBA?
好好看看/Delphi5/Demos/Activex/Oleauto下的例子
 
保存有2种,
一种是 TOleContainer 的格式,只能被OleContainer的 LoadFromFile打开:SaveToFile
一种是原来自然的格式,比如*.bmp *.doc等文件格式,
能被它的应用程序(比如画笔、word等)打开,
也能用OleContainer的CreateObjectFromFile打开:SaveAsDocumemnt

读出也有2种,就是上面说的
一种是 TOleContainer 的格式,能被OleContainer的 LoadFromFile打开
一种是自然的格式,比如*.bmp *.doc等文件格式,能用OleContainer的CreateObjectFromFile打开

VBA的文档可以在office中找到,
比如office97,excel的vba的帮助在VBAXL8.HLP
比如office2000,excel的vba的帮助在VBAXL9.CHM
(如果硬盘上没有,可以在安装光盘上找到)

 
读word文件可用CreateObjectFromFile.

下面一段文字讲述了如何在OleContainer里调VBA以及把word文档保存在Table里和读出的方法.
-----------------------------------------------------------
有若干种办法把一个对象放到容器里:粘贴(使用"粘贴"命令Paste或"特殊粘贴"
对话框 PasteSpecialDialog)、插入(使用"插入"对话框 InsertObjectDialog)、
拖放、从文件读入(CreateObjectFromFile)、直接建立(CreateObject)或是通过
"流"建立(CreateFromStream)。Delphi的OLE容器演示程序示范了上述的大多数特性,
所以这里就不多作讲解。请到下面文件夹里察看源码:/Delphi5/Demos/ActiveX/Olecntrs

在表(Table)中存储文档
---------------------
OleContainer用来链接或嵌入OLE对象,比如Word文档。不过,这种链接并不持久,
而且必须由开发人员操纵。同样,Delphi5中的Word控件也必须在Word环境成功设置后才能
使用。如果必须由Delphi应用程序来直接管理特定文档,常用的解决方法是在文本字段中保
存外部文档的文件名和路径,或在BLOB字段中保存实际的文档内容。两种方法各有其优缺点。

只保存文件名和路径允许其它程序共享及编辑文档,也不需要从数据库中读取文档数据。
不过,当程序试图使用这些外部文档时,有时会发现它们已经不在原来的地方了(可能因为原
始文件被删除、移动、改名,甚至所在磁盘被移走)。直接在BLOB字段中作为OLE对象保存的
办法简单易实现,避免了找不到文档的危险,但数据库会变得过于庞大并且会降低程序的执行
效率。

为了弄清楚OLE对象如何在表中存储,请查阅您的数据库技术资料。举例来说,在
InterBase中BLOB数据还应进一步由subtype(子类型)定义。OLE对象必须保存在subtype
为0的BOLB字段中,这也是存储二进制数据的缺省值。下面的SQL语句给CustomerLetter表
增加了一个BLOB字段:

ALTER TABLE CustomerLetter
ADD OleObject BLOB SUB_TYPE 0 SEGMENT SIZE 80

TBlobStream用来访问和修改BLOB字段中的值。Word文档从BLOB字段中取出来放在
TBlobStream对象中,并能很容易地装入OLE容器或WordDocument对象。下面的例子从
BLOB字段中取出Word文档,放入容器,并激活它:

var
oStream : TBlobStream;
begin
oStream := nil;
try
Table1.Open;
try
oStream := TBlobStream.Create(Table1.FieldByName(
'OleObject') as TBlobField, bmRead);
OleContainer1.LoadFromStream(oStream);
Olecontainer1.DoVerb(ovPrimary);
except
MessageDlg('从BLOB字段中读取文档失败。',mtWarning, [mbOK], 0);
end;
finally
oStream.Free;
Table1.Close;
end;
end;


请注意stream每次必须手工建立和释放。您不必考虑重新使用一个BLOBStream。
使用SaveToStream方法把OLEContainer里的内容存回BLOB字段:

var
oStream : TBlobStream;
begin
oStream := nil;
if OleContainer1.State <> osEmpty then
try
Table1.Open;
try
Table1.Edit;
oStream := TBlobStream.Create(Table1.FieldByName(
'OleObject') as TBlobField, bmReadWrite);
OleContainer1.SaveToStream(oStream);
Table1.Post;
MessageDlg('文档已成功保存在BLOB中。',mtInformation,[mbOK], 0);
except
MessageDlg('文档没有保存于 BLOB 中。',mtWarning, [mbOK], 0);
end;
finally
oStream.Free;
Table1.Close;
end
else
MessageDlg('没有文档要保存。', mtWarning, [mbOK], 0);
end;

这一次,为保存所作的修改,oStream在创建时拥有读/写的能力。同时,代码中还在
存盘前检验容器是否为空。
 
多人接受答案了。
 
oleobject亦可
 
后退
顶部