Delphi基础教程:Delphi中实现OLE自动化
作者:转载自:xin3721视频教程网更新时间:2010/10/17

  
 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自动化,可以访问自动化服务器应用程序对象,并使用服务器应用程序的功能,从而实现了软件的复用性。 

关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们     黑ICP备07002182号