每一个参数都要先声明为OleVariant然后赋了值再添入。
如:
var
filename:OleVariant;
...
begin
filename:='D:\train\Test.doc';
...
end;
具体用法可以参考msdn.
如:
var
filename:OleVariant;
...
begin
filename:='D:\train\Test.doc';
...
end;
具体用法可以参考msdn.
解决方案 »
- 一个Delphi跟pdf文件读取的问题
- ******************关于sha1算法*************************
- 问一个关于DBGrid1的很简单的问题!
- 请教图片(已在Form上生成了二维条码)的打印方法。
- 有没有real转str的函数
- 这样写网络收发包的线程程序是否会使线程阻塞?
- 如何制作自己的控件?请给出比较详细的步骤,或者能给出网页也行,给300分,决不食言,今天就给
- SQL Server Destop版不是用Socket通讯的吗?
- 打印"DELPHI5开发人员指南",请讨论!
- 如何用外部程序动态更改进度条的进度?
- 急!急!急! 高手请进!
- 怎样获得无限长的编辑VCL :)
ConfirmCovertions:文件转换提示(如低版本向告版本)
ReadOnly:以只读方式打开
AddToRecentFiles:把打开得文件添加到快件文件(最近文件)列表。
PassWordDocument:是否含有密码
....
Visible:创建时是否可视
老大,还用我一条条翻译么
通常只需要用第一个参数,其它可以忽略。
第一个参数指定文件名。
第2,3,4,7 个参数指定为false
第5,6,8,9 个参数指定为''
第十个参数指定为:wdOpenFormatAuto.就OK!
---- Microsoft Word 以它强大的文字处理功能、灵活多变的排版方法、所见即所得以及极为友好的用户界面等出众特点,已经博得了广大用户的肯定。无论西文还是中文,它都已成为首选的字处理应用软件,拥有众多的用户群。因此,若将其他一些,如机器翻译、中文校对、全文检索、实时语音合成等信息处理软件嵌入其中,将可以扩展WORD 的功能,使开发者能最大限度地利用WORD 的现有资源,加快开发速度,同时也拥有了一个潜在的广大用户群。一. Word 应用程序的开发工具
---- 现在,开发Word 应用程序有几种编程语言,WordBasic、VBA(Visual Basic for Applications) 和Word API。
---- 尽管WordBasic 和VBA 功能强大,但作为简单修改Word 的工具,多少有些大材小用。若不是大规模地彻底修改Office 组件,Word API 应该成为开发自己Word 应用程序的首选工具。特别是对人数众多的C 语言程序开发者来说更是如鱼得水,不仅无需学习任何新的编程语言,直接利用C 语言代码的快速、高效和灵活的特点,而且可以使用WordBasic 接口函数和Windows 动态连接库编程环境,实现对Word 功能的添加。二. Word API 的使用方法
---- Word API 生成的是一个可在Word 中直接运行的Word 加载项,它是一个以WLL 为扩展文件名的单机动态连接库(DLL)。这种WLL 是标准的Windows 动态连接库(DLL)的特殊形式。可以用任何一个创建Windows DLL 的环境来编译、链接和建立WLL。
---- 在Microsoft Word Developer's Kit(MS Word 开发工具箱) 中,提供了Word API 的接口函数,介绍如下:---- 1. Word 加载项的启动和卸载函数---- (1) void FAR PASCAL wdAutoOpen(short DocID) ---- 在Word 中加载WLL 的同时,Word 会自动执行这个函数。在执行过程中, 函数wdAutoOpen 完成以下几个任务:WLL 需要向Word 登记WLL 中定义的所有函数; 将WLL 中的操作命令添加到Word 的主菜单、快捷菜单和工具条中; 给WLL 的操作命令指定快捷键; 完成WLL 功能的初始化(如:机器翻译、中文校对的词库读入)
---- void FAR PASCAL wdAutoRemove(void) ---- 当WLL 被卸载时,如果WLL 程序中定义了wdAutoRemove(void) 函数,Word 将在卸载执行这个函数。在该函数中,可以保存退出时我们定义功能函数生成的必要数据。---- 2. Word 加载项中的登记函数---- 要想让Word 中的某个主菜单项、快捷菜单项、工具条按钮或快捷键完成我们定义的某个函数,就必须在加载WLL 时,先向Word 登记我们的应用函数。Word API 的接口函数CAPIRigister 可以完成登记任务。函数定义形式如下:---- short CAPIRegister(short DocID, LPUCHAR lpszFunctionName, LPUCHAR lpszDescription); ---- 参数含义
DocID 在WLL被加载后,Word传递给WLL入口函数wdAutoOpen的参数
lpszFunctionName 向Word登记的WLL函数
LpszDescription 指向的菜单项中该函数命令时,状态条中显示该命令的说明字符串
---- 3. 在Word 中将加载函数添加到主菜单项、快捷菜单项、工具条按钮和快捷键中---- 在WLL 中应用函数登记完成之后, 就可以在主菜单、快捷菜单和工具条中添加自己的菜单项和快捷键。这些工作由下面的函数完成,AddButton, NewToolbar, ToolsCustomizeMenu, ToolsCustomizeMenuBar 和ToolsCustomizeKeyboard。---- a) 在WORD 工具条中添加一个按钮:---- short CAPIAddButton (short DocID, LPSTR lpszToolbar, short cPosition, LPSTR lpszMacro ,LPSTR lpszFace ); ---- b) 在WORD 中添加新的工具条---- short CAPIAddToolbar (short DocID, LPSTR lpszToolbar); ---- c) 在主菜单中添加新的菜单项---- short CAPIAddMenu (short DocID,LPSTR lpszMenuName,short Position,short MenuType); ---- d) 在菜单项中添加新的菜单命令---- short CAPIAddMenuItem (short DocID, LPSTR lpszMenu, LPSTR lpszName ,LPSTR lpszMenuText,short Position, short MenuType ); ---- e) 定义一个新的快捷键---- short CAPIAddkey (short DocID, short keyCode, LPSTR lpszName); ---- 如果要想定义组合键的快捷键方式,就需把几个键在WordBasic 中的代码数字的二进制进行按位‘或’运算,将结果传递给第二个参数KeyCode。例如:快捷键CTRL+S 的KeyCode 是(256 OR 83)=339 ---- 4. Word API 调用WordBasic 函数前函数参数和返回值的数据缓冲区的建立---- Word 中的所有字处理功能都能由对应的WordBasic 函数来实现。正是利用这一点,在WLL 中通过调用WordBasic 函数来实现对Word 的定制。因此,必须利用Word API 函数InitWCB 设立调用WordBasic 函数时传递参数与返回值的数据缓冲区。---- Void InitWCB (WCB far *lpwcb,short retType, LPSTR lpBuffer,short cBufferSize); ---- InitWCB 的参数说明如下: 参数描述
lpwcb 被初始化的WCB的far pointer,指向WCB数据区;
retType 指明被调用函数的返回类型(type);
lpBuffer 如果返回值是字符串,则它是指向WLL中我们定义的数据缓冲区的指针;
cBufferSize 如果返回值是字符串,则它是WLL中我们定义的数据缓冲区大小;
---- 举例说明:---- 下面的一段程序是获取所选区域的字符串字体情况:---- WCB wcb; // WORD 的参数和返回值传递的数据区---- short isbold; ---- InitWCB(&wcb,TypeShort,NULL,0); // 设立传递WordBasic 函数参数和返回值的数据区wcb ---- WORDFUNCTION(wdBold); // 调用WordBasic 函数Bold() ---- isbold=wcb.wdoprReturn.Short; // 从数据区wcb 中取出WordBasic 函数Bold() 的返回值---- 5. WordBasic 函数调用方法---- Word 中的命令是与WordBasic 函数一一对应的。因此,Word API 可以通过接口函数用C 语言直接调用WordBasic 函数来实现Word 命令。---- 应该注意的一点是:在Word API 中调用WordBasic 命令函数名时均须在WordBasic 函数名前加了2 个英文字母‘wd’, 如:WordBasic 函数Bold 在Word API 中调用的函数名应为wdBold。---- 根据这些函数有无返回值与是否为响应对话框的情况,在Word API 头文件basedef.h 中定义了三种调用方法,WORDCALL、WORDFUCTION 和WORDDIALOG。若被调用的WordBasic 函数无返回值时,用Word API 接口函数WORDCALL 来调用它,形式是:WORDCALL(函数名);若被调用的WordBasic 函数有返回值时,用Word API 接口函数WORDFUNCTION 来调用它,形式是:WORDFUNCTION(函数名);若被调用的WordBasic 函数是有关对话框操作时,用Word API 函数WORDDIALOG 来调用它,形式是:WORDDIALOG(函数名);
---- 例如:WordBasic 中,给所选区域字符标粗体的函数Bold 与判断所选区域字符是否为粗体的函数Bold() 的调用方法就不同: ---- 1. 函数Bold 是一个操作,无须返回值,所以调用形式是WORDCALL(wdBold); ---- 2. 函数Bold() 是一个判断,必须有返回值,所以调用形式是WORDFUNCTION(wdBold); ---- 6. WordBasic 函数参数的传递方法---- 在调用WordBasic 带参函数时,需要通过Word API 特定接口函数来传递参数。同时,对不同类型的函数,参数的传递方法也有不同。---- 1) 逐个传递参数---- 这种传递参数的方法适用于参数位置固定的函数,例如:WordBasic 函数---- MenuText$(Type,MenuNumber[,Context]) ---- 其中的三个参数是按次序排列的。由于Word API 调用WordBasic 函数方式是函数名作为WORDCALL、WORDFUCTION 和WORDDIALOG 的参数,无法一次添加WordBasic 函数参数,所以传递WordBasic 函数参数需要InitWCB 函数设置数据缓冲区后,依次通过数据缓冲区传递参数,第一个是赋给Type 的,第二个是赋给MenuNumber,如果有第三个参数则是赋给Context 的。---- 在向这类函数传递参数时,根据待串参数数据类型的不同,有以下4 个函数可以选用:传递short 型参数的函数,void AddShortParam(WCB far *lpwcb, short ShortVal); 传递long 型参数的函数,void AddLongParam(WCB far *lpwcb, long LongVal); 传递double 型参数的函数,void AddDoubleParam(WCB far *lpwcb, double DoubleVal); 传递字符串参数的函数,void AddStringParam(WCB far *lpwcb, LPSTR lpStr);
---- 下表是上面4 个函数参数的说明:参数描述
lpwcb 被初始化的WCB的far pointer,即WCB数据区
lpStr 待传参数为字符串时的字符串指针
ShortVal 待传参数为short型的整数
LongVal 待传参数为long型的整数
DoubleVal 待传参数为double型的浮点数---- 举例说明: ---- 下面的部分程序的作用是给所选区域字符串着绿色---- InitWCB(&wcb,TypeShort,NULL,0); ---- AddShortParam(&wcb,4); //4 是绿色在WORD 中的标识, 将一个short 参数放入参数缓冲区---- WORDCALL(wdCharColor); // 调用WordBasic 函数CharColor ---- 2) 传递指定参数---- 这种传递参数的方法适用于参数有标识名指明的函数。这种函数的参数有定义了的标识,传递时没有次序问题。例如:WordBasic 中插入空表的函数TableInsetTable:---- TableInserTable [.ConvertForm ] [,.NumberColumns] [,.NumRows][,.InitialColWidth][,.Wizard] [,.Format] [,.Apply] ---- 因此,向TableInserTable 函数传递参数时,只需指明哪一个标识即可。这种函数一般见于具有较多参数的函数。---- 在向这类函数传递参数时,与上面的类似,也是根据参数数据类型的不同,有以下4 个函数可以选用:void AddShortDlgField(WCB far *lpwcb,short ShortVal,short FieldId,short fMode); void AddLongDlgField(WCB far *lpwcb,long LongVal,short FieldId,short fMode); void AddDoubleDlgField(WCB far *lpwcb,double DoubleVal,short FieldId,short fMode); void AddStringDlgField(WCB far *lpwcb,LPSTR lpStr,short FieldId,short fMode,short cBufferSize);
---- 下表是上面4 个函数参数的说明:参数描述
lpwcb 被初始化的WCB的far pointer,即WCB数据区
ShortVal 传递的参数为short型整数
LongVal 传递的参数为long型整数
DoubleVal 传递的参数为double型浮点数
lpStr 被传递的参数为字符串时的字符串指针
FieldId 参数的标识名
fMode 用于指明传递参数的方式,根据输入或输出填入INPUT、OUTPUT
cBufferSize 传递字符串参数时被分配的缓冲区大小
---- 其中,传给FieldId 的所有的标识名都已在WORD API 文件wdfid.h 中被定义了。---- 下面的例子是要在光标所在位置插入一个4*12 的空表。InitWCB(&wcb, TypeShort , NULL, 0);
AddStringDlgField(&wcb, "4",fidNumColumns, fMode, 0);
AddStringDlgField(&wcb, "12",fidNumRows, fMode, 0);
WORDCALL(wdTableInsertTable);
---- 上面的fidNumColumns 和fidNumRows 是在WORD API 文件wdfid.h 中定义的参数的标识名。调用函数AddStringDlgField 将表的行数“4”和列数“12”直接传给WordBasic 的函数TableInsertTable 的两个参数NumColumns 和NumRows。---- 注意:在WORD API 文件wdfid.h 中被定义了的函数参数的标识名是与WordBasic 函数的参数标识名一一对应的,但不同的是,WORD API 的参数标识名是在WordBasic 的参数标识名前加了‘fid’构成的。如:WordBasic 的函数TableInsertTable 有两个参数是NumColumns 和NumRows,那么,在WORD API 中的参数标识名就应是fidNumColumns 和fidNumRows。三. 创建WLL 的程序框架
---- 下面我们给出一个用Word API 完成的完整WLL 框架,来实现如图1 所示Word 中的修改://系统头文件
//Word API的头文件
#include "wdcapi.h"
//Word API的头文件
#include "wdcmds.h"
//WordBasic函数名在Word API中的标识名文件
#include "wdfid.h"
// WordBasic用标识名指明的参数名在Word API中的标识名文件
#include "capilib.h"
//文件capilib.h的头文件
#include "basedefs.h"
// Word API的宏文件
#include "wdmenus.h"
//Word中的主菜单名,快捷菜单名在Word API中的标识名文件
//WLL中的头文件
#include "translate.h "
//汉英翻译程序中头文件char translateallitem[] = "汉英翻译(&T) Shift+Alt+T ";
//菜单中显示的命令串
char szFuncTranslateAll[] = "translateall";
// WLL中定义的全文汉英翻译函数
char translateparaitem[] = "段落汉英翻译(&P)";
//快捷菜单中显示的命令串
char szFuncTranslatePara[] = "translatepara";
// WLL中定义的段落汉英翻译函数
char translateitemStatus[] = "全文汉英翻译";
//鼠标选中该菜单命令时的状态显示INT APIENTRY DllMain(HANDLE hinstDLL,
DWORD fdwReason, LPVOID lpReserved)
{ hDLLInst = hinstDLL;
return 1;
}
void GetMenuName
( ushort iMenuCode, LPSTR szName, ushort cbSize )
{ short iCode, iType;
// Parameters for Word's wdMenuText$ function
WCB wcb;
// Word Call Block
iCode = iMenuCode % 100;
// The code is the lower two digits
iType = iMenuCode / 100;
// The type is the third digit (see WDMENUS.H)
InitWCB ( &wcb, TypeString, szName, cbSize );
// Init for string return type
AddShortParam ( &wcb, iType );
// Add the iType param
AddShortParam ( &wcb, iCode );
// Add the iCode param
WORDFUNCTION ( wdMenuText$ );
// Call Word's MenuText$ Function
}
short WINAPI _loadds wdAutoOpen (short DocID)
{//各项初始化工作......
//下面登记全文汉英翻译函数
CAPIRegister
( DocID, szFuncTranslateAll , translateitemStatus);
//在主菜单的‘工具’菜单项中添加一个
‘汉英翻译(&T) CTRL +T’子项
GetMenuName ( DOCOPEN_Tools,
szMenu, sizeof(szMenu)); //得到‘工具’菜单项标识
if ( (err = CAPIAddMenuItem( DocID,
szMenu,
szFuncTranslateAll, //函数名字符串指针
translateallitem,
//‘工具’菜单项中的显示名
5, //在‘工具’菜单项中的位置
0 //菜单类型
)) != 0)
return 0;
// 若添加菜单项函数返回为非零,即WLL加载失败,退出加载;
//定义‘工具’菜单项中的‘汉英翻译(&T)
Alt + Shift+T’的快捷键为< Alt + Shift+T >
if( (err = CAPIAddKey(DocID,
1026, //是< Shift+Alt+T >
,512、4、84三个数二进制按位或的结果
szFuncTranslateAll, //函数名字符串
)) != 0 )
return 0; // 若添加快捷键函数返回为非零,即WLL加载失败,退出加载;
//在快捷菜单中添加一个子项‘汉英翻译(段落)’
GetMenuName ( SHORTCUT_Text, szMenu, sizeof(szMenu));
//得到快捷菜单标识
if ( (err = CAPIAddMenuItem(DocID,
szMenu,
szFuncTranslatePara , //函数名字符串指针
translateparaitem, //快捷菜单中的显示名
3, //显示名在快捷菜单中的位置
2 //菜单类型
)) != 0 )
return 0; //若添加菜单项函数返回为非零,
即WLL加载失败,退出加载;
//在常规工具条上添加一个工具按钮指向上面的函数‘tanslateall’
if ( (err = CAPIAddButton( DocID,
"常用", //按钮所要添加到的工具条名称
cPositon //按钮在工具条上的位置
szFuncTranslatePara , //按钮连接的函数名字符串
“全文翻译” //鼠标在按钮区域是显示的提示字符
)) != 0 )
return 0; //若添加按钮函数返回为非零,
即WLL加载失败,退出加载;
//读入汉英翻译词库......
//读入汉英翻译规则库......
//通知用户WLL加载成功
MessageBox(NULL,"翻译模版加载成功!\n ","恭喜您:",MB_OK);
} // wdAutoOpen()结束
void WINAPI _loadds wdAutoRemove( void )
{
// Clean up the menus before exiting
// NOTE: This is not really necessary becasue the menu items were added
// using the DocID as the context. In this case Word removes the menu
// items automatically when the WLL is unloaded.
RemoveMenuItem ( gDocID, DOCOPEN_File, proofitem );
}
//全文翻译WLL函数
int WINAPI _loadds translateall(void)
{ WCB wcb; //定义Word API与WordBasic交换数据的数据区
char buffer[30*30]; //存放从Word中取到的一段字符串
//将光标所在位置置于当前文档的起始位置
(相当于Ctrl+Alt+Home三键同时按下)
InitWCB(&wcb,TypeShort,NULL,0);
WORDCALL(wdStartOfDocument);
while(1)
{ memset(buffer,0,30*30);
//指明按段截取文档
InitWCB(&wcb,TypeShort,NULL,0);
AddStringParam(&wcb,"\\Para");
WORDFUNCTION(wdEditGoTo);
//截取当前段的文档放入数据区buffer[30*30]中
InitWCB(&wcb,TypeString,buffer,sizeof(buffer));
WORDFUNCTION(wdSelection$);
//调用函数translatetherm来翻译buffer[]数据区的内容
translatethem(buffer);
//取下一段文档翻译
InitWCB(&wcb,TypeShort,NULL,0);
AddStringParam(&wcb,"\\EndOfSel");
WORDFUNCTION(wdEditGoTo);
InitWCB(&wcb,TypeShort,NULL,0);
WORDFUNCTION(wdAtEndOfDocument);
returnint=(int)(wcb.wdoprReturn.Short);
if(returnint= =-1) break; //函数返回值为-1时,表明整个文档已处理完毕
}
} //全文汉英翻译WLL函数结束
//段落汉英翻译WLL函数
int WINAPI _loadds translatepara(void)
{ //步骤与WLL函数translateall类似,只是取光标所在的段落来翻译
WCB wcb;
char buffer[30*30];
memset(buffer,0,30*30);
// the certain para
InitWCB(&wcb,TypeShort,NULL,0);
WORDFUNCTION(wdEditFindClearFormatting);
WORDFUNCTION(wdEditReplaceClearFormatting);
InitWCB(&wcb,TypeShort,NULL,0);
AddStringParam(&wcb,"\\Para");
WORDFUNCTION(wdEditGoTo);
//截取光标所在段落放入buffer[]中
InitWCB(&wcb,TypeString,buffer,sizeof(buffer));
WORDFUNCTION(wdSelection$);
//翻译buffer中的字符串
translatethem(buffer);
}//段落汉英翻译WLL函数结束
//定义的函数,翻译从WORD中取到的文档段
int translatethem(document)
{ //自己应用程序的函数...... }
void RemoveMenuItem ( int DocID, ushort iMenuID, LPSTR szItemText )
{ int i, iItemCount;
char szMenu[64];
char szName[64];
char szMenuItem[64];
WCB wcb;
MessageBox(NULL,"退出汉英翻译模板","广告", MB_OK);
//摘去WLL中对WORD所做的定制项
(主菜单项、快捷菜单项和工具条按钮等)
GetMenuName ( iMenuID, szMenu, (ushort)sizeof(szMenu));
InitWCB ( &wcb, TypeShort, NULL, 0); // Init struct
AddStringParam ( &wcb, szMenu ); // Add menu string
AddShortParam ( &wcb, (ushort)(iMenuID / 100) ); // Type ( 0, 1, or 2 )
WORDFUNCTION ( wdCountMenuItems);
iItemCount = wcb.wdoprReturn.Short;
for ( i = iItemCount; i > 0; i-- )
{
InitWCB ( &wcb, TypeString, szMenuItem, sizeof(szMenuItem) );
AddStringParam ( &wcb, szMenu ); // Menu name
AddShortParam ( &wcb, (ushort)(iMenuID / 100)); // Type
AddShortParam ( &wcb, (ushort)i ); // Position
WORDFUNCTION ( wdMenuItemText$);
if (!lstrcmpi(szMenuItem, szItemText)) // Found item to delete
{
InitWCB ( &wcb, TypeString, szName, sizeof(szName) );
AddStringParam ( &wcb, szMenu ); // Menu name
AddShortParam ( &wcb, (ushort)(iMenuID / 100) ); // Type
AddShortParam ( &wcb, (ushort)i ); // Position
WORDFUNCTION ( wdMenuItemMacro$ );
InitWCB( &wcb, TypeShort, NULL, 0 );
AddShortDlgField ( &wcb, (ushort)(iMenuID / 100), fidMenuType, INPUT);
AddShortDlgField ( &wcb, 1,fidRemove,INPUT );
AddShortDlgField ( &wcb, (ushort)DocID, fidContext, INPUT);
AddStringDlgField( &wcb, szName, fidName, INPUT, 0 );
AddStringDlgField( &wcb, szMenu, fidMenu, INPUT, 0 );
wdCommandDispatch( wdToolsCustomizeMenus, CommandAction,
wcb.cArgs, wcb.wdoprArgs, lpwdoprNil );
break; // Force the loop to stop }
}
}
四. 在Word 中加载与卸载我们的WLL
---- 经过编译、链接生成DLL 文件(动态连接库文件)后,必须将文件的扩展文件名.dll 改为.wll,以便在加载WLL 时能被Word 正确识别为Word 加载项。
---- I. 将我们的WLL 加载到WORD 中有以下几种方法:---- A. 模板方式加载:在Word 中主菜单‘文件’中找到‘模板’,进去后按下‘添加’按钮,选中我们的WLL 模板文件(文件扩展名为wll)后‘确定’,加载WLL 即可完成, 如下图所示。---- B. 打开文件方式加载:象打开一般的WORD 文档一样,打开我们的WLL 模板文件,即可完成加载。---- C. Word 自动完成加载:将我们的WLL 模板文件复制到...\winword\startup\ 目录下,象Word 中的常用模板一样,在启动Word 时,Word 会自动将WLL 模板文件加载到Word 中。---- II. 卸载WLL 的方法只有一种:在Word 中主菜单‘文件’中找到‘模板’,将‘共用模板及加载项’框中‘translate.wll’前的复选钮钩掉后‘确定’,卸载WLL 的工作即可完成。五. 总结:
---- 短短几千字,无须学习任何新的编程语言,就可以使你成为一个随心所意开发Word 应用程序的行家里手,足见Word API 的简洁,灵活和高效。这也正是Word API 的初衷所在。
Application1.visible:=true;