OLE 自动化
在Windows 中,应用程序不会处于分割独立的状态,用户通常想使它们互相联系。OLE 自动化是Windows 应用程序之间相互操纵的一项技术。OLE 自动化允许在一个应用程序内部操作另一个应用程序提供的对象?徊僮莸囊欢顺莆远韵蠡蜃远衿鳎僮葑远衿鞯囊欢顺莆远突Щ蜃远刂破鳌R桓鲎远衿魇怯梢桓鲇τ贸绦蛱峁┑谋涣硪桓鲇τ贸绦蚴褂玫姆瘛icrosoft Excel 就是很好的例子,因为它提供创建和操作工作表、单元格、行列等服务。自动化控制器是指使用自动化服务器提供服务的控制应用程序。自动化控制器通过OLE 接口工作,这个接口向控制应用程序开放可用的服务。因而,OLE 自动化的实质就是使得对象在应用程序间方便地共享。可以使用Delphi、C++等高级语言或脚本语言如VBScript和 &#106avascript来驱动自动化服务器,而不必考虑用于编写它的语言。从而实现应用程序间的互操作性。
自动化服务器有两种形式:进程中服务器和进程外服务器。进程中服务器是由一个存储在DLL中的类创建的,并由创建服务器的应用程序加载它。服务器在应用程序的进程空间中运行,所有的实例共享同一代码,不过每个实例拥有自己独立的数据区。一个进程外服务器在它自己的地址空间运行。这种服务器建立成一个EXE应用程序(如Microsoft Excel),这种服务器可以管理多个实例或在创建每个服务器对象时启动一个EXE的新拷贝。
越来越多的应用程序对外界提供自动化服务器,在Delphi中可方便地使用这些自动化服务器。用Delphi编制自动化控制器,按预定的想法访问自动化服务器应用程序所提供的对象,通过其属性和方法使用自动化服务器应用程序的功能,从而达到扩展自身功能的目的。
本文以打印表格为例,将要打印的表格发送给Excel电子表格,利用Excel对表格进行最后的输出处理?纠绦蚴褂肇elphi 4 专业版完成,在Windows 98环境中调试通过。例程中包含的常、变量说明如表1所示:
表1常、变量说明
常、变量名
类型
属性
设置
说明
MAXCOL
Integer
MAXCOL=52
允许打印的最大列数
ExcelApp
Variant
自动化服务器的实例
ColumnName
TStringList
存储Excel 表格每列的标准列号
TableCaption
TLable
Caption
Excel表格标题
Content
TstringGrid
Excel表格内容
PrintBtn
TButton
Caption
“打印”
Excel表格打印
Excel自动化服务器
要使用自动化服务器应用程序的服务,实际上是通过访问自动化服务器提供的应用程序对象的属性和方法实现的。因此,在操纵Excel自动化服务器之前,必须先明了Excel自动化服务器到底有哪些属性和方法。最方便的方法是查阅Excel自动化服务器手册。不过,这里介绍在Delphi中通过自动化服务器的类型库信息来获取Excel自动化服务器的信息。在Delphi中要访问Excel自动化服务器,事先要通过Import Type Library对话框(Project->Import Type Library)加入对Excel自动化服务器的引用。以Excel 97为例,加入“Microsoft Excel 8.0 Object Library”。该选项实际对应名为Excel.olb的文件。该文件用对象描述语言定义了Excel自动化对象的类型库信息,Delphi生成名为Excel_TLB的类型库信息所对应的Pascal文件。该文件体现了Excel所提供的对象模型。此对象模型对应了Excel应用程序对象的对象层次。它包含了由许多对象组成的一个分层结构,每个对象可提供一组特定的属性和方法。可以分析得到如下基本的对象层次结构:
Application对象是顶层对象,表示应用程序的当前实例。在Application对象中有Workbooks属性,其中包含每个打开的工作簿的Workbook对象。在Workbook对象中又含有Worksheets属性,其中包含了当前工作簿中每个工作表的Worksheet对象。Worksheet对象具有Range属性,表示访问工作表内容的基本对象:Range对象。Range对象可以包含一个单元,也可包含整个工作表?硎绶ange对象的方法有多种。如利用Worksheet对象的Range属性,用下列表达式:
Worksheet.Range[cell1,cell2]。
这里,cell1和cell2是确定工作表矩形区的两个单元地址,分别是选项左上角和右下角的地址,用标准Excel记号,即行号用数字,列号用字母,如A10或C3。要选择活动工作表右上角10*10,用下列表达式:
Worksheet.Range[‘A1’, ‘J10’]。
也可以用Cells方法将单个单元作为Range对象取得,其语法如下:
Worksheet.Cells(Row, Col)。
Row和Col 参数是单元坐标数字。亦可用Rows和Columns属性返回整行或整列的数字作为Range对象。下列两个表达式,返回第三行和第四列作为Range对象:
Worksheet.Row[3]或者Worksheet.Columns[4]。
Delphi中生成Excel电子表格
通过本文提供的例程,将展示如何在Delphi中编写自动化控制器来驱动Excel自动化服务器。
联系Excel自动化服务器
在Delphi 4中,OLE自动化支持由ComObj单元的TOleAuto类提供。因此,必须把ComObj单元加到Uses子句中。
要访问Excel自动化服务器应用程序的服务,首先要创建自动化服务器的实例。在自动化控制器中调用CreateOleObject函数,此函数在ComObj单元中声明?匦氚逊祷刂蹈掣桓鯲ariant类型的变量。该变量表示对Excel自动化服务器的引用,是Excel应用程序所提供的对象模型的大门。以后就是通过这个变量来访问Excel自动化服务器所提供的Excel对象。
CreateOleObject函数只有一个字符串类型参数,该参数用于指定某种类型的服务器识别号ProgID。每一种自动化服务器在Windows注册表中均有一个相异的字符串来识别,此标识就好象该服务器的别名一样。如果指定服务器识别号在Windows注册表中不存在,将触发一个异常。
下面的程序说明如何创建Excel自动化服务器的实例:
Var ExcelApp: Variant;
…
ExcelApp:= CreateOleObject(“Excel.application”);
此时在ExcelApp变量后加一个小圆点加属性名或方法名访问Excel自动化服务器的属性和方法。访问自动化服务器的属性一定要注意数据类型的匹配,因为在程序编译期间,编译器并不检查数据类型,只有到了运行期间,在访问自动化服务器的属性时,由服务器进行类型检查。
例程代码
将字符串栅格变量Content的内容发送到Excel的程序代码如下:
Procedure TForm1.PrintBtnClick(Sender: TObject);
Var i, j, IntChar : integer;
Begin
//生成Excel标准列号并存储在字符串列表变量 ColumnName中;
ColumnName :=TStringList.Create;
IntChar :=Ord('A');
for i :=0 to (MAXCOL div 2)-1 do
ColumnName.Add(Chr(IntChar+i));
IntChar :=ord('A');
for i :=0 to (MAXCOL div 2)-1 do
ColumnName.Add('A'+Chr(IntChar+i));
try
//获得Excel的Application对象;
ExcelApp :=CreateOleObject('Excel.application');
except
ShowMessage('Can not start Excel. ');
exit;
end;
//增加新的工作簿,并设置当前的工作簿;
ExcelApp.Workbooks.Add;
ExcelApp.Workbooks.Item[1].Activate;
//插入Excel表格的标题;
ExcelApp.Activesheet.Cells(1,1) := TableCaption.Caption;
//用Content 中的值填充Excel表格;
for i :=1 to Content.RowCount do
for j :=1 to Content.ColCount do
ExcelApp.Activesheet.Cells(3+i,j):=Content.Cells[j-1,i-1];
//使Excel表格的标题跨列居中;
ExcelApp.Activesheet.Range['A1',ColumnName.Strings[Content.ColCount -1]+'1'].Select;
ExcelApp.Selection.HorizontalAlignment:= xlCenter;
ExcelApp.Selection.VerticalAlignment:= xlBottom;
ExcelApp.Selection.WrapText:= False;
ExcelApp.Selection.Orientation:= 0;
ExcelApp.Selection.AddIndent:= False;
ExcelApp.Selection.ShrinkToFit:= False;
ExcelApp.Selection.MergeCells:= True;
//使Excel 应用程序可见;
ExcelApp.Visible:=true;
end;
小结 https://www.xin3721.com/
在例程中通过点击打印按钮,字符串栅格中的内容就会出现在新建的Excel表格中,可以方便地使用Excel进行打印或预览了。提高了基于Delphi语言的程序设计的编程效率。
通过OLE自动化,可以访问自动化服务器应用程序对象,并使用服务器应用程序的功能,从而实现了软件的复用性。
Delphi基础教程:Delphi中实现OLE自动化
作者:转载自:xin3721视频教程网更新时间:2010/10/17
- 视频教程在线观看
- Visual Basic从入门到精通视频教程
- 李天生SQL2008数据库视频教程
- 李天生二级VF考试视频教程
- 李天生Java软件开发高级视频教程
- 李天生Java软件开发高级教程
- C++从入门到精通视频教程
- 鹏哥C#语言从入门到高级视频教程
- 李天生JavaScript+JQuery视频教程
- VB教程:实例问题一则
- vb教程:实现多线程!
- vb教程:实现JPEG数据压缩
- VB教程:VB中调用VC++开发的DLL
- JAVA教程:UDP数据广播的局域网络会
- C语言教程:C 程序开发经典实例之6
- C语言教程:实现的闹钟程序
- 如何利用用C语言来解决鬼谷算题
- C语言教程:C 程序开发经典实例之一
- C语言教程:C 程序开发经典实例之2
- C语言教程:C 程序开发经典实例之3
- C语言教程:C 程序开发经典实例之5
- C语言教程:C语言程序设计技巧
- C语言教程:C 程序开发经典实例之7
- C语言教程:C 程序开发经典实例之8
- C语言教程:C 程序开发经典实例之9
- C语言教程:C 程序开发经典实例之1
- C语言教程:C 程序开发经典实例之4
- C语言教程:C语言入门
- 如何在VB.NET中取得计电脑的硬件信
- C语言教程:入门基础2
- C语言教程:入门基础
- C语言教程:写好C程序的10条秘籍
- 如何在VB.net中应用HOOK(二)
- VB.NET实例:删除文件时出错
- VB.NET实例:求一个因式分解的程序
- 关于MDI多文档编辑器的问题
- 如何产生不同的随机数?
- VB第三方控件实现XP资源管理器垂直
- VB第三方控件实现XP资源管理器垂直
- Delphi基础教程:开发分隔线组件
- Delphi基础教程:在程序中调用自己
- Delphi基础教程:面向组件的系统开
- Delphi基础教程:创建VCL 构件及开
- Delphi基础教程:编写ASP中的Activ
- Delphi基础教程:创建良好设计的代
- Delphi基础教程:从实作标题栏按钮
- Delphi基础教程:构件制作方法
- Delphi基础教程:开发自己的Delphi
- Delphi基础教程:改变VCL的行为--一
- Delphi基础教程:怎样获取未知DLL的
- Delphi基础教程:TQuery的结果到入
- Delphi基础教程:为什么要使用动态
- Delphi基础教程:在Delphi应用程序
- Delphi基础教程:Delphi中Memo组件
- Delphi基础教程:Delphi控制Excel2
- Delphi基础教程:Outlook的Automat
- Delphi基础教程:撰写及呼叫DLL程式
- Delphi基础教程:Delphi中实现OLE自
- Delphi基础教程:TQuery的结果到入
- Delphi基础教程:如何分析一个陌生
- Delphi基础教程:hook的dll源文件
- Delphi基础教程:DLL问题实例一则
- Delphi基础教程:利用Dll实现通用密
- Delphi基础教程:怎样在Delphi中调
- Delphi基础教程:修改Access数据库
- Delphi基础教程:用Delphi5编写调用
- Delphi基础教程:用Delphi编写DLL实
- Delphi基础教程:用Delphi制作DLL全
- Delphi基础教程:如何调试DLL型的向