请教各位专家:如何象金山毒霸嵌入WORD工具栏一样,把自己的按钮添加到EXCEL中,用来启动自己的程序?(200分)

  • 主题发起人 主题发起人 sunyb
  • 开始时间 开始时间
可能这个问题涉及了某些“高手”的个人利益,所以一直未能公开,其实用VB和VC解决是一件相当容易的事(直接导入几个库就可以了),从这个问题也让我产生了放弃DELPHI改学VC的念头,毕竟现在是盖茨的天下,DELPHI的路不会走得太远了
 
在EXCEL中添加插件是一件相当有用的工作,我们可以直接利用EXCEL的大众化数据处理,然后给客户安装插件,进行必要的数据自动化(特别是单项记录格式化打印功能),有了这些插件,一些必要的数据录入界面完全可以不做了。
我希望想解决这个问题的大侠们都能来讨论这个问题,因为我的水平实在太菜了。
 
虽然用宏的办法可以解决,但总觉得层次低了点。
 
用宏解决不是一个好方法,delphi的事件你怎样加上去?
我也参与,但我对Com一无所知,难!
如果谁能解决,我贡献500分。。。。
 
执行过程中在
try
aCommandBar:=excelapp.CommandBars.Add('delphitest',msoBarTop,emptyparam,true);
aCommandBar.Set_Visible(True);
showmessage(inttostr(aCommandBar.Controls.Count));
<--------这里返回的是0 ,为什么?
//aButton := aCommandBar..Controls.Add(msoControlButton, <--------执行到这里失败-EmptyParam,EmptyParam,EmptyParam,true) as _CommandBarButton;
//aButton.Set_Style(msoButtonIconAndCaption);
//aButton.Set_Caption('myTest');
//abutton.Set_Visible(true);
//aButton.Set_Tag('test111');
//FCommandBarButton := TCommandBarButton.Create(nil);
//FCommandBarButton.ConnectTo(aButton);
//FCommandBarButton.OnClick := FClick;
except
ShowMessage('加载失败');
end;
 
看来你都差不多搞好了,差一点点!
 
现在是工具栏添加上了,就是无法添加按钮
 
可以肯定在OFFICE应用程序中
procedure TCommandBarButton.InitServerData
这段数据是一样的,在Office_TLB.pas中:
IID_ICommandBarButtonEvents: TGUID = '{55F88890-7708-11D1-ACEB-006008961DA5}';
DIID__CommandBarButtonEvents: TGUID = '{000C0351-0000-0000-C000-000000000046}';
CLASS_CommandBarButton: TGUID = '{55F88891-7708-11D1-ACEB-006008961DA5}';
 
可能还需要加入某些单元才行
在VC例子中还需要导入EXCEL9.OLB文件,在DELPHI中不知如何引用?
 
哈哈,我已经搞好了,就参考你的方法,为Word加上了工具条和按钮,并为按钮加上了delphi的事件。
 
WORD上加按钮一点没有问题的,就是EXCEL不知怎么办?
 
水深火热之中难道每人拉一把吗?我的QQ:136183 盼望中...
 
我猜你的 TGuid 错了,你要找到对应的guid
Excel我没有试过,我试试看
 
我刚试过了,能加上呀,一点问题也没有,看来是你的Guid错了。
 
我的不是AddIn的,要做Addin,相信你会。
//主程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleServer, Word2000, Office2000, StdCtrls, wordTbButton, ImgList,
TB2Item, Clipbrd, Excel2000;
type
TForm1 = class(TForm)
app1: TWordApplication;
Button1: TButton;
ImageList1: TImageList;
Wd: TWordDocument;
Button2: TButton;
app: TExcelApplication;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure app1DocumentChange(Sender: TObject);
private
{ Private declarations }
FButtonNewDoc: TCommandBarButton;
aButton : _CommandBarButton;
function CreateButton(ACommandBar: CommandBar): _CommandBarButton;
procedure FClick(const Ctrl: OleVariant;
var CancelDefault: OleVariant);
public
{ Public declarations }
procedure CopyBmpToClp(imList: TImageList;
index: integer);
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
aCommandBar : CommandBar;
begin
app.Connect;
// aCommandBar := App.CommandBars.Add('办公自动化', msoBarTop, False, True);
FButtonNewDoc := TCommandBarButton.Create(nil);
aButton := CreateButton(app.CommandBars.Item['Standard']);
aButton.Set_Caption('发放');
aButton.Set_TooltipText('将会议记录发给你的同事');
aButton.Set_Tag(aButton.Caption);
CopyBmpToClp(imageList1,0);
aButton.PasteFace;
FButtonNewDoc.ConnectTo(aButton);
FButtonNewDoc.OnClick := FClick;
app.Visible[0]:=true;
// aCommandBar.Set_Visible(True);
// app.
//Wd.ConnectTo(app.Documents.AddOld(emptyParam,EmptyParam));
//wd.Name:='eOAS-会议记录';
end;

procedure TForm1.CopyBmpToClp(imList: TImageList;
index: integer);
var
bmp: Tbitmap;
begin
with TClipboard.Createdo
begin
bmp:=Tbitmap.Create;
try
bmp.Height:=imList.Height;
bmp.Width:=imlist.Width;
imlist.Draw(bmp.Canvas,0,0,Index);
assign(bmp);
finally
bmp.Free;
free;
end;
end;
end;

function TForm1.CreateButton(ACommandBar: CommandBar): _CommandBarButton;
begin
Result := ACommandBar.Controls.Add(msoControlButton, EmptyParam, EmptyParam, 1, True) as _CommandBarButton;
with Resultdo
begin
Set_Style(msoButtonIconAndCaption);
end;
end;

procedure TForm1.FClick(const Ctrl: OleVariant;
var CancelDefault: OleVariant);
begin
//App.Selection.TypeText(DateTimeToStr(Now) + #13#10);
showmessage('这是Excel 的自定义按钮 传过来的,对不对?');
end;

procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
try
FButtonNewDoc.free;
//app.CommandBars.Item['办公自动化'].Delete;
except
//
end;
end;

procedure TForm1.app1DocumentChange(Sender: TObject);
begin
// if app.Documents.Count>0 then
// app.CommandBars.Item['Standard'].Controls['发放'].Set_Visible(app.ActiveDocument.Name=wd.Name);
end;

end.

//引用的程序
unit WordTbButton;
interface
uses Classes,ComObj, ActiveX, Office2000, Word2000, oleServer;
type
TCommandBarButtonClick = procedure(const Ctrl: OleVariant;
var CancelDefault: OleVariant) of Object;
TCommandBarButton = class(TOleServer)
private
FIntf: CommandBarButton;
FOnClick: TCommandBarButtonClick;
function GetDefaultInterface: CommandBarButton;
procedure SetOnClick(const Value: TCommandBarButtonClick);
protected
procedure InitServerData;
override;
procedure InvokeEvent(DispID: TDispID;
var Params: TVariantArray);
override;
public
procedure Connect;
override;
procedure ConnectTo(svrIntf: CommandBarButton);
procedure Disconnect;
override;
property DefaultInterface: CommandBarButton read GetDefaultInterface;
published
property OnClick : TCommandBarButtonClick read FOnClick write SetOnClick;
end;

implementation
procedure TCommandBarButton.Connect;
var
punk: IUnknown;
begin
if FIntf = nil then
begin
punk := GetServer;
ConnectEvents(punk);
Fintf:= punk as CommandBarButton;
end;
end;

procedure TCommandBarButton.ConnectTo(svrIntf: CommandBarButton);
begin
Disconnect;
FIntf := svrIntf;
ConnectEvents(FIntf);
end;

procedure TCommandBarButton.Disconnect;
begin
if Fintf <> nil then
begin
DisconnectEvents(FIntf);
FIntf := nil;
end;
end;

function TCommandBarButton.GetDefaultInterface: CommandBarButton;
begin
if FIntf = nil then
Connect;
Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation');
Result := FIntf;
end;

procedure TCommandBarButton.InitServerData;
const
CServerData: TServerData = (
ClassID: '{55F88891-7708-11D1-ACEB-006008961DA5}';
IntfIID: '{000C030E-0000-0000-C000-000000000046}';
EventIID: '{000C0351-0000-0000-C000-000000000046}';
LicenseKey: nil;
Version: 500);
begin
ServerData := @CServerData;
end;

procedure TCommandBarButton.InvokeEvent(DispID: TDispID;
var Params: TVariantArray);
begin
case DispID of
-1: Exit;
// DISPID_UNKNOWN
1: if Assigned(FOnClick) then
FOnClick(Params[0], Params[1]);
end;
{case DispID}
end;

procedure TCommandBarButton.SetOnClick(const Value: TCommandBarButtonClick);
begin
FOnClick := Value;
end;

end.
 
我本来用Word的,后来加上、excel试试,没有问题,所以你看到很多没有的控件
 
谢谢xuxiaohan
 
后退
顶部