300分解决 OleContainer 与 excel问题 ( 积分: 100 )

  • 主题发起人 主题发起人 suninrain
  • 开始时间 开始时间
S

suninrain

Unregistered / Unconfirmed
GUEST, unregistred user!
用下面的代码可以实现从数据库里提取已经保存的EXCEL文件,并放到已经打开的OleContainer 里,但是多次操作后,会出现“被调用的对象已与其客户端断开连接”的错误,或者“不支持该借口”的错误,而且用TRY EXCEPT也捕捉不到该错误,有那位朋友知道怎么解决该问题啊?
先出100分,问题解决后再出200分

var ms:TmemoryStream;
begin
with dm1.adoquery1 do
begin
close;
sql.text:='select * from excel where id=1';
open;
end;
ms:=TmemoryStream.Create;
TBlobField(dm1.adoquery1.FieldByName('excel')).SaveToStream(ms);
ms.Position:=0;
try
OleContainer1.LoadFromStream(ms);
OleContainer1.Run;
while not (OleContainer1.State in [osRunning]) do
sleep(200);
OleContainer1.DoVerb(ovshow);
finally
ms.Free;
end;
 
用下面的代码可以实现从数据库里提取已经保存的EXCEL文件,并放到已经打开的OleContainer 里,但是多次操作后,会出现“被调用的对象已与其客户端断开连接”的错误,或者“不支持该借口”的错误,而且用TRY EXCEPT也捕捉不到该错误,有那位朋友知道怎么解决该问题啊?
先出100分,问题解决后再出200分

var ms:TmemoryStream;
begin
with dm1.adoquery1 do
begin
close;
sql.text:='select * from excel where id=1';
open;
end;
ms:=TmemoryStream.Create;
TBlobField(dm1.adoquery1.FieldByName('excel')).SaveToStream(ms);
ms.Position:=0;
try
OleContainer1.LoadFromStream(ms);
OleContainer1.Run;
while not (OleContainer1.State in [osRunning]) do
sleep(200);
OleContainer1.DoVerb(ovshow);
finally
ms.Free;
end;
 
是不是窗体上又其他能获得焦点的控件?
 
群17441492邀请大家加入!
 
应该是文件多次且换导致excel 反应不过来引起的
最好是通过olecontainer1.ole.application 获取到exlce的application
且换文件时正确的关闭excel
 
to :wa517
能说的详细一点吗?由于没有资料,也没有代码提示,所以能说的详细一点吗?
 
可能是excel没有正确关闭.或者程序外面已经打开的excel实例.
ole生成excel装入后,多次操作发生了实例混淆.可能操作的excle应用被关了,导致以上错误
wa517的意思是用OleContainer1.OleObject.Application获得OleContainer1装入的excel应用
 
那能够对Application做什么操作呢,是关闭他,还是做什么别的操作,怎么做呢?
 
我看了下边的代码:
try
OleContainer1.LoadFromStream(ms);
OleContainer1.Run;
while not (OleContainer1.State in [osRunning]) do
sleep(200);
OleContainer1.DoVerb(ovshow);
finally
ms.Free;
end;
你在finally中对ms释放了资源,是不是也应该对OLEContainer有处理呢,比如,使用Close方法让它处于非活动状态。
 
我从ms里调用东西就是为了使用啊,要是再关闭了,那还怎么用啊?
 

Similar threads

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