怎样在word弹出菜单中增加一菜单?在线等待.我都等了这么几天了,还没人能回答吗? (300分)

  • 主题发起人 主题发起人 c~c
  • 开始时间 开始时间
试试:

procedure GotoPageNumber(WrdApp: TWordApplication;PageNumber:OleVariant);
var
what,which,Count:OleVariant;
begin
what:=wdGoToPage;
which:=wdGoToNext;
Count:=WrdApp.Selection.Information[wdNumberOfPagesInDocument];
WrdApp.Selection.GoTo_(what,which,Count,PageNumber);
end;


var
count,cn:olevariant;
.....
Left:=20;
top:=20;
Width:=565;
height:=80;
Count:=wordapplication1.Selection.Information[wdNumberOfPagesInDocument];
for i:=1 to count do
WordApplication1.ActiveDocument.Shapes.AddPicture( 'E:/temp/b' + IntToStr(I) + '.bmp',EmptyParam, EmptyParam, Left, Top, Width, Height,EmptyParam);
n:=WordApplication1.ActiveDocument.Shapes.Get_Count;
for i:=1 to n do begin
cn:=i;
count:=1;
WordApplication1.ActiveDocument.Shapes.Item(count).Select(cn);
WordApplication1.Selection.cut;
GotoPageNumber(WordApplication1,i);
WordApplication1.Selection.Paste;
end;
 
to linsb:
我正在测试你的代码,可以的话马上给你加分.
 
to linsb:
刚才测试过你的代码, 结果是这样的:
在第一页到第三页没有图片,第四页有一幅图片,第5页有四幅图片。
是不是那地方还有问题呀?
 
我已试过,没问题。思路:一、先将图片插入(都在首页),二、然后分别移动到各页首。
完成第一步存盘退出。试试。
 
to linsb:
还是不行呀,还是在第一页到第三页没有图片,第四页有一幅图片,第5页有四幅图片。
 
我的Email:linsb3031@163.com
把你的程序发给我,我帮你调试。我的:win2000 sever delphi 5,word2000。
 
to linsb:
真是感谢你,但经过测试你的代码有这样一点问题:当wordtest.doc文件里没有图片时,你的代码可以实现我说的功能,但如果wordtest.doc文件里有图片就不行了,我想可能是:WordApplication1.ActiveDocument.Shapes.Get_Count和WordApplication1.ActiveDocument.Shapes.Item(count).Select(cn);这两行代码有问题,怎么改呢?
 
如果wordtest.doc文件里有图片,我给的代码当然不行,你需要搞清楚需要移动的图片是那一个,需要移到那页,WordApplication1.ActiveDocument.Shapes.Item(count).Select(cn);只对文档中无图片是对的,因此需要记录一下文档中的图片有那些,其名是什么(WordApplication1.Selection.ShapeRange.Get_Name)?
一些代码我已提供。
 
to linsb:
我就是要实现把b0.bmp插到第一页,b1.bmp插到第二页,如此类推.
 
下面的代码在我这没问题:
.....
Left:=20;
top:=20;
Width:=565;
height:=80;
n0:=WordApplication1.ActiveDocument.Shapes.Get_Count;
for i:=1 to count do
begin
WordApplication1.ActiveDocument.Shapes.AddPicture( 'E:/temp/b' + IntToStr(i) + '.bmp',EmptyParam, EmptyParam, Left, Top, Width, Height,EmptyParam);
end;
n:=WordApplication1.ActiveDocument.Shapes.Get_Count;
for i:=n0+1 to n do begin
cn:=i;
cn0:=n0+1;
WordApplication1.ActiveDocument.Shapes.Item(cn0).Select(cn);
WordApplication1.Selection.cut;
GotoPageNumber(WordApplication1,i);
WordApplication1.Selection.Paste;
end;
....
 
to linsb:
我也试出来了,改动了几个地方,是下面这样的:
WordApplication1.ActiveDocument.Shapes.AddPicture( 'E:/temp/a' + IntToStr(I-1) + '.bmp',EmptyParam, EmptyParam, Left, Top, Width, Height,EmptyParam).Name := 'bmp' + IntToStr(I);
for J := 1 to count do
begin
str := WordApplication1.Selection.ShapeRange.Get_Name;
if str = 'bmp' + IntToStr(J) then
begin
WordApplication1.Selection.cut;
GotoPageNumber(WordApplication1, J);
WordApplication1.Selection.Paste;
Break;
end;
end;

非常感谢你,你至少可以得到150分了。对第二个问题你有没有解决办法?
 
to linsb:
还在吗?帮我看看第二个问题,好吗?300分我都想给你。
 
希望贴出你改动的完整代码,在我这测试好像有问题。
对第二个问题我同意天与地,因对你的问题不够了解,很难替你想办法。
 
to linsb :
以下为全部代码:
procedure TForm1.Button2Click(Sender: TObject);
var
count,cn, FileName, vis: olevariant;
Left, Top, width, height: Olevariant;
I, J, n, K:Integer;
a: array [0..4] of string;
str: string;
begin
FileName := 'e:/wordtest.doc';
vis := True;
WordApplication1.Visible := True;
WordApplication1.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, vis);
Left:=20;
top:= 5;
Width:= 465;
height:= 30;
Count := wordapplication1.Selection.Information[wdNumberOfPagesInDocument];
K := WordApplication1.ActiveDocument.Shapes.Count;
Memo1.Lines.Add('Insert bmp before: ' + IntToStr(K));
for I := 1 to count do
begin
WordApplication1.ActiveDocument.Shapes.AddPicture( 'E:/temp/a' + IntToStr(I-1) + '.bmp',EmptyParam, EmptyParam, Left, Top, Width, Height,EmptyParam).Name := 'bmp' + IntToStr(I);
// a[I-1] := (WordApplication1.ActiveDocument.Shapes.AddPicture( 'E:/temp/a' + IntToStr(I-1) + '.bmp',EmptyParam, EmptyParam, Left, Top, Width, Height,EmptyParam).Name);
// Memo1.Lines.Add(a[I-1]);
end;
n := WordApplication1.ActiveDocument.Shapes.Count;
Memo1.Lines.Add('Insert bmp after: ' + IntToStr(n));
Edit1.Text := IntToStr(n);
for I := 1 to 5 do//n do
begin
cn := I;
count := K+1;
WordApplication1.ActiveDocument.Shapes.Item(count).Select(cn);
for J := 1 to 5 do
begin
str := WordApplication1.Selection.ShapeRange.Get_Name;// WordApplication1.ActiveDocument.Shapes.Item(cn).Name;//
Memo1.Lines.Add('K:=' + IntToStr(K) + 'I=:' + IntToStr(I) + ' J=:' + IntToStr(J) + ' Name:' + str);
if str = 'bmp' + IntToStr(J) then
begin
WordApplication1.Selection.cut;
// WordApplication1.Browser.Next;
GotoPageNumber(WordApplication1, J);
WordApplication1.Selection.Paste;
Memo1.Lines.Add('===============================================');
Memo1.Lines.Add('K:=' + IntToStr(K) + ' I=:' + IntToStr(I) + ' J=:' + IntToStr(J) + ' Name:' + str);
Memo1.Lines.Add('===============================================');
Break;
end;
end;
end;
end;
 
to linsb :
第二个问题真的无解吗?我都可以在主菜单中加一项菜单,为什么就不能在弹出菜单中加呢?
 
to c~c:
电话联系到微软Office盗版技术支持中心,可以得到最具的权威性的解决方案.
 
关于第二个问题,我在EXCEL中实现过,对于WORD,我目前没有空去试,不过
提供一个思路,给不给分不重要,因为分享是快乐的。
1、在WORD中弹出菜单有多个,主要是对当前选中的不同的对象有不同的菜,用遍历方式先找出系统中的所有工具档菜单,确定其中一个就是针对图片操作的,记下它的名称
2、打开“记录宏”记录下你手工进行自义一个工具档菜单(随便创建,主要是看方法),查看宏是如何建立菜单的,更改菜单的所属对象即可得到你象要的。
3、注意!弹出菜单属于工具档菜单而不是主菜单,它一旦创建就不会自动去除,你必需自己去删除它,不然用户不在你和程序中打开WORD也可以看到这个菜单的。删除方法有二,其一是在程序退出时,删除它(用加菜单一样的方法)问题是如果用户手工关闭了WORD,你没法处理了。我的作法是,其二,写一个加载宏,在OnClose自动方法中加入删除该菜单的处理即可。
 
to bundur:
谢谢你的问答,但我想知道手工怎么样创建菜单?
 
在工具栏上点右键,“自定义”-> “工具栏”-> “创建”
上面得到一个工具栏名为“自定义 1”
在命令页中,在“类别”为“文件”,“命令”为“新建”的按钮拖到你新建的工具栏上即可。然后可以重新定义这个按钮的名称和动作等。
不好意思,我现在没有时间,不能为你做一个可用的例子。自己参透参透了...
我也是这样 Try&Try 的!
参考:

Sub Macro1()
'
' Macro1 Macro
' 宏在 2003-07-24 由 Bundur 录制
'
CommandBars.Add(Name:="自定义 1").Visible = True
CommandBars("自定义 1").Controls.Add Type:=msoControlButton, ID:=2520, _
Before:=1
End Sub
 
to bundur:
我正在试。我是想实现这么一个功能,当选中一幅图片后,在鼠标右键弹出菜单里有“打印图片”、“保存图片”等,点“打印图片”菜单后就打印所选中的图片,点“保存图片”后就保存该图片。
如果你可以实现的话,我另开帖加300分。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
851
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部