起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 314|回复: 9

【结】DispatchHelper调用Excel后还留有进程

[复制链接]
发表于 2010-10-11 17:29:50 | 显示全部楼层 |阅读模式
如题:以下是我的代码程序:  
o:=ComObj.CreateOleObject('Excel.Application');
  app := System.DispatchHelper.Create(o);
  app.PropertyPut('Visible', [False]);
  try
     odocs:=app.PropertyGet('WorkBooks',[]);
     docs := System.DispatchHelper.Create(odocs);
     docs.InvokeMethod('Open', [DataSetBrokerSALES_RECORD_IMPORT_STYLE_DT.DataSet.FieldByName('FILE_NAME').AsString]);
     odoc:= docs.PropertyGet('Item',[1]);
     doc := System.DispatchHelper.Create(odoc);
     sheet:= System.DispatchHelper.Create(doc.PropertyGet('Worksheets',[ComboBox1.ItemIndex+1]));
     sheet.InvokeMethod('Select', []);
     UsedRange:=System.DispatchHelper.Create(sheet.PropertyGet('UsedRange', []));
     //cells:=System.DispatchHelper.Create(UsedRange.PropertyGet('Cells', []));
     Rows:=System.DispatchHelper.Create(UsedRange.PropertyGet('Rows', []));
     DataSetBrokerSALES_RECORD_IMPORT_STYLE_DT.DataSet.FieldByName('END_ROW').AsInteger:=objecthelper.ToInt(Rows.PropertyGet('count',[]));
  finally
     docs.InvokeMethod('close',[]);
  end;
  app.InvokeMethod('Quit',[]);

  //(doc as System.IDisposable).Dispose;
  (odoc as System.IDisposable).Dispose;
  (odocs as System.IDisposable).Dispose;
  (o as System.IDisposable).Dispose;
回复

使用道具 举报

 楼主| 发表于 2010-10-12 09:00:24 | 显示全部楼层
顶贴呀。。 有人知道吗?
回复 支持 反对

使用道具 举报

发表于 2010-10-12 10:16:09 | 显示全部楼层
应该是有对象未释放的缘故吧
请楼主看一下这个帖子http://bbs.justep.com/forum.php?mod=viewthread&tid=27065 的下面这段内容:
PropertyGet出来的object不用释放。如果后面有DispatchHelper.Create语句,是必须释放的。
   例子:o1:= FApp.PropertyGet('Range', ['A3:F3']);
              Range := DispatchHelper.Create(o1);//属性和对象
        o1必须释放。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-12 17:10:16 | 显示全部楼层
o:=ComObj.CreateOleObject('Excel.Application');
      app := System.DispatchHelper.Create(o);
      app.PropertyPut('Visible', [False]);
      try
         odocs:=app.PropertyGet('WorkBooks',[]);
         docs := System.DispatchHelper.Create(odocs);
         docs.InvokeMethod('Open', [DataSetBrokerSALES_RECORD_IMPORT_STYLE_DT.DataSet.FieldByName('FILE_NAME').AsString]);
         odoc:= docs.PropertyGet('Item',[1]);
         doc := System.DispatchHelper.Create(odoc);
         oworksheets:= doc.PropertyGet('Sheets',[]);
         worksheets := System.DispatchHelper.Create(oworksheets);
         lCount:=ObjectHelper.ToInt(worksheets.PropertyGet('Count',[]));
         ComboBox1.Items.Clear;
         for i:=1 to lCount do
         begin
           oworksheet:= worksheets.PropertyGet('Item',);
           worksheet:= System.DispatchHelper.Create(oworksheet);
           ComboBox1.Items.Add(ObjectHelper.ToString(worksheet.PropertyGet('Name',[])));
         end;
         ComboBox1.ItemIndex:=0;
      (oworksheet as System.IDisposable).Dispose;
      (oworksheets as System.IDisposable).Dispose;
      (odoc as System.IDisposable).Dispose;
      (odocs as System.IDisposable).Dispose;
      (o as System.IDisposable).Dispose;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-12 17:11:17 | 显示全部楼层
我释放掉了 但是还有一个Excel进程没有关掉!!
回复 支持 反对

使用道具 举报

发表于 2010-10-12 17:21:31 | 显示全部楼层
InvokeMethod和PropertyGet方法返回的都是object,所以你需要定义这样的变量,然后把你这两个付给这个变量,然后释放掉。

3楼连接中的帖子。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-12 17:49:00 | 显示全部楼层
请具体告知哪个地方要改动!多谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-12 17:53:58 | 显示全部楼层
oMethod:=docs.InvokeMethod('Open', [DataSetBrokerSALES_RECORD_IMPORT_STYLE_DT.DataSet.FieldByName('FILE_NAME').AsString]);     

然后再把oMethod释放掉 也还是关不掉最后一个Excel进程
回复 支持 反对

使用道具 举报

发表于 2010-10-12 18:19:45 | 显示全部楼层
for i:=1 to lCount do
         begin
           oworksheet:= worksheets.PropertyGet('Item',);
           worksheet:= System.DispatchHelper.Create(oworksheet);
           ComboBox1.Items.Add(ObjectHelper.ToString(worksheet.PropertyGet('Name',[])));
         end;
要在循环里面释放吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-13 10:06:06 | 显示全部楼层
问题解决,非常感谢shangxy! 不知为什么要在循环里面释放?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-6 10:18 , Processed in 0.041524 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表