Delphi与Word之间的融合技术 (0分)

  • 主题发起人 主题发起人 yzhshi
  • 开始时间 开始时间
是这里了,可惜我不会呀!

示例向命令栏“Custom”添加一个命令栏控件。COM 加载项“FinanceAddIn”将在
每次单击该控件时运行。

Set myBar = CommandBars("Custom")
Set myControl = myBar.Controls _
.Add(Type:=msocontrolButton)
With myControl
.FaceId = 2
.OnAction = "!<FinanceAddIn>"
End With
myBar.Visible = True
 
实验代码如下,希望那位能够将Com部分不上,我对这个是根本不懂。[:)]
uses Comobj,Word2000;

var
Word_Handle, Doc_Handle: OleVariant;
Word_Button: OleVariant;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Word_Handle := GetActiveOleObject('Word.Application');
except
try
Word_Handle := CreateOleObject('Word.Application');
except
Exit;
end;
end;
Word_Handle.Visible := True;

Doc_Handle := Word_Handle.Documents.open(FileName := 'C:/1.doc');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Word_menubar: OleVariant;
begin
Word_menubar := Doc_Handle.CommandBars[2];//默认添加到了Formating上面

Word_Button := Word_menubar.Controls.Add(type := 1, Temporary := False);
Word_Button.Caption := '测试按钮';
Word_Button.Visible := True;
Word_Button.OnAction :='!<BtnEvent>';
end;
 
公布我的研究结果,有不正确的地方请指正:
要调用Office里面的按钮事件,实际上是需要连接到按钮事件的IDispatch接口。按钮接口
的定义在Office2000.pas文件中。要连接到这些接口,你须自己编写Invoke方法。但是有些难
度,我曾经试了一下,但是不成功。但是今天在http://www.techvanguards.com/看到有一个软
件叫eventsinkimp,可以自动生成连接Com事件的组件,立马下载了一个(现在是2.0版)。
安装完了运行,发现可以Import Type Library,和Delphi一样,但是下面可以选择跟踪
那一个COM的事件。于是选择:MicroSoft Office Object Library9.0,然后选择一个相应的
接口。生成三个文件:Office_TLB,OfficeEvents和Office_TLB.dcr。
然后回到delphi,Install Component,在ACTIVEX里面出现了几个控件:
TOfficeCommandBarButtonEvents等,这就是我们想要的!!!里面有click事件。
接下来就简单了,先建立一个Bar然后建立一个Commandbarbutton,然后调用
TOfficeCommandBarButtonEvents.connect方法把我们刚才建立的Commandbarbutton
连接起来,这样就可以了!!!
注意:安装了windows installer 2.0的同志恐怕麻烦一点,安装不上去,害得我
重装了系统,哪位解决了的通知我一声。这是我为了安装XML4.0装的,没办法。
Ably:给分!!:)

 
求教各位大侠,在Delphi6中自定义的Menu怎样才能嵌入Word2000中?
小弟搞了很久了,还是不行。不知道哪位大侠有没有这方面代码。
在下将会感激不尽。
 
很好!谢谢SeaHawk!
不知道使用这个办法生成的事件在其他版本的Word里面会如何?
Word目前常用的有Word 97 /word 2000/word xp呀。
to SeaHawk,你有条件实验一下吗?
还有,那个控件是什么原理呢?对了,不知道那位大虾能够使用我上面提供的使用Com的思路实现一下?
我想那个能够更好一些,至少能够让我们更深入的了解Com,了解Word!
 
用Servers上的控件和OLE方式各有千秋,有些方法在Servers控件上不可用,比如控制
button和BAR显示的visible属性在servers里就是只读的:(这是后只好用OLE方式。
(不过你直接把源代码里属性改成可写的也行)。
但是Servers的效率高一些,还可以调用用一些事件。我现在是两种办法一起用:)
 
你可以针对的版本生成相应的组件:)
我看了一下代码,只要接口不变,办法就可以。
 
我的意思是一个可执行文件,是否使用所有版本(至少是Word 2000/Xp)
 
yzhshi:
我知道,我没用过XP,所以不敢说。但是我估计90%是可以的,除非微软把按钮的接口改了
(连GUID都换了)才会有问题。迟一点可以试一试,现在没时间。不过到底有没有BUG,我
还没有仔细测试。小心一点用总是好的。我看要方便的调用COM里面的事件,这是最通用的
办法了。
 
是的,至少这是一种自己产生事件的最简单、最使用的方法!
我想会适合于Xp的,当然仅仅是设想。[:)]
 
ABLY:
差不多吧。从服务器中接受事件是很模式化的,基本上都是采用一个通用的事件接收器
,然后在Invoke完以后调用相应的方法。他做的上面那个CommandBarButton基本上正常,但是
CommandBarComBoBox不行,如果在事件处理过程里直接访问那个控件就会出错,如果不,就完
全没有问题。我现在还没有明白是什么回事。希望熟悉COM的同志看看。
什么是海文标书?

 
珍藏中。。。。。。
 
一种方法是OLE中有一个COOLBAR,上面加button,通过DELPHI控制预览,页面设置
二种方法是通过word的button,通过VBA控制ole,来预览与页面设置
第二种方法是不是好一些???
 
1.OLE中,word实现预览与页面设置?
to seahawk 有这么复杂吗? 我反编译那个程序后,发现就是一个word.tlb,但不知道他怎么做

2.我有个想法,向word写宏,也可提供在word中造个按钮,用宏来预览或页面设置,这个不难.
怎么做?
 
向word写宏,也可提供在word中造个按钮,怎么做?
 
触发CommandBarComBoBox事件时读取相应的CommandBarComBoBox属性值的时候会出现一个
错误:“OFFice安装错误....”然后是“需要加载一个DLL”,不知道是什么原因?重装
过系统都不行。但是,不在事件中读取的话就没有问题。我听说有OFFICE系列有一个“开
发版”,不知道是否有关。我现在的解决办法是:发送一个消息,然后处理,不知道各位
有什么高招。
 
对于CommandBarComBoBox事件的错误的讨论请见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=893449;
有一个不是办法的办法,希望能给各位一些启示。
 
超级好资料,收藏!!
 
前面我就Delphi中调用Word写了一些,比较注重于具体实现,对于研究的方法则说的比较片面。
今天晚上,我静下心来,总结了一下怎样在Delphi中生成操作Word的代码。如果说前面我写的
是金子,那么下面这篇文章就是点石成金的手指(太自夸了,呵呵)。毕竟已经有半年多没有研
究这些了,只能零碎的写一些心得了。

使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,
但是我们充分的利用VBA代码就可以弥补这个功能。
Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档
的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。
下面就如何在Delphi里面利用Word的VBA代码进行一些总结。
1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是
选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,
此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择
“工具->宏->VisualBasic编辑器”,查看生成的宏代码。

例如:我们要将文档中的“讨论”全部替换成“研讨”。
a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公
用模板里面。
b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。
c. 结束宏的录制,点击结束按钮。
d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面
的模块里面的NewMacros模块。
以下是生成的宏代码:
Sub Macro1()
'
' Macro1 Macro
' 宏在 2002-2-1 由 yzhshi 录制
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "讨论"
.Replacement.Text = "研讨"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
2、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要
做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光
标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的
VBA帮助来判断代码是否有用。

如上例,精简下来,剩下以下代码。
Sub Macro1()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "讨论"
.Replacement.Text = "研讨"
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者
文档的句柄或者文档的句柄.Application就可以直接操作了。
例:逐句翻译:(Word_Handle是Word的句柄)
(VB) Selection.Find.ClearFormatting
(Delphi) Word_Handle.Selection.Find.ClearFormatting;

(VB) Selection.Find.Replacement.ClearFormatting
(Delphi) Word_Handle.Selection.Find.Replacement.ClearFormatting;
以上两句简单添加上Word的句柄就可以了。

(VB) With Selection.Find
Text = "讨论"
Replacement.Text = "研讨"
End With
(Delphi) Word_Handle.Selection.Find.Text := '讨论';
Word_Handle.Selection.Find.Replacement.Text := '研讨';
以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。

(VB) Selection.Find.Execute Replace:=wdReplaceAll
(Delphi) Word_Handle.Selection.Find.Execute(Replace:=2);
上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2?
这里有几个办法,
一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了;
二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;
三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:
Sub ShowValue()
MsgBox wdReplaceAll
End Sub

最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
?:/Program files/Microsoft Office/Office10/2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。
 
后退
顶部