标题：ole控件
OLE相关术语
1、OLE
OLE的本质就是构件或软件，所谓构件就是别人已开发好的项目（即应用程序或数据等），可用在新开发的应用程序中而不必重新开发，提高开发效率。
OLE的含义已超出了链接和嵌入这两项功能，在应用程序中不仅能交换数据，还可交换功能。
2、服务器应用程序和客户应用程序
把提供嵌入及链接对象的应用程序，称为服务器应用程序（Servers），在VB中也称为“对象应用程序”。
把接受嵌入及链接对象的应用程序，称为客户（Clients）应用程序，在VB中也称为“控制应用程序”。
3、对象（Object）
指为其它应用程序提供的具有独立特性的数据或代码单元。
例如：Microsoft Excel中的一个工作表、或图画文件、声音文件、视频文件、或一个完整的应用程序等都可作为一个OLE对象。
4、对象链接（Object Linking）
对象链接是指在应用程序中插入对象的占位符（指针），而不是数据本身。
在该对象上看到的只是一个“影像”，真正的数据储存在一个独立的文件中。因此，别的应用程序也可链接到该文件，当别的应用程序启动链接对象，并进行修改，则原来链接的应用程序所看到的内容也将跟着变动。“链接”对象的数据储存在提供链接的应用程序（对象应用程序）那边。
5、对象嵌入（Object Embedding）
对象嵌入是指将对象嵌入到Clients应用程序中，这样，嵌入对象将会增加Clients应用程序的大小。用户可以在Clients应用程序中直接编辑嵌入的对象（编辑时自动开启制造对象的应用程序让用户做编辑工作）。
☆ 对象链接和对象嵌入是两种不同的数据共享方式，两者的主要区别在于：
（1）数据存储的地方不同：
“链接”对象的数据存储在提供链接的应用程序那边；
“嵌入”对象的数据存储在接收嵌入对象的Clients应用程序中。
（2）其它应用程序可以访问数据的方式不同：
其它应用程序也可以访问“链接”对象，一个数据源可以链接到多个应用程序。
其它应用程序不能访问“嵌入”对象中的数据。
（3）影响Clients应用程序软件的大小不同。
对象
VB提供了一个OLE容器控件（在工具箱中），用于容纳“链接”对象或“嵌入”对象，也就是说，可以使用OLE容器控件来插入对象。
当然，也可用其它方法来插入对象。如：通过在工具箱中添加对象的类来插入对象，具体操作步骤为：
①→“工程”菜单/“部件”命令
②→“可插入对象”选项卡
③→想要加入工具箱的类，如：“Microsoft Excel工作表” →“确定”
在使用OLE容器控件插入对象时注意：
（1）创建链接时，链接对象数据被存储在OLE容器控件之外；
创建嵌入对象时，嵌入对象数据和VB应用程序一起被保存在OLE控件之内。
（2）在任何时候，一个OLE容器控件内只能有一个对象。
（3）既可在设计阶段来插入对象（创建链接对象或嵌入对象）；也可在程序运行阶段通过代码来创建链接对象或嵌入对象。
（4）通过OLE控件的Display Type属性可控制OLE对象在OLE容器控件中的显示方式：
Display Type ：0 → 以“数据映象”方式显示
Display Type ：1 → 以“图标”方式显示
一旦建立好一个OLE对象，此对应的OLE对象显示方式将无法改变。
（5）在OLE容器控件中放置对象之前提供该对象的应用程序必须已经在Windows中注册其对象。
1、设计时插入一个“链接”对象
步骤：（1）添加一个“OLE容器控件”到窗体上，屏幕会弹出一个“插入对象”对话框。或在设置好的“OLE容器控件”上右击鼠标，也会弹出“插入对象”对话框。
（2）选择“从文件创建”，再通过“浏览”按钮确定“要链接文件的路径、文件名”： ①C:\lyh\gz.xls\Excel工作表
②C:\win98\a.bmp\BMP图象
（3）单击“插入”按钮→返回“插入对象”对话框。
（4）选中“链接”复选框→“确定”。
按照以上步骤，就建立了一个链接对象。
此时，OLE控件本身则保存与对象链接有关的信息。如：提供链接对象的应用程序名、链接文件名、以及该链接对象的“数据影像”等，其对应的OLE控件属性分别是：对象类型（Class）、引用源文件（Source Doc）、链接数据（Source Item）。
[注意]：设计链接对象时，OLE会保留一份影像，起初这份影像和数据文件是相同的，但是因为文件有可能被修改，可链接对象保存的仍然是原始数据的影像，为了使其具备自动更新的能力，只要在Form_Load事件过程加入如下代码：
Private sub Form_Load( )
OLE1.Action=6 ‘此语句用“OLE1.Update”方法也可以
End sub 
2、设计时创建“嵌入对象”
创建嵌入对象时，既可从文件中嵌入数据，也可以创建一个新的空对象（可以被以后的数据填充）。
步骤：（1）添加一个“OLE容器控件”到窗体上，屏幕显示“插入对象”对话框。
（2）选择“从文件创建”，→“浏览”按钮→确定要嵌入的“文件名”。
（3）→“插入”按钮→返回“插入对象”对话框。
（4）→“确定”，即可创建嵌入对象。
另外，在此设计状态，也可修改OLE对象中的数据，方法为：
（1）→在OLE对象数据区单击鼠标右键，→弹出快捷菜单。
（2）选择“编辑”命令→出现Excel的编辑环境。
（3）修改完毕后，单击OLE对象数据区以外的区域，返回到创建嵌入对象的窗体。
[注意]：（1）不同于对象链接的是，嵌入对象中的数据被用户修改后不会被自动存储。当含有OLE控件的窗体被关闭时，与该控件相关的数据的任何变化将丢失。如果希望对数据所进行的修改在下次运行时能够显示出来，需要将更改的数据从对象保存至文件中（使用OLE控件的Save To File方法）。数据被保存在文件后，可以在需要的时候打开文件并恢复对象（使用OLE控件的Read From File方法）。
（2）将更改的数据从对象保存到文件中的方法（用一命令按钮的单击事件过程说明）：
Private sub CmdSave_click( )
Dim FileNum as integer
FileNum=FreeFile ‘取文件号
Open “TEST.OLE” For Binary as #FileNum ‘打开要保存的文件
OLE1.SaveToFile FileNum ‘保存至文件
Close #FileNum ‘关闭文件
End sub 
（3）将数据从文件读入OLE容器控件（使用OLE控件的ReadFromFile方法）
用一命令按钮的单击事件过程说明：
Private sub CmdOpen_click( )
Dim FileNum as integer
FileNum=FreeFile ‘取文件号
Open “TEST.OLE” For Binary as #FileNum ‘打开文件
OLE1.ReadFromFile FileNum ‘读文件
Close #FileNum ‘关闭二进制文件
End sub
3、使用“特殊粘贴”对话框创建链接对象或嵌入对象。
设计时创建对象的另一方法是使用“特殊粘贴”对话框，应用该方法可以只利用文件的一部分数据。（如只使用Excel数据表的一部分数据）
步骤：（1）运行一个包含链接或嵌入数据对象的应用程序（如Excel应用程序）。
（2）打开一个文件，选择要链接或嵌入的数据。
（3）→“编辑”菜单/“复制”命令→复制“数据”到剪贴板上。
（4）在VB的一个包含OLE控件的工程中，右击OLE控件→选择“特殊粘贴”命令→弹出“选择性粘贴”对话框。
（5）若想建立嵌入对象，选择“粘贴”选项； 若OLE控件中已有一个对象
若想建立链接对象，选择“粘贴链接”选项； 则会询问是否删除现有对象
（6）作出回答后，即在OLE控件上建立了一个新的对象。
4、利用OLE发出声音（实例）
步骤：（1）在窗体上添加OLE控件时，→弹出“插入对象”对话框，
在“对象类型”列表框中选“声音文件”；
选择⊙从文件创建；
→“浏览”按钮，选择文件：C:\windows\Canyon.mid ；
选择 链接， 显示为图标。
（2）单击“确定”按钮。
运行程序，双击OLE对象，将播放一段音乐。
三、在运行阶段创建链接或嵌入对象
要在程序代码运行时创建链接或嵌入对象，需要了解OLE容器控件的属性、事件和方法。
1、OLE容器控件的属性、方法、事件：
l Action属性：指定作用在OLE控件上的动作（如建立、删除、启动等）。
语法为：object.Action=value
value的设置值如下表：
value值
描述
方法
0
创建嵌入对象
Create Embed
1
创建链接对象
Create Link
4
将对象复制到系统剪贴板
Copy
5
将对象从系统剪贴板复制到OLE容器控件
Paste
6
从提供对象的应用程序检索当前数据，并在
OLE容器控件中将该数据作为图片显示。
Update
7
打开一个对象，用于进行诸如编辑那样的操作
DoVerb
9
关闭对象，并与提供该对象的应用程序终止连接
Close
10
将指定的对象删除，释放与之关联的内存
Delete
11
将对象保存到数据文件中
SaveToFile
12
加载保存到数据文件中的对象
ReadFromFile
14
显示“特殊粘贴”对话框
PasteSpecialDlg
17
更新对象支持的谓词列表
FetchVerbs
18
将对象以OLE version 1.0版本的文件格式保存
SaveToOle1File
l Class属性（类属性）
格式为：object.class
类名包含几个部分：application.objecttype.version
类名：说明对象类型。
Application ：提供对象的应用程序名
Objecttype ：在对象库中定义的对象名
Version ：提供对象的应用程序的版本号
例如：Excel.Sheet.8
l OLEType Allowed属性
返回或设置OLE容器控件所能包含的对象类型。
语法为：object.OLETypeAllowed [=value]
value值的设置如下表：
常数
值
描述
VbOLELinked
0
链接的，OLE容器只能包含链接对象
VbOLEEmbeded
1
嵌入的，OLE容器只能包含内嵌对象
VbOLEEither
2
二者均可（缺省值）
l SourceDoc属性
指定链接或嵌入对象时使用的源文件名。
语法为：object.sourceDoc [=name]
name ：指定文件名的字符串表达式。
l SourceItem属性（只对链接有效）
在创建链接对象时，设置或返回要链接的文件内的数据。
语法为：object.sourceItem [=string]
string ：一个指定被链接数据的字符串表达式。
例如：A1 ：E1 或 A3C4 ：A9D10
[注意]：当使用Action属性创建链接对象时，用SourceDoc 属性指定要链接的文件，使用sourceItem属性指定在要链接文件内的数据。
l Create Embed方法
该方法用来创建一个嵌入对象。
语法为：object.CreateEmbed sourcedoc[,class]
sourcedoc ：必选项，对象从该文件中创建。
SourceItem ：可选项，文件内的被链接的数据。
l DoVerb方法
打开一个对象（例如编辑一个对象）。
Object.DoVerb[verb]
Verb ：可选项，在OLE容器控件内要执行的对象的谓词。
l InsertObjDlg方法
显示插入对象对话框。
语法为：object.InsertObjDlg
[说明]（1）用户在运行这个方法时，将显示“插入对象”对话框，通过选取对象的类型，来创建链接的或内容嵌的对象，并由应用程序提供该对象。
（2）创建新对象时，与类名（如Excel.EXE）关联的应用程序，必须已在操作系统中正确地作了注册。
l PasteSpecialDlg方法
显示“特殊粘贴”对话框。
语法为：object.PasteSpecialDlg
l Updated事件
当一个已创建对象的数据发生改变（修改）时，会引发Updated事件。
l ObjectMove事件
当移动和OLE控件有关的对象以及调整其大小时，会触发ObjectMove事件。
l UpdateOptions属性
在运行时设置当链接数据修改后是否更新链接对象。
语法为：Object.UpdateOptions [=number]
其中Number的设置值为：
0 —— 自动的（缺省值），每次改变链接数据时均更新对象
1 —— 冻结的
2 —— 手动的，只有使用Update方法才更新对象
2、运行阶段建立链接对象
举例：（1）在窗体上添加2个OLE容器控件时，2个命令按钮。
（2）设计代码：
☆ 要求功能：①OLE1和OLE2链接同一个数据源。
②当改变（修改）OLE1容器控件中的链接数据时，OLE控件中链接同一个数据源的数据也要求跟着变化。
Private sub command1_click( )
OLE1.class=”Excel worksheet” 用”Excel.sheet.&”也可以
OLE1.sourceDoc=”C:\My Documents\aa.xls”
OLE1.DrsplayType=0
OLE1.Action=1
OLE2.class=”Excelworksheet”
OLE2.sourceDoc=”C:\My Documents\aa.xls”
OLE2.DisplayType=0
OLE2.Action=1
End sub
Private sub command2_click( )
UnLoad Me 
End sub
Private sub OLE1_Updated(code as integer)
OLE2.UpdateOptions=0 ‘用OLE2.Action=6也可以，或OLE2.Update方法也可以 
End sub
Private sub OLE2_Updated(code as integer)
OLE1.UpdateOptions=0
End sub
3、运行阶段建立嵌入对象
运行时建立嵌入对象的方法与建立链接对象的方法相似，只不过此时在有关代码中用：
OLE1.Action=0 或使用 CreateEmbed方法。
[注意]：对嵌入对象的任何修改要保存的话，一定要使用前述的SaveToFile方法，将修改的数据保存至某个文件中，在需要的时候可打开文件并恢复修改的内容。
补充2：
应用OLE拖放（在你的VB应用程序中支持OLE拖动功能）
一、OLE拖放的含义
指将数据从一个控件或应用程序移动到另一个控件或应用程序。
例如：可先选定并拖动Excel中的一列单元，然后将它们放到VB应用程序的DataGrid控件上。
二、VB控件的OLE拖放功能
VB的几乎所有控件都在某种程度上支持OLE拖放（专业版和企业版）。
1、 自动支持OLE拖放的控件（既可从控件拖出，也可在控件放入）。
DataGrid ， PictureBox ，RichTextBox ，Image ，TextBox ，MaskedEditBox
[注意]：要启动这些控件的自动OLE拖放功能，应将其OLE Drag Mode属性和OLEDropMode属性设置为“自动化”——“Automatic“
2、仅自动支持OLE拖动操作的控件（仅从控件拖出）。
ComboBox ，DataListBox ，FileListBox ，DataComboBox ，DirlistBox ，ListBox ， TreeView ，ListView等。
[注意]：要启动这些控件的自动拖动功能，应将其OLEDragMode设置“自动化”。
3、仅支持OLE拖放事件的控件
——即可代码对它们编程，使之成为OLE拖放操作的源，也可使生成为OLE拖放操作的目标。
CheckBox , Frame , OptionButton , CommandButton , Label , DrivelistBox , Data等。
[注意]：（1）为判断其它ActionX控件是否支持OLE拖放，应在VB在加载控件，并检查OLEDragMode和OLEDropMode属性是否存在或检查OLEDrag方法是否存在。
（2）缺省规定：在将文本从文本框控件拖动到word文档时，文本被移动；若拖动文本的同时按下[Ctrl]键，则文本被复制。