怎样为wordapplication 的word 加上自定义的菜单和相应的事件?(200分)

  • 主题发起人 主题发起人 let_it_be
  • 开始时间 开始时间
L

let_it_be

Unregistered / Unconfirmed
GUEST, unregistred user!
做WORD的COM加载项吧,有难度。微软的网站上有VB和VC的例子,Delphi的例子在网上很难找。
 
有没有人回答?
 
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
b:CommandBarPopup;
c:CommandBarButton;
begin
if WordApplication1.CommandBars.ActiveMenuBar.Enabled then begin
with WordApplication1.CommandBars.ActiveMenuBar do begin
ListBox1.Clear;
for i:=1 to Controls.Count do
ListBox1.Items.Add(Controls.Caption);
Controls[5].Set_Visible(false);
Controls[Controls.Count].Set_Caption('我的帮助');
b:=Controls.Add(msoControlpopup,EmptyParam,EmptyParam,EmptyParam,true) as commandbarpopup; //创建menuitem
with b do begin
Set_Caption('a项');
c:=Controls.Add(msoControlButton,EmptyParam,EmptyParam,EmptyParam,true) as CommandBarButton;
c.Set_Caption('我的第一个菜单项');
c.Set_OnAction('MBClick2'); //将一个宏赋值给这个ITEM
end;
end;
end;
end;
 
andy263:
我不懂将VBA的宏转换为Delphi的事件噢。
 
andy263:
也可以这样说,怎样在VBA的宏中执行delphi的代码?
 
看一下这些资料吧
请问:怎样用wordapplication增、删、改WORD菜单?需要示范代码,谢谢!
来自:menxin, 时间:2001-11-1 12:37:00, ID:700137
呵呵,真加这么多呀,好,我给你写一个吧

uses Office2000;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
WordApplication1.Connect;
WordApplication1.Visible:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
if WordApplication1.CommandBars.ActiveMenuBar.Enabled then begin
with WordApplication1.CommandBars.ActiveMenuBar do begin
{ ListBox1.Clear;
for i:=1 to Controls.Count do
ListBox1.Items.Add(Controls.Caption);}//你可以把现有的菜单信息放在这个LISTBOX里看一下
Controls[5].Set_Visible(false); //删除菜单,实际是隐藏
Controls[Controls.Count].Set_Caption('我的帮助'); //改菜单项
with Controls.Add(msoControlpopup,EmptyParam,EmptyParam,EmptyParam,true) do begin //增加菜单
Set_Caption('新菜单项');
end;
end;
end;
end;

给分吧![:D]
来自:tzahz, 时间:2001-11-1 15:08:00, ID:700421
兄弟:
谢谢,你已经得到了一百分,如果你告诉我如何在‘新菜单项下面’加上子菜单,60分
将事件处理与新的子菜单项联系起来,100分。
我实在找不到这方面的帮助,有的也是十分简单,许多用法都没有,如果你告诉我如何去取得
OFFICE开发的DELPHI的帮助,100~300送上。我还有700分。
谢谢!!!

来自:yexiaofeng, 时间:2001-11-1 23:32:00, ID:701479
我告訴你delphi中的server控件頁上的幫助哪裡找的到。
server頁上的控件實際上是office提供的ocx控件,delphi隻是把它們封裝(抱歉,不知道該不
該叫封裝)後放入server控件頁中。
所以,它們的完整幫助隻有microsoft有,在msdn中可以找的到,vb的幫助也有。隻許做很少
的改動就可以把MS的代碼直接拿來使用

来自:menxin, 时间:2001-11-2 2:42:00, ID:701577
加事件什么的得改成这样,因为要用到一些接口。
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
b:CommandBarPopup;
c:CommandBarButton;
begin
if WordApplication1.CommandBars.ActiveMenuBar.Enabled then begin
with WordApplication1.CommandBars.ActiveMenuBar do begin
ListBox1.Clear;
for i:=1 to Controls.Count do
ListBox1.Items.Add(Controls.Caption);
Controls[5].Set_Visible(false);
Controls[Controls.Count].Set_Caption('我的帮助');
b:=Controls.Add(msoControlpopup,EmptyParam,EmptyParam,EmptyParam,true) as commandbarpopup; //创建menuitem
with b do begin
Set_Caption('a项');
c:=Controls.Add(msoControlButton,EmptyParam,EmptyParam,EmptyParam,true) as CommandBarButton;
c.Set_Caption('我的第一个菜单项');
c.Set_OnAction('MBClick2'); //将一个宏赋值给这个ITEM
end;
end;
end;
end;
来自:menxin, 时间:2001-11-3 23:06:00, ID:704988
下面给出加入宏的代码:
var
vc:_VBComponents;
begin
vc:=WordApplication1.VBE.ActiveVBProject.VBComponents;
with vc.Item(2).CodeModule do begin
InsertLines(1,'Sub MyMacro');
InsertLines(2,'msgbox "this is a test"');
InsertLines(3,'End Sub ');
end;
end;

权限问题就得你自己考虑了,我想宏和其他的代码应该有同样的权限吧
为编这些宏,你得用些VB了,嘿嘿,我是不会了,只能给个MSGBOX了。哈哈~~~
我又想了一下,由于WORD提示是宏没找到,我想应该是一定要用宏的。
过程的方法可以继续试一下。
 
根本问题还没有解决呢?

在Deliphi的事件怎样加上?
 
要将远程指针赋值才行
 
menxin:
怎样做?
 
我只知道用用vba能够实现。
 
没弄清楚,怎么样在程序中自动创建WORD宏??并插入WORD中?
如使用邮件合并功能,那么MailMerge 是属于WORDDOCUMENT中属性?事件?怎么获得
MailMerge函数?
如VBA宏中:WordDocuments.MailMerge.DataSouce:=".........";
怎么在自定义Obj的WordDocuments中获得MailMerge这个函数?又怎么创建获得SQLSERVER
中的数据记录?
帮忙啊,已经崩溃了。。。。。。。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2459327
急急急,如何在office中添加菜单?
 
还是不知道怎么做,
app2001:能不能详细点,全靠你的啦。
 
to let_it_be:
看你在http://www.delphibbs.com/delphibbs/dispq.asp?lid=2455514 的贴,
我看没必要使用自定义菜单啊?你主要是想让WORD正常运行吧??
 
to: oly102
两个问题,随便解决一个就可以啦!
 
我不是在http://www.delphibbs.com/delphibbs/dispq.asp?lid=2455514
答了吗?问题没解决?干吗非要用WORDAPPLICATION控件?
 
如果能加上菜单,就可以不用OleContainer了。
 
我也没试过,只能提供那些信息给你了。
 
再给你些信息,从前人家总结的关于宏的方面的
Word宏和Delphi
来自:yzhshi, 时间:2002-2-2 14:24:00, ID:902680
前面我就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,其他版本路径基本类似。
 
后退
顶部