用delphi 在Word上面增加一个按钮

将Word嵌入Delphi中 <br />unit Main;<br />interface<br />uses<br />  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />  Dialogs, ExtCtrls, StdCtrls,Comobj;<br />type<br />  TForm1 = class(TForm)<br />    Panel1: TPanel;<br />    Panel2: TPanel;< 阅读详情

新建一个Active Library
2. 新建一个COM Object,在Class Name填一个名字,如Test。
点一下Implemented Interface后面的List按钮。再点一下对话框中的Add Library按钮,
选择“Program Files/Common Files/Designer”目录下的msaddndr.dll文件。
然后在列表中找到msaddndr.dll里面的_IDTExtensibility2接口点击确定。
3. 现在Com AddIn部分已经完成,现在要在Word里面加一个CommandBar和一个按钮,并且让按钮响应事件。

4. 创建一个TcommandBarButton的OleServer类以连接到CommandButton并响应事件。代码:如下
定义部分
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
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Connect; override;
procedure ConnectTo(svrIntf: CommandBarButton);
procedure Disconnect; override;
property DefaultInterface: CommandBarButton read GetDefaultInterface;
published
property OnClick : TCommandBarButtonClick read FOnClick write SetOnClick;
end;
实施部分
{ TCommandBarButton }

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;

constructor TCommandBarButton.Create(AOwner: TComponent);
begin
inherited;

end;

destructor TCommandBarButton.Destroy;
begin

inherited;
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;

5. 继续完成Ttest类
在类定义里面增加两项
private
FCommandBarButton : TCommandBarButton;
procedure FClick(const Ctrl: OleVariant; var CancelDefault: OleVariant);

在OnConnection写下面代码
procedure TTest.OnConnection(const Application: IDispatch;
ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
var custom: PSafeArray);
//这是从资源中读取一个Bitmap并复制到粘贴板
procedure CopyBitMapToClipBoard;
var
aStream : TStream;
aBitMap : Graphics.TBitmap;
begin
with TClipboard.Create do
begin
try
aStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
aBitMap := Graphics.TBitmap.Create;
aBitMap.LoadFromStream(aStream);
Assign(aBitMap);
finally
aStream.Free;
aBitMap.Free;
Free;
end;
end;
end;
var
App : WordApplication;
aCommandBar : CommandBar;
aButton : _CommandBarButton;
begin
App := WordApplication(Application);
aCommandBar := App.CommandBars.Add('Test', msoBarTop, False, True);
aButton := aCommandBar.Controls.Add(msoControlButton, EmptyParam, EmptyParam, EmptyParam, True) as _CommandBarButton;
aButton.Set_Style(msoButtonIconAndCaption);
aButton.Set_Caption('Test');
//CopyBitMapToClipBoard; //这两句话是给按钮设定一个外部图标,
//aButton.PasteFace; //你要增加一个rcdata的bitmap资源bitmap大小为16*16,具体怎么做请参考其他文档
aButton.Set_Tag('test111');
FCommandBarButton := TCommandBarButton.Create(nil);
FCommandBarButton.ConnectTo(aButton);
FCommandBarButton.OnClick := FClick;
aCommandBar.Set_Visible(True);
end;

在OnDisconnection写下面代码
procedure TTest.OnDisconnection(RemoveMode: ext_DisconnectMode;
var custom: PSafeArray);
begin
FCommandBarButton.Disconnect;
FCommandBarButton.Free;
end;

写Click事件(在Word文档中插入当前时间)
procedure TTest.FClick(const Ctrl: OleVariant;
var CancelDefault: OleVariant);
begin
Ctrl.Application.Selection.TypeText(DateTimeToStr(Now) + #13#10);
end;

6. 最后用菜单->Run->Register Active Server注册Com对象
7. 给Word增加Com AddIn打开RegEdit,增加一个项“HKEY_CURRENT_USER/Software/Microsoft/Office/Word/Addins/AddInTest.Test”
在这个项下面增加一个字符串值“FriendlyName”随便给一个值,如“Test”
再增加一个双字节值“LoadBehavior”把值设为3

完成!现在打开Word你就可以看到增加了一个工具栏点一下上面的按钮就会在当前文档输出一个当前时间。

使用Delphi 7控制Word 2000生成文档的方法 最近帮同学用Delphi 7写的一个数据库应用中的一个功能是将查询的结果导出到一个Word文档中保存。虽然Delphi 7的Servers面板中提供了TWordApplication和TWordDocument组件,但是帮助中却几乎没有写它们的使用方法。于是在中国期刊网上down了许多的相关文章来看,只可惜几乎都是用Delphi 5写的(Delphi 7中不能兼容),而且都只是简单的介绍了一下,甚 阅读详情

相关推荐

再谈Delphi 7控制Word 2000——使用模板

再谈Delphi 7控制Word 2000——使用模板我首先想说明的是这篇文章算是我以前写的“使用Delphi 7控制Word 2000生成文档的方法”http://blog.youkuaiyun.com/neowang/archive/2004/10/08/127522.aspx的续篇(到目前为止,该文章已经被浏览了214+11次)。因为用户的需求发生了改变,我不得不在复习备考自然辩证法的几天里挤出时间来改

宋威的专栏 1399

用Delphi制作Office的Com AddIn

最近想做一个像金山词霸那样在Word上面增加一个按钮的东西在网上找了一会儿,竟然没有Delphi的例子,没办法只好自己搞定,1. 新建一个Active Library2. 新建一个COM Object,在Class Name填一个名字,如Test。点一下Implemented Interface后面的List按钮。再点一下对话框中的Add Library按钮,选择“Program Files/Co

cwxiao888的专栏 1526

基于DELPHI的Office插件开发实战项目

DELPHI开发的Office插件通过COM技术深度集成Excel、Word和Outlook等应用程序,实现企业级自动化办公。其典型应用场景包括:财务报表自动生、合同批量生成、邮件智能推送及数据采集标准化。依托VCL框架与类型库(TLB)封装,开发者可高效调用Office对象模型,结合窗体界面与后台逻辑解耦设计,提升维护性。该类插件广泛应用于金融、制造与政务领域,支持本地化部署与高安全性控制,满足对数据隐私和定制化要求较高的业务需求。

weixin_35949153的博客 431

DELPHI XE开发Office Add-In

DELPHI XE开发Office Add-In

harvardfeng的专栏 3085

Delphi7中使用DSOFramer组件操作Word文档指南

Delphi7作为一款经典的快速应用开发(RAD)工具,长期以来一直深受开发者的喜爱。随着企业需求的多样化,Delphi7也在不断进化,其中一项重要进步就是集成第三方组件,比如DSOFramer组件。DSOFramer是一个功能强大的ActiveX控件,它允许开发者在Delphi7应用程序中直接嵌入和操作Microsoft Office文档。Delphi7不仅支持传统的Windows应用开发,还具备创建跨平台应用程序的能力。

weixin_36231030的博客 898

DELPHI office插件

DELPHI office 插件

使用Delphi开发Office Word插件

使用Delphi开发Office Word插件 日期:2005年3月4日 作者:转自哈巴狗的小窝 人气: 69 查看:[大字体 中字体 小字体] 企商在线老牌虚拟主机商 购主机送鼠标 送U盘

LandyKing的专栏 3173

Delphi 2010制作Outlook2003 Com加载项流程

附件为在Delphi 2010中制作Outlook2003 Com加载项流程文档, 里面中图文并解,通俗易懂。

在Delphi中使用CreateOleObject方法对WORD文件进行操作

使用CreateOleObject方法对WORD文档操作具有先天所具备的优势,与delphi所提供的那些控件方式的访问相比,CreateOleObject方法距离WORD核心的操作“更近”,因为它直接使用OFFICE所提供的VBA语言对WORD文档的操作进行编程。以下是我在本机上所做的实验,机器软件配置如下:Windows XP+delphi7.0+OFFICE 2003这个程序很简单,在页面上放

windlazio的专栏 3399

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 927

《21天学通C++》阶段性成果测试题——hstring(手写string类)

总体考察了类的使用,缓冲区考察了指针和数组的使用、增删改查、考察编码思维、考察了类的重载。1.初始化子字符串的起始位置为-1,表示未找到,若buffer或findHstring为空,则返回-1。右边的字符串不为空,则分别获取母串和子串的长度(用循环),然后创建一个固定大小的数组。3.然后循环遍历寻找子串在母串中的起始位置,循环时可以通过两个长度相减,避免循环越界。2.如都不为空,则分别获取双方的字符串长度(用循环),然后。右边的字符串为空,则输出原来的字符串。是否为空,有一方为空则返回另一方。

立志成为炼丹师? 1265

用Word做Delphi报表输出工具

用Word做Delphi报表输出工具  整理编辑:China ASP   笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。如果用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合用户习惯。如果用3.0中的TQReport的报表部件,则两者都不能实时解决,必须修改原

wljcr的专栏 1108

终端效率神器:Tmux 安装与使用全指南

终端效率神器:Tmux 安装与使用全指南

身在被窝_心在编程 1361

如何在Delphi里面利用Word的VBA代码进行一些总结

1、  生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现 的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看 到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是 选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能, 此时Word一边执行你要实现功能,一

天下文章一大抄,只有做得好,没有抄的好! 2959

新手避坑指南:用SARScape 5.6.2处理Sentinel-1数据做SBAS-InSAR,这些参数设置错了白忙活

本文详细介绍了使用SARScape 5.6.2处理Sentinel-1数据做SBAS-InSAR时的关键参数设置技巧,帮助新手避免常见错误。重点解析了连接图生成、干涉工作流、DEM处理等环节的12个关键参数,包括Max Normal Baseline、Unwrapping Coherence Threshold等,提供实测安全值范围和优化建议,确保处理效率和结果准确性。

weixin_30694389的博客 559

Google AdSense收款前必做:W-8BEN税务认证的3个关键选择与1个提交时机小技巧

本文深入解析Google AdSense收款前必须完成的W-8BEN税务认证,重点介绍账号类型选择、特殊税率勾选、美国活动界定等3个关键决策,并分享提交时机的小技巧,帮助站长高效通过审核,确保广告收入顺利到账。

weixin_30443731的博客 678

用Delphi实现风Word97风格的工具栏

在Delphi的元件选项板Additional页中,新增了Controlbar元件,此元件和Win32页中的Toolbar、Coolbar配合使用,再辅以Imagelist、Mainmenu等元件,完全可以实现具有Word97风格的工具栏。下面以一个FORM中的工具栏为例,详细介绍设计步骤:         1从Additional页中选择Controlbar,将其放入FORM1中,设置其属性如

wljcr的专栏 1385

什么是华为OD?怎么才能通过华为OD机试?华为OD机试怎么刷题?(2024最新华为OD机试E卷更新中)

华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 11万+

DELPHI 打开WORD文档

应用程序可以把Word中的文本提取出来作为模糊查询的依据或其他操作。本例是单击“打开文档”按钮,从选中的Word文档中提取文本内容,如图7.27所示。    通过createoleobject方法创建OLE对象,通过OLE对象的Documents.Open方法打开所选中的Word文档,从文档中提取出文本内容显示在RichEdit1中,主要代码如下:    procedure TForm2.Butt

工作是我的生活 我为工作而陶醉 7156

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1529

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5746

Delphi之word报表

先上图: delphi实现代码如下: procedure TForm1.ToolButton12Click(Sender: TObject);var myTable: Table;oleCount,oleUnit: Olevariant; begin //以下打开word新的文档tryWordApplication1.Connect;WordApplication1.Caption :

会挽雕弓的专栏 1321

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Delphi与Word之间的融合技术(下)zt

Delphi与Ole,Word,Excel,查找与替换等 Delphi与Word之间的融合技术(下)zt来自:yzhshi, 时间:2002-2-2 14:24:00, ID:902680前面我就Delphi中调用Word写了一些,比较注重于具体实现,对于研究的方法则说的比较片面。今天晚上,我静下心来,总结了一下怎样在Delphi中生成操作Word的代码。如果说前面我写的是金子,那么下面这

pgnet 4789

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 浅谈Object Pascal的指针
下一篇: 如何初始化数组和记录
iseekcode
博客等级 码龄18年 36粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值