一个关于 OLE中的 书签问题,困惑我已很久,!!!!!!兄弟们帮我看看 ( 积分: 50 )

  • 主题发起人 主题发起人 delphiaaa
  • 开始时间 开始时间
D

delphiaaa

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:
我在ole中 有一个word模板,假设该模板里面有4个书签,位置我已经定好了,在我的程序中,我已经把文字写在定义好的书签后面,S_D:=OleContainer1.OleObject.Application.Selection;, //得到书签
S_D.goto(-1,,,BookMarkName1); //得到书签位置
S_D.Insertafter('一二三等等');) // 插入内容
现在的问题是, 当我下次要替换该书签处的内容,我该怎么替换呢?我的思路是这样的,首先找到该书签,然后s_d.delete 其内容,我如何删除该书签之后的那段字符呢?也就是重新在书签处插入我刚引入的内容,兄弟们,帮帮忙!
 
问题是这样的:
我在ole中 有一个word模板,假设该模板里面有4个书签,位置我已经定好了,在我的程序中,我已经把文字写在定义好的书签后面,S_D:=OleContainer1.OleObject.Application.Selection;, //得到书签
S_D.goto(-1,,,BookMarkName1); //得到书签位置
S_D.Insertafter('一二三等等');) // 插入内容
现在的问题是, 当我下次要替换该书签处的内容,我该怎么替换呢?我的思路是这样的,首先找到该书签,然后s_d.delete 其内容,我如何删除该书签之后的那段字符呢?也就是重新在书签处插入我刚引入的内容,兄弟们,帮帮忙!
 
有没有人帮忙呀??
顶,
 
大哥,有没有人来回答呀》?
急啊,
 
我也非常想知道这个问题的答案。
我帮你顶下。
顺便问一下,S_D定义成什么类型?
 
定义成 Variant 类型
大家帮我看看呀,,,, 顶,,
 
这样试试:
for r:=1 to worddoc1.Bookmarks.Count do //替换书签的内容
begin
ItemIndex := r;
vBookMark := worddoc1.Bookmarks.Item(ItemIndex);
if LowerCase(vBookMark.Name)='XXXXXX' then //取指定Index的书签
vbookmark.Range.Text:='XXX';
end;
 
说明:定义标签的对对象必需是(一个任意字符或空格或回车符),不充许是单独的光标位置。

可以这样做:

原来写入方式是
var
tt,len,ts: OleVariant;
.......
begin
vSelection.InsertBefore('气温'); //标签前插入内容
.....
end;
// 查找替换
tt:=wdCharacter;
ts:=wdExtend;
//定位到这个标签位后
vBookMark.Select();
len:=length(vbookmark.Range.Text)-1; //len 为原来内容的长度
vSelection.MoveLeft(tt,len,ts); //选中原来的内容
vSelection.Delete(tt,len); //删除原来的内容
vSelection.InsertBefore('气温温'); //插入新的内容

包你满意 :)
 
研究了一上午,新鲜出炉的。 [:)] 不行再吭声。
 
Blyb 不行啊, vbookmark.Range.Text:='XXX'; 这里就出现错误,错误是这样的 record,object or class Type required啊
还有解决的方法吗?
 
谢谢 一团火 的回复,可是运行 到len:=length(vbookmark.Range.Text)-1;就会出错
vSelection 是代表书签的位置吧,它有moveleft这函数吗?它的delete函数有带参数吗??
调试时 提示参数错误,,

??? 还能帮我解决解决吗??
 
帮忙到底,
说明:定义标签的对对象必需是(一个任意字符或空格或回车符),不充许是单独的光标位置。
这样作窗体上放一个 WordApplication1 改名为WordApp

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleServer, Word2000, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
WordApp: TWordApplication;
OpenDialog1: TOpenDialog;
WordDocument1: TWordDocument;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
folderName: String;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
templateName: OleVariant;
newTemplate: OleVariant;
vSelection: Selection;
ItemIndex: OleVariant;
vBookMark: BookMark;
I : Integer;

tt,len,ts: OleVariant;
begin

folderName := ExtractFilePath(Application.ExeName); //当前路径下找模板
if not FileExists(folderName+'目标.doc') then
begin
MessageDlg('错误:找不到模板资源文件 目标.doc !', mtError, [mbOK], 0);
Close;
end;
templateName := folderName + '目标.doc';
newTemplate := False;

try
wordApp.Connect();
except
beep;
MessageDlg('您的计算机上还未安装Microsoft Office Word97或更高的版本!', mtError, [mbOK], 0);
Abort;
end;

wordApp.Visible:=true;
wordApp.WindowState := 1;
wordApp.Documents.AddOld(templateName,newTemplate);
wordApp.Caption := '走过大海!';
vSelection := wordApp.Selection;

//================================================================ 插入要写入的内容
for I := 1 to wordapp.ActiveDocument.Bookmarks.Count do
begin
ItemIndex := I;
//取指定Index的书签
vBookMark := wordapp.ActiveDocument.Bookmarks.Item(ItemIndex);


if LowerCase(vBookMark.Name) = 'b1' then
begin
vBookMark.Select();
vSelection.InsertBefore('水温');
end;

if LowerCase(vBookMark.Name) = 'b2' then
begin
vBookMark.Select();
vSelection.InsertBefore('气温');
end;
if LowerCase(vBookMark.Name) = 'b4' then
begin
vBookMark.Select();
vSelection.InsertBefore('abcedesksksks');
end;
end;


//==================================================================查找替换
tt:=wdCharacter;
ts:=wdExtend;
for I := 1 to wordapp.ActiveDocument.Bookmarks.Count do
begin
ItemIndex := I;
//取指定Index的书签
vBookMark := wordapp.ActiveDocument.Bookmarks.Item(ItemIndex);
if LowerCase(vBookMark.Name) = 'b1' then
begin
vBookMark.Select();
len:=length(vbookmark.Range.Text)-1;
vSelection.MoveLeft(tt,len,ts);
vSelection.Delete(tt,len);
vSelection.InsertBefore('水温温');
end;
if LowerCase(vBookMark.Name) = 'b2' then
begin
vBookMark.Select();
len:=length(vbookmark.Range.Text)-1;
vSelection.MoveLeft(tt,len,ts);
vSelection.Delete(tt,len);
vSelection.InsertBefore('气温温');
end;

if LowerCase(vBookMark.Name) = 'b4' then
begin
vBookMark.Select();
len:=length(vbookmark.Range.Text)-1;
vSelection.MoveLeft(tt,len,ts);
vSelection.Delete(tt,len);
vSelection.InsertBefore('气温温');
end;
end;
//==========================================================================

wordApp.Disconnect();
end;
end.
//好用的话记得给分吆 [:)]
 
谢谢 一团火的 指教 可是我运行到代码 len:=length(vbookmark.Range.Text)-1;
vSelection.MoveLeft(tt,len,ts);
vSelection.Delete(tt,len);
就会报错,提示该方法没有该参数,使用不正确,我用的是调用 ole的 ,不是用word件的,按照你的代码 执行下去,len 永远是0的呀,怎么会 是0 呢???
 
To delphiaaa:
1、不知这个说明你仔细看了没有:
说明:定义标签的对对象必需是(一个任意字符或空格或回车符),不充许是单独的光标位置。这样作窗体上放一个 WordApplication1 改名为WordApp
2、不要断章取义,我上面也没提到要用 OLE 呀!(Bug:用 OlE输出 word 时后,如果看完内容后手动关闭word 文件,就会有 word 进程留在系统进程中,输出次数越多,驻留 word 进程就越多)
3、标签处,如果在前面已经插入数据了,len 它怎可能是 0 呢???
4、如果需要的话我把 word 模板发给你。
5、我的 QQ:75240180 我常在 中南海打鱼。[:)]
 
再次感谢 一团火的 答复
 
后退
顶部