紧急求救:关于delphi对word域的控制问题!!!!!!!!!!!!! (100分)

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

delphilai

Unregistered / Unconfirmed
GUEST, unregistred user!
1、delphi调用word,当用户另外新建一个word文档的时候会使焦点发生变化,如何控制焦点?
2、delphi对word的域(Field)的访问控制,包括删除、替换成其他文本等。
实际应用的时候用户有一个word模板,其中的数据都是“域”,只需动态的根据数据库的数据来替换域的值就可以了,这对用户来说很实用,不过做起来比较麻烦,我没做过这方面的,特向各位dfw请教。

 
dfw 上的高手越来越少了,估计大家都转行去搞java了,delphibbs不知道什么时候得关门了,唉……
 
第二点的关键问题已经抓住了:
WordDoc.Fields.Item(Macro3).Code.Text:='NewValue';
WordDoc.Fields.Item(0).Delete;
第一点还是无法搞定。
 
当用户另外新建一个word文档的时候会使焦点发生变化,如何控制焦点?
说的详细一点
 
1、可以帮你搞定,哈哈~不过,代码在家,哈哈~急死你!
 
就是说我在用delphi写的程序里控制word时,新建一个word文档,然后焦点就应该在这个文档,但这个时候如果用户自己另外打开一个word文档,焦点就会跑到他新建的文档里去,但这不是我期望的,应该让焦点仍然留在我的delphi程序新建的word文档里。现在怎么来控制这焦点?
 
他的意思就是,OLE会自动失去焦点!

其实,只要对一个消息进行处理就成了!
 
doll_paul真是高人啊,哪个消息啊?怎么处理?
 
:( 高人不是,白痴一个。

忘记了,我记性差。如果不急,回家帮你查!
 
小子你不要这样说话
本来我也想知道这个问题的答案
给你这样一说
没人理了
 
什么意思?我说什么了!!!!
 
2:StevenA
不知道你对谁说话,doll_paul兄喜欢开玩笑的,呵呵,他常自己夸自己是白痴的,别见怪。
 
再说,我说自己是白痴,这与惹着您老人家了????过份!!
 
讨厌说话不负责任的人!!!!!!特别是程序员!!!

楼主的问题,我帮你在dFW里查了:TOleContainer是在CM_UIDEACTIVATE的消息处理中处理失去焦点的,因此只要把这个消息截获,就可以保持激活了。
 
我的话有什么恶意吗?
想凑一下热闹而矣
 
自诩为负责任的人的程序员

你少了一点度量吧
 
首先,我没有说我自己是程序员,因为水平不够,所以我不想丢程序员的脸!

老兄可以自己看看上面的话,是否有些不太好的意思表现出来!

你的要知道的问题,我回复了。这个争论也就打住吧,没有过多争论的必要。。。。。
 
我也在做和你一样的东西
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1485865
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1557436
焦点获取触发事件我还是没有办法实现,但是从窗口域中读写数据没有什么问题

============================================================
就是在程序中控制Word文档中的文本窗体域的输入输出,问题在于当窗体锁定的时候,虽然
其他的区域不可以修改,只有文本窗体域可以接受输入输出,但现在变成所有的文本窗体
域都可以接受输入输出,而不能够进行单个控制文本窗体域的输入输出,虽然可以通过解
除域的方式使文本窗体域取消,但非常麻烦
是否可以通过光标输入焦点的控制来达到这一个目的呢???

就是说如果光标不在应该所处的文本窗体域的位置,则自动回到应该所处的文本窗体域。
各位大虾可以探讨一下。例程在下面:
==============================================================
其中,f1,f2就是2个文本窗体域
==============================================================
unit test;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}

var Word_ole: Variant;
function GetWordObject (const ClassName: string): IDispatch;
{ 如果Word没有运行,则启动它,并返回一个自动化对象;
如果Word已经启动,就返回正在运行的实例的自动化对象。}
var
ClassID: TGUID;
Unknown: IUnknown;
begin
ClassID := ProgIDToClassID (ClassName);
if Succeeded (GetActiveObject (ClassID, nil, Unknown)) then
OleCheck (Unknown.QueryInterface (IDispatch, Result))
else
Result := CreateOleObject (ClassName);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
{获取创建Word.Application自动化对象,
如果Word尚未运行,Word启动}
Word_ole := GetWordObject ('Word.Application');
end;

procedure TForm1.Button1Click(Sender: TObject);
var NewDocument,f1,f2: Variant;
begin
Word_ole.Visible := True;
Word_ole.UserName:='user
Word_ole.Caption:='测试';
//增加一个新的Word文档对象
NewDocument:=Word_ole.Documents.open('d:/test/test.doc');
f1:=NewDocument.Application.ActiveDocument.FormFields.Item(1);
f2:=NewDocument.Application.ActiveDocument.FormFields.Item(2);
//锁定窗体,保护文档
NewDocument.Application.ActiveDocument.Protect(NoReset:=False, Type:=wdAllowOnlyFormFields);

f1.Result:='你好2!!';
Edit1.Text:=f1.Result;
f2.Result:=Memo1.Text;
//取消域,恢复成文本
f2.Selection.Fields.Unlink;
//保护文档
// NewDocument.PrintPreview;
end;

end.

 
我的第一句话是对delphilai说的

也是觉得你说话的方式好过隐才说的

没想到你却看成是争论

就这样,谈不成散伙~~~~~~~~~~~~~~~~~~~

想吵架到QQ40440619
 
没问题,我加你QQ!!
 
后退
顶部