word调用与释放的一些问题。(100分)

  • 主题发起人 主题发起人 zla
  • 开始时间 开始时间
Z

zla

Unregistered / Unconfirmed
GUEST, unregistred user!
我调用word的方法如下:
WordApplication.Visible := True;
当窗口关闭时采用
WordApplication.Visible := False;
问题如下:
1、如果我调用的WORD被手工关闭时,关闭语句出错,如何解决?
2、采用WordApplication.Visible := False 调用的word不能释放。
3、一般调用word与关闭word的稳定的方法是什么???
谢谢。。。


 
再加一项:
如果客户Word版本不同,是不是打开WORD文档的语句也应不同,如果判断客户所装的
WORD版本或未安装。?????????????????????????????????????????????
 
WordApplication.Visible := False或者True是指Word的窗口是否可见,并不是释放资源.
如果你是用Delphi的server页上的控件控制Word,一般的退出过程应该是

try
WordApplication.Quit //关闭Word
except
end //加try是因为Word有可能由用户自己关闭了,如果不加try会出现一个异常
WordApplicaiton.DisConnect

这样就可以了. Delphi会自己管理WordApplication的资源释放

如果你是用CreateOLEObject('Word.Application')生成Word对象的话,

try
try
WordApplication.Quit;
except
end; //道理同上
fianlly
WordApplication := unassigned; //因为是自己手工创建的对象,所以要自己手工释放
end;

Word版本不同,调用Word文档的语句会有一些差别,你用一下Delphi6的Server页中的控件
就有体会了,因为这些控件在Add等事件地时候会有一些名称是*Old(例如AddOld)的方法.
因为D6中Server中的控件是针对Office2000以上版本的. Delphi5是针对Office97版本的.

判断Word的版本是在
HKEY_CLASSES_ROOT/下搜索Word.Application健值,如果存在,在这个Word.Application下
有一个子键CurVer,里面就放着Word的版本.

 
我调用采用Delphi的Server页上的wordApplication
我的调用方法为visible := true;
但是我用
try
WordApplication.Quit //关闭Word
except
end //加try是因为Word有可能由用户自己关闭了,如果不加try会出现一个异常
WordApplicaiton.DisConnect
关闭时,想再次调用便不可以了,出现“被呼叫方拒绝呼叫”的错误。
?????????????如何判断是否安装了Word,你的那个关闭word的方法在没有
安装word的情况下是不是会出问题?

 
关键javascript语句:
打开word:
var wrd=new ActiveXObject("Word.Application")
加载模板:
wrd.Documents.Open("D://QianZY//Document//外贸//单证模版//汇票.dot")
得到书签:
var bm=wrd.ActiveDocument.Bookmarks
在特定书签处填入数据:
bm.Item("openingdate").Range.Text="<%=strTemp%>"
得到表格:
var ContractTable=wrd.ActiveDocument.tables(1)
在表格中填入数据:
ContractTable.Rows(1).Cells.Item(9).Range.InsertAfter("总体积 TOTAL MEANS (CBM)")
在表格中插入一行:
var newRow = ContractTable.Rows.Add(ContractTable.Rows(2))
在行中填入数据:
newRow.Cells.Item(1).Range.InsertAfter("<%=arrDetail[0]%>")
得到行数:
ContractTable.Rows.Count
 
to snjat : 你好像看错了吧,我问的是调用与释放的问题。不过那些那我也很有用,谢谢

to 大家 :
  我采用
WordApplication.Visible := True 的方法调用Word,但word被手工关闭,再用上述
方法调用时,会出现错误,那么采用什么方法调用好呢?

 
楼上的是不是贴错地方了??????

Disconnect后再调用就出错,我想还是看看你调用word的语句是怎么写的.如果方便的话,
可以贴一下.
>>?????????????如何判断是否安装了Word,你的那个关闭word的方法在没有
>>安装word的情况下是不是会出问题?
是否安装Word,我想我上面已经说了,当然最保险的方法就是找找WINWORD.EXE了.
至于关闭的程序在没有安装word会不会出错,我觉得这个问题很让我胡涂了.因为
没有安装word,在你调用的时候就应该知道了,根本不会到关闭的时候才出异常.
 
不好意思,一着急犯个低级错误,
我现在的调用方法只是 WordApplication1.visible := True;
我的要求如下:
  1、被程序调用的Word,手工关闭后,程序仍可调用。
  2、被程序调用的Word,被程序关闭后,仍可以调用。
 
调用的办法因该是
WordApplication1.Connect;
WordApplication1.Visible := true;

关闭方法如上.

关于TWordApplication等地使用资源,可以到下面这个帖子找到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=838092

自己多加练习,祝你好运.
 
问题:为什么提示 RPC 服务器无法使用? ( 积分:50, 回复:8, 阅读:78 )
分类:控件 - 使用 ( 版主:amo, cAkk )
来自:凤, 时间:2002-2-16 20:28:00, ID:923794 [显示:小字体 | 大字体]
我用Delphi 启动 Word. 第一次能顺利运行
可是关闭 Word 后,再次用同样的方法启动
却提示"RPC服务器无法使用" 为什么?
请各位多多指教.


来自:Pipi., 时间:2002-2-16 20:36:00, ID:923804
说清楚一点,你是怎么启动的?通过ole还是直接运行winword.exe?
代码贴出来


来自:凤, 时间:2002-2-17 15:01:00, ID:924474
用ole("servers")页上的主键启动的。


来自:Pipi., 时间:2002-2-17 16:11:00, ID:924548
用户自己关掉word是有点问题的


来自:凤, 时间:2002-2-20 9:53:00, ID:929069
procedure TFTree.TwordClick(Sender: TObject);
var Template,NewTemplate,ItemIndex: OleVariant;
I,J,k,h: integer;
V:Variant;
Range: Variant;
W:TwordApplication;
Begin
Try
V:=CreateOleObject('Word.Application');
V.visible:=true;
V.Options.CheckSpellingAsYouType:=false;
V.Options.CheckGrammarAsYouType:=false;
V.caption:='abcdefg';
//V.wordDocuument.add;
//D.
//D.Range.InsertAfter(' '+CurItemCaption+#13);
//D.Range.InsertAfter(' 日期: '+DatetoStr(Date)+#13);
Except

// V.quit;
end;
end;
我用上述方法也打开了Word ,可是怎样建立一个新的Word文档
又怎样把我的数据导入呢?



来自:skyblade, 时间:2002-2-20 10:36:00, ID:929212
最好不要自己关闭WORD,由你的程序来看你是在程序中通过DELPHI的WORD.application来启动word的,则关闭word也应使用delphi的方法:
wordapplication.ActiveDocument.close()
wordapplication.Quit
来关闭.


来自:dop, 时间:2002-3-4 11:37:00, ID:957831
同上。。。
的确是问题的正解。。。


来自:dcom, 时间:2002-4-2 11:14:00, ID:1017819
[red]如果关闭WORD时你的程序正在向WORD中写数据,则再次用同样的方法启动
就会提示"RPC服务器无法使用" ,你可以把‘V.visible:=true;’这一句写在数据写
完之后。[/red]
我给你一个小例子:
procedure TfrmPlag.BtnPrintClick(Sender: TObject);
Var
Y1,M1,D1:Word;
i,j:integer;
Vdate:OleVariant;

begin

try
WordAplag.Connect;
except
MessageDlg('Word may not be installed', mtError, [mbOk], 0);
Abort;
end;

WordAplag.Documents.AddOld(EmptyParam,EmptyParam);
DecodeDate(Now,Y1,M1,D1);

//******************* 写脚文件 *************************

WordAplag.Selection.TypeParagraph;
WordAplag.Selection.Font.Bold :=0;
WordAplag.Selection.Font.Size :=10;
WordAplag.Selection.ParagraphFormat.Alignment := wdAlignParagraphright;
Vdate :='打印人员:'+Auserinfo.UserName +
' 打印日期:'+formatdatetime('yyyy"年"mm"月"dd"日"',now);
WordAplag.ActiveDocument.sentences.Last.Text :=Vdate;
//******************* 写头文件 *************************
WordAplag.Selection.Font.Name :='宋体';
WordAplag.Selection.Font.Bold :=1;
WordAplag.Selection.Font.Size := 14;
WordAplag.Selection.ParagraphFormat.Alignment :=wdAlignParagraphCenter;

WordAplag.Selection.TypeText(inttostr(Y1)+'年'+inttostr(M1)+'月固定资产折旧表');

//*******************写正文部分 *************************
WordAplag.Selection.TypeParagraph;
WordAplag.Selection.Font.Size :=9;
WordAplag.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
WordAplag.Selection.Tables.AddOld(WordAplag.Selection.Get_Range ,Sgrdshow.Rowcount,10);
WordAplag.Selection.Cells.Width:=100;
for i:=1 to Sgrdshow.Colcount-1 do begin
for j:=0 to Sgrdshow.Rowcount-1 do begin
WordAplag.ActiveDocument.tables.Item(1).Cell(j+1,i).Range.Text :=Sgrdshow.Cells[i,j];
End ;

End;
WordAplag.Visible :=True;
WordAplag.Disconnect ;

end;


来自:3p, 时间:2002-4-29 0:59:00, ID:1075145 | 编辑
我也碰到了同样的问题,我是利用server页的WordApplication构件进行连接和打开文档的
,但如果自己关闭word的窗口而不是在delphi中WordApplication1.disconnect、quit的方法
关闭word,在再次进行连接时将出现Rpc的错误,能否有方法避免出现这样的错误?比如在
WordApplication1.connect之前能判断出WordApplication1是否已连接,如果有则释放
连接先等。
各位请赐教,谢谢!


 
WordApplication.Quit
 
FreeBit:
你的方法不是我们的问题的解决方法,能否
1 在delphi启动word后,屏蔽了word本身的关闭按钮和关闭菜单?
2 每次调用word打开文档前判断word是否已经真正的断开和释放 ?
 
多人接受答案了。
 
后退
顶部