加300大分,继续讨论OLE & word & Blob & Tstream(300分)

  • 主题发起人 主题发起人 面条
  • 开始时间 开始时间

面条

Unregistered / Unconfirmed
GUEST, unregistred user!
如果大家读过Jams,Sand,茶叶蛋关于word文档储存数据库的讨论,一定记忆
尤新吧?但是他们的讨论一直没有结果。我再加300分,请各位大虾继续讨论
这个问题。

问题关键:如何不激活OLE,将word文档内的内容存入数据库的Blob字段?
如何从Blob中读出Word文件,不通过硬盘临时文件写入word中?

 
1. word文档内容是否形成文件了? 是, 可以用
tblobfield(table1.fieldbyname('fieldname')).loadfromfile('wordfile');
存入; 否则只有用ole了.
2. 读出word很简单, 但如果不形成文件就只有用ole了:-(
 
Ole及Blob字段的问题目前已有了个初步结果,但要真正实现软件商品,还有一段
距离。应用Delphi的人不少,但用Ole和Blob字段解决问题的相对还是比较少,
所以正等待以后的富翁来发表见解,或闭门自索、仔细研究,还望各位积极参与。
Tanks 面条, 继续提这“陈年旧帐”!
 
cytown:
我的要求是,整个过程中没有出现硬盘上的*.DOC(或其他)文件。
因为硬盘与内存的速度差异很大,当数据量大时犹为明显。

建议大家先阅读以前的讨论。
 
呵呵, 无论你怎么做, 其实硬盘上还是会出现文件的, word自动创建临时文件:-(
 
有什么问题吗? 我用Stream 没有问题呀。

原始的word“数据”怎样生成?

我假设word 原始数据在 某个DOC中。

用OleContainer的CreateObjectFromFile('xxx.doc',true)
~~~~~ 不必显示

存到DataBase 的Blob字段中

Var
OleStream : TMemoryStream;
begin
OleStream := TMemoryStream.Create;
try
OleContainer1.SaveToStream(OleStream);

OleStream.Position := 0; //回零点
Table1.append ;
Table1.fields[0].value := inttostr(Table1.RecordCount+1);
(Table1.FieldByName('Text') as TBlobField).LoadFromStream(OleStream);
Table1.Post ;
end ;
finally
OleStream.Free;
end;
end;


将BLob字段中的内容取出, 在OleContainer中显示。
Var
OleStream : TMemoryStream;
begin
// OleContainer1
OleStream := TMemoryStream.Create;
try
(Table1.FieldByName('Text') as TBlobField).SaveToStream(OleStream);
OleStream.Position := 0;
OleContainer1.LoadFromStream(OleStream);
OleContainer1.DoVerb(1); //显示
finally
OleStream.Free;
end;

end;
 
to SeaSky:
1、原始的word“数据”生成
2、存到DataBase 的Blob字段中
3、将BLob字段中的内容取出, 在OleContainer中显示。
以上三步我的做法和你类似,关键在第四步:
4、将OleContainer中数据复制到Word 97中,因为我需要用Word再对文档进行
处理并打印。
在这步中我不想先保存到硬盘上形成临时文件,再用word读出。
在整个过程中我不想看到被激活的OleContainer,Word97也在后台运行。

to cAkk:
DDE我没用过,请详细一点。

to cytown:
我是要将多个(可能很多!)Blob字段中的内容合并成一个文档,如果每个都
写成临时文件,天哪! ..........
 
没什么问题吧。
从blob中取的数据可以直接进入同一个文件!并不需要在硬盘上生成更多的文件。但生成一个总可以吧,还是它自己生成的。不显示word97就更不是问题了。
 
to menxin:
能贴点代码上来吗?

 
在整个过程中我不想看到被激活的OleContainer,Word97也在后台运行

其实,如果只是不想见到被激活的OleContainer,而不是不激活的话,
还是可以用些取巧的方法解决的。
如:在合并文档的过程中create个很小的form,在那上面放个olecontrainer;
利用它来进行合并。这样被激活的oletrainer你是看不见的。
WORD97不用在后台运行,根本没有必要启动office就可以实现合并。




 
to sand:
我想最好还是不激活OLE;
不运行word就无法实现我的一些需要,如各子文档的格式控制、段落、字体.....
我不让wordApp.show,调一些宏在后台完成这些工作。

另外:按我的思路,问题出在:
可以吧word中的内容按页Copy->Paste到OLE容器
(不激活),但是却无法把OLE容器中的内容(从Blob中读出的)copy->Paste
到word中,用选择性粘贴也不行。
 
我用ole1.copy
在msword.editpaste的时候说内存和硬盘空间不够。
这是怎么回事?




 
怎么没有人回答了?
300分呢!
我又个想法,将剪切板中内容(一定是存在某一段内存中)
直接读入TMemoryStream中?
不知是否可行?
大虾们,出手吧!!
 
这问题并不难,只不过你我在想法上有些没有弄清。
word97不显示并不等于不激活OLE,也就是说不用OLE的方法,无法对文档进行处理,
只能是对DOC文件的处理,如果想改变内容,不用OLE是不可能的,难道要去分析DOC
的文件结构? :)
合成一个文件有什么问题吗?
创建一个word.application,创建一个word.document,insert内容(从BLOB用
stream读出),savetofile。至于中间对文档的编辑,先selection,然后变成想要
的格式。整个过程都没有什么难度,建议你用d5的word97声明,几乎可以完成VBA的全
部功能,tqz编的那个htmltodoc就是个很好的例子,是D4的,需要引入WORD_TLB。
不过我想你要的功能不会那么复杂的。
 
Delphi 5 中有大量office控件,试试看!!!!!
 
menxin:
问题关键是做到这一切而
1、不激活OleContainer,
2、不想通过硬盘文件交换
 
1.和用不用olecontainer有什么关系?
2.你前面不是说不用文件是因为文件多速度慢吗?用一个文件都不行吗?那样的话恐怕没什么办法了。
 
还有没有好注意?
 
menxin:
不管什么办法,能解决问题就好。

现在我已经找到了变通的办法,但我还想把这个问题搞个水落石出。
哪就是如何把ole1.copy到剪切板上的内容,到WORD中paste出来?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部