word小问题。 (300分)

  • 主题发起人 主题发起人 山泉
  • 开始时间 开始时间

山泉

Unregistered / Unconfirmed
GUEST, unregistred user!
这段代码在一些机器上能够打开word
并在标签位置填上文字

虽然在一些机器上测试通过,但是一些机器上确 出现‘您没有安装Word 软件’错误。请教问题在哪里,如何修改?
(这些机器都安装了word)
function getCurPath: string;
begin
Result := ExtractFilePath(Application.ExeName);
end;

procedure TfrmMain.SpeedButton5Click(Sender: TObject);
var
myWord, myDoc: variant;
begin
try
myWord := CreateOleObject('word.application');
myWord.Visible := True;
myDoc := myWord.Documents.Open(getCurPath+'wenjian.doc');
myDoc.BookMarks.Item('文件编号').Select;
myWord.Selection.Text := '测试';
myDoc.BookMarks.Item('内容').Select;
myWord.Selection.Text := '测试文件';
myWord.Activate;
myDoc.SaveAs(getCurPath + '1.doc');
except
MessageDlg('对不起,您没有安装Word 软件!', mtInformation,
[mbOk], 0);
abort;
end;
end;
 
>> myWord := CreateOleObject('word.application');
改为:
MyWord:=CreateOLEObject('word.basic');
试试
 
begin
try
myWord := CreateOleObject('word.application');
except
MessageDlg('对不起,您没有安装Word 软件!', mtInformation,
[mbOk], 0);
abort;
end;
myWord.Visible := True;
myDoc := myWord.Documents.Open(getCurPath+'wenjian.doc');
myDoc.BookMarks.Item('文件编号').Select;
myWord.Selection.Text := '测试';
myDoc.BookMarks.Item('内容').Select;
myWord.Selection.Text := '测试文件';
myWord.Activate;
myDoc.SaveAs(getCurPath + '1.doc');
end;

先改成这样试一下,你那样写并不能测出来是不是因为word没有注册引发的错误
 
我估计也是word没有注册的原因,奇怪office安装后应该是会自动注册的?
我如果用server组件连接office能连上,能不能说明word已经注册?
 
word 用的版本不同,打不开时就会进入到你的提示里面
你最好,先看注册表里面有没有,有,就取出来
myWord := CreateOleObject('word.application 10');//10 是代表版本,根据安装的word
来定
 
图14-18 例程S14_9的运行界面
具体实现过程如下:
1) 创建一个新的应用程序工程,参照图1 4 - 1 4在窗体中添加一个B u t t o n组件和一个E d i t组件。
2) 在U s e s语句中添加C o m O b j单元。
3) 在窗体的O n C r e a t e事件处理过程中创建Wo r d实例,具体方法与前面类似。
4) 添加B u t t o n组件的O n C l i c k事件的处理过程,具体见下面的程序清单。
例程S 1 4 _ 9程序清单
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,ComObj ;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TO b j e c t ) ;
procedure Button1Click(Sender: TO b j e c t ) ;
private
{ Private declarations }
public
{ Public declarations }
end ;
var
Form1: TForm1;
v_app: variant;
implementation
{$R *. D F M }
procedure TForm1.FormCreate(Sender: TO b j e c t ) ;
begin
try
v_app : = GetActiveOleObject( ' Wo r d . A p p l i c a t i o n ' ) ;
except
v_app : = CreateOleObject( ' Wo r d . A p p l i c a t i o n ' ) ;
end;
end ;
procedure TForm1.Button1Click(Sender: TObject) ;
var
v_doc, v_ran : Variant;
begin
// 在Wo r d中新建一个文档,并添加文本,然后设置粗体和字体大小
v_app.Visible: = True ;
v_app.Documents.Add;
v_app.Documents.Item(1).Range.Text:=Edit1.Text;
v_doc:=v_app.Documents.Item(1) ;
v_doc.Paragraphs.Add;
v_ran:=v_doc.Paragraphs.Item(1).Range;
v_ran.Bold:=1;
v_ran.Font.Size : = 25 ;
end;
end .
 
把流程改一下,困为文件'wenjian.doc不存在,可文件被人修改过了也会出现异常。

procedure TfrmMain.SpeedButton5Click(Sender: TObject);
var
myWord, myDoc: variant;
begin
try
myWord := CreateOleObject('word.application');
except
MessageDlg('对不起,您没有安装Word 软件!', mtInformation,
[mbOk], 0);
exit;
end;
try
myWord.Visible := True;
myDoc := myWord.Documents.Open(getCurPath+'wenjian.doc');
myDoc.BookMarks.Item('文件编号').Select;
myWord.Selection.Text := '测试';
myDoc.BookMarks.Item('内容').Select;
myWord.Selection.Text := '测试文件';
myWord.Activate;
myDoc.SaveAs(getCurPath + '1.doc');
finally
// free....
end;
end;
 
我这改了下,教朋友晚上测试下,另外'wenjian.doc'这个文档一定是存在的
CreateOleObject还是无法避免有的机器出现错误
请教GetActiveOleObject和CreateOleObject有什么区别?
try
myWord := GetActiveOleObject('word.application');
except
try
myWord := CreateOleObject( 'Word.Application' ) ;
except
MessageDlg('对不起,您没有安装Word 软件!,对不起,您没有安装Word 软件,或者word安装不全!', mtInformation,
[mbOk], 0);
abort;
end;
end;
try
myWord.Visible := True;
myDoc := myWord.Documents.Open(getCurPath+'wenjian.doc');
myDoc.BookMarks.Item('文件编号').Select;
myWord.Selection.Text := '测试';
myDoc.BookMarks.Item('内容').Select;
myWord.Selection.Text := '测试文件';
myWord.Activate;
myDoc.SaveAs(getCurPath + '1.doc');
finally
// free....
end;
 
GetActiveOleObject是得到一个正在运行的OleObject,
CreateOleObject是新创建一个。
 
山泉,:
您好,我砰到這個問題,我看你的句子里有用到书签,籤請幫忙.
procedure TForm1.Button1Click(Sender: TObject);
var template,newtemplate,documenttype,visable:olevariant ;
begin
template:='d:/doc1.dot' ;
newtemplate:=true ;
documenttype:=null ;
visable:=true ;
try
wordapplication1.Connect ;
except
messagedlg('maybe you not setup word!',mterror,[mbok],0);
abort ;
end;
wordapplication1.Visible :=true ;
wordapplication1.Caption :='control word with delphi';
newtemplate:=true ;
wordapplication1.Documents.Add(template,newtemplate,documenttype,visable);
***********************************************************
worddocument1.Bookmarks.Add('11111',documenttype);
*************************************************************
在这个书签的位置送数据进去,我定义了10个书签,如何送,上面这句有问题,
我不会使用书签,大家帮我看看。
end;
 
你可以用On E:Exception,将E的错误信息打印出来,然后自己在MSDN查HelpContext
 
应该没有问题
 
你建立的是书签还是标签,
我这里定义的方法是:
插入--》书签—》输入书签名称-》添加
最后保存为模版。
不知道对不对,我也很着急。
 
hurryman,我是用到书签,不是标签,我说错了,
我最后写的那段可能可以了,我在等朋友晚上的测试报告.(我手头是通过了)
//书签先在模板中定义好
myDoc.BookMarks.Item('文件编号').Select; //选择模板中的书签'文件编号'
myWord.Selection.Text := '测试'; //将书签'文件编号'位置填入'测试'
 
你Create两次就可以了,应该是系统的问题,
try
Word:=Create('word.application');
.........
except
try
Word:=create('word.application');
excpetion
error not install word
end;
end;
Word.......
...........
还是不行的画,请使用GUID来创建即可
 
测试出来了
原来部分有问题机器
1.当word 启动后,运行这段程序没有问题
2.当word未启动时,第一次执行SpeedButton5Click 出现异常
第二次执行SpeedButton5Click 正常
这段程序还是有问题
 
书签名称是如何指定的呢
我是这么做的。在插入-》书签—》填入书签名称。不知道对不对。
我是这么添加书签的,
然后就
worddocument1.Bookmarks.Item('bookmark01').select ;
worddocument1.selection.text :='aaaaaaa';
可是还是提示有错:
types of actual and formal var parameters must be identical
 
1.使用word书签最好别使用servers里的控件组,我个人感觉不好用,我也用不清楚,才用ole

2.try
Word := CreateOleObject('word.application');
except
try
Word := CreateOleObject('word.application');
except
try
Word := CreateOleObject('word.application');
except
...
用三个CreateOleObject('word.application')好像就可以了,(不知道这是什么版本的破word,还是microsoft的错)
再测试下,明天放分
 
多人接受答案了。
 
后退
顶部