Ole的新问题(30分)

J

Jams

Unregistered / Unconfirmed
GUEST, unregistred user!
问题1:
使用OleContainer并用OleContainer.LoadFromStream()操作后,如何
在下一次读写操作时将OleContainer区域内的内容清除?
问题2:
在使用OleContainer.LoadFromStream(xxx)时,如何能够确定xxx流是否
为空(Null)? (当使用 .SaveToStream(xxx)且xxx为空,则在使用 .LoadFromStream(xxx)
时,D3将给出出错信息)

 
1.可以用DestroyObject把它的ole对象清除.
2.TStream有个size属性,你可以先判断一下它的值.

 
用TReader, TWriter是否可以判断?若行该如何操作?
还有,如何知道TMemoryStream为空时的实际大小?我用TMemoryStream.Size得的值
不定,最大为168, 最小为4,估计有流头部信息,该如何确定大小?
jghuang继续努力,第二问我刚解决,但也算你的分。
 
我怎么在create,以及Clear以后得到TMemoryStream.Size的值为0.
 
TMemoryStream.Clear的结果是0,但此时若要用
TMemoryStream.LoadFromStream(xxx)时系统将报错。
这里,我的OleStream是TMemoryStream类型,它是记录数据库中TBlobField字段的
数据,倘若该字段的内容为空,就象我说的那那样,它不是0,而我要以此作为字段
是否有值的判断。而Sizeof(TBlobField)的结果是4,看样子它不能反映字段的真实
情况!
jghuang你看有何办法?
 
这个吗 .....
看来只有判断TBlobField自己了.
jghuang水平有限,无计可施了 :(
 
jghuang,待结束给你15分,别气馁!
其他高手还有何高见,请快赐教!
另有一个问题:
如上OleContainer1.DestroyObject确能将OLE内的内容清掉,但我再次激活
它时,系统则报错:不能对空的OLEContainer1进行操作,估计DestroyObject
是将释放Ole对象来达到清空的目的,除此发外,是否还有其它的方法,如用TRead、
TWrite类的方法?再一,DestroyObject后,如何再将OleContainer1激活,操作
过程如何?
 
to Jims:
又见面了!
<font color="gray">>使用OleContainer并用OleContainer.LoadFromStream()操作后,如何
>在下一次读写操作时将OleContainer区域内的内容清除?</font>
我的做法是:<b>不清除</b>,直接用Ole.LoadFromStream( OleStream );
用过一次又一次了,现在好像还没发生过什么意外.

<font color="gray">>在使用OleContainer.LoadFromStream(xxx)时,如何能够确定xxx流是否
>为空(Null)? (当使用 .SaveToStream(xxx)且xxx为空,则在使用 .LoadFromStream(xxx)
>时,D3将给出出错信息)</font>
用Size或者Position.
我这里,Create后,TMemoryStream的size和position都是0.
读完一个对象后,size和position都为该对象的长度.实际上,position是指向
TMemoryStream的末尾的.判断一个TMemoryStream是否读入东东,可以用Position
来处理.如果position与上次的不一样,就是读进了东西.
一般来说,Ole的东东都是很大的,这样读完以后,<b>position及size的值都不会太小</b>
我这里最小的值都是20K左右.根据这一点应该可以排除TMemoryStream的内部头信息
等因素.

<font color="gray">>如上OleContainer1.DestroyObject确能将OLE内的内容清掉,但我再次激活
>它时,系统则报错:不能对空的OLEContainer1进行操作,估计DestroyObject
>是将释放Ole对象来达到清空的目的,除此发外,是否还有其它的方法,如用TRead、
>TWrite类的方法?再一,DestroyObject后,如何再将OleContainer1激活,操作
>过程如何?</font>
1.我总是觉得,<b>没必要把ole内的内容消掉</b>,因为任何时候,用户都不要看一个灰灰的OleContainer
而用Ole.CreateObject( 'Word.Document.8', false )和Ole.LoadFromStream( OleStream )
可以轻松地不用管以前的内容,进行新建文件和编辑文件.
2.对于已经Destroy的OleContainer,它的里面<b>已经不存在实际意义上的文档</b>,自然激活它也就没有
什么意义了.当您需要对其进行编辑,插入时,必须<b>再新建或者插入一个文档</b>,然后才好激活它
4.对于您的要求,我的做法是:
用<b>Ole.CreateObject( 'Word.Document.8', false )</b>和<b>Ole.LoadFromStream( OleStream )</b>
使OleContainer内有文档对象,然后激活则不成问题.

btw: Jims啊,您的另外几个问题有解决吗?还是我答得不清楚?如果您认为那些问题
还没有得到解决,可以在后面加上您的几句话,把它们推到待答问题的前面来,
大家一起来解决.
不好意思,这一段很忙,就算上了大富翁也只是看一看,没有时间来考虑问题.
 
茶叶蛋:你的这些问题是个很好的主意,但我的试题库系统,教务处不要求有很
多的文件,是想,题目内容一个文件,参考要点一个文体(文件中包含图形、公式、上
下标之类)这样对一道题就有两个文件名,若这们课程有上千道题,那么文件的数量
将是题量的二倍还多,不易管理。
所以,你的文件读取显然是行不通的。但对以后的编程是个很好的事例。
Ole区域清空还是有必要的,若浏览连续的记录,则清除语句看不出来,但若浏览了
此条记录,下一条记录是新记录或该字段为空需要编辑新的内容,这时OLE区域还是
上一条记录的内容,这样的程序如何交得用户去使用,势必影响自身的名声。
原先提过的几个问题,参与者甚少,主意不是没有帮助,但都介绍的很笼统,对于
每一个问题本人喜欢刨根问底,想问个所以然,自然不能草草了事,期望各位高手
能给个比较详细的介绍,当然包括你--茶叶蛋了,请原谅。
茶叶蛋,象上次说的那样,本人来此的机会越来越少,其道理你自然明知。
 
<font color="gray">>若这们课程有上千道题,那么文件的数量将是题量的二倍还多,不易管理</font>
为什么要用文件呢?
我们辛辛苦苦讨论了这么半天TBlobField,TMemoryStream,LoadFromStream,
为的就是不和文件打交道啊!全部的操作都在内存里头进行!另外,我的所有编辑
的内容全放到了数据库里头,虽然这样对于数据库的压力很大,但是我已经想出办
法来解决了,如果全用文件的话,那么怎样解决共享题库的问题呢?

btw,我没有说要用文件啊!您看我的回答,那里有文件这两个字?

<font color="gray">>题目内容一个文件,参考要点一个文件(文件中包含图形、公式、上下标之类)</font>
我的程序里头权放在数据库里头,着我先前已经说过了.而且每个要点设一个字段.

<font color="gray">>Ole区域清空还是有必要的,若浏览连续的记录,则清除语句看不出来,但若浏览了
>此条记录,下一条记录是新记录或该字段为空需要编辑新的内容</font>
在您的第一条问题中和我的第一条问题中,我已经说过了:我并不用OleContainer进行
浏览,事实上,您不觉得这样太慢了吗?我是把Word文档转换成为Html文件进行浏览,
而且,我的程序要上网,如果用Word文档浏览的话,我的网络岂不是100M/s都嫌慢?
您总算明白我为什么要辛辛苦苦把Word文档转换成为Html文件了吧,唉,天哪!

<font color="gray">>若浏览连续的记录,则清除语句看不出来,但若浏览了
>此条记录,下一条记录是新记录或该字段为空需要编辑新的内容,这时OLE区域还是
>上一条记录的内容,这样的程序如何交得用户去使用,势必影响自身的名声但若浏览了此条记录,下一条记录是新记录或该字段为空需要编辑新的内容</font>
1.我用Html文件浏览,html文件
2.您用我说的方法试一试好吗?真的可以的!您只要依序挨个打开,就行了.
打开后前面那个就"自动"消失了,而OleContainer内此时就是当前文档了.
 
多人接受答案了。
 
顶部