第10章 网络及其他.docx
《第10章 网络及其他.docx》由会员分享,可在线阅读,更多相关《第10章 网络及其他.docx(22页珍藏版)》请在冰豆网上搜索。
第10章网络及其他
第10章网络及其他
第1节连接Internet
在Internet应用程序的开发中,VisualBasic引入了许多新的功能,例如,WebClass和DHTML(DynamicHyperTextMarkupLanguage)页面设计器等。
利用这些技术,可以轻松地创建各种动态的、高性能的Internet或Intranet应用程序。
10.1.1创建Internet浏览器
使用VisualBasic的WebBrowser控件,可以很容易制作一个Internet浏览器,用于浏览WWW(WorldWideWeb)站点、本地文件和ActiveX文件。
WebBrowser
是一个定制控件,其在ActiveX部件中的描述为“MicrosoftInternetControl”。
1.WebBrowser控件的属性
WebBrowser控件的主要属性,如表10.1所示。
表10.1WebBrowser控件的主要属性
属性
描述
LocationName
返回Web页面上的标题。
如果Web显示本地文件,则返回文件的完整路径
LocationURL
返回Web页面上的URL地址。
如果Web显示本地文件,则返回文件的完整路径
Document
如果存在活动的自动化文档,则返回这个自动文档
Type
返回文档对象的类型
Busy
如果正在进行某个地址访问时,则Busy值为真
例如,可用下面的代码判断Web浏览器是否正在工作:
PrivateSubTimer1_Timer()
IfWebBrowser1.BusyThen
Me.Caption="正在进行..."
Else
Timer1.Enabled=False
Me.Caption=WebBrowser1.LocationName
EndIf
EndSub
若Busy属性值为True,则在窗体的标题栏上显示“正在进行…”的提示,否则关闭定时器,窗体标题栏显示地址。
2.WebBrowser控件的方法、事件
WebBrowser控件为创建Web浏览器有关页面切换、过程控制等提供了多种方法,其中常用的有:
GoBack,GoForward,GoHome,GoSearch,Refresh,Stop,Navigate等。
GoBack方法和GoForward方法,分别在已浏览过的多个页面中切换到当前页的前一页、后一页,相当于IE浏览器中
、
功能。
例如切换到前一页的代码可写为:
WebBrowser1.GoBack
同样,Stop方法、Refresh方法、GoHome方法及GoSearch方法,分别相当于IE浏览器工具栏中
、
、
、
按钮的功能。
Navigate方法用于切换到URL(UniformResourceLocator)地址或HTML文件,其格式为:
对象.NavigateURL,[Flags],[TargetFrameName],[PostData],[Hearders]
其中,URL指定控件切换的URL,Flags指定页面的处理方法,TargetFrameName指定显示文档的帧名,PostData,Header分别是发送到服务器的字符串和HTTP(HyperTextTransferProtocol)头的补充信息。
Web浏览器控件与其他控件不同的是提供了许多与网络操作有关的事件:
∙BeforeNavigate:
从一个URL转换到另一个URL之前发生。
∙NavigateComplete:
转移到一个新位置后发生。
∙DownLoadBegin:
下载开始之前发生。
∙DownLoadComplete:
下载完成时发生。
∙ProgressChange:
进程改变时发生。
∙StatusTextChange:
InternetExplorer状态改变时发生。
∙TitleChange:
文档标题发生改变时发生。
∙NewWindow:
当超链接产生新窗口时发生。
【例10.1】利用WebBrowser控件创建一个Web浏览器,如图10.1所示。
图10.1浏览器窗体的设计
首先在窗体上添加一个ImageList控件、两个Toolbar控件,并在Toolbar2上放置一个ComboBox控件。
添加一个WebBrowser控件,添加一个菜单条,且文件菜单中应含有“打开”选项。
添加一个CommonDialog控件,设计其Filter属性为“HTML文件(*.htm)|*.htm|文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*”。
编写Toolbar1控件的ButtonClick事件代码:
PrivateSubToolbar1_ButtonClick(ByValButtonAsMSComctlLib.Button)
OnErrorResumeNext
SelectCaseButton.Key
Case"back"'后退按钮
WebBrowser1.GoBack
Case"forward"'前进按钮
WebBrowser1.GoForward
Case"refresh"'刷新按钮
WebBrowser1.Refresh
Case"home"'主页按钮
WebBrowser1.GoHome
Case"search"'搜索按钮
WebBrowser1.GoSearch
Case"stop"'停止按钮
WebBrowser1.Stop
Me.Caption=WebBrowser1.LocationName
EndSelect
EndSub
Toolbar2工具栏中的“转到”按钮的Click事件代码,与ComboBox控件的KeyPress事件代码相似。
其中Combo1_KeyPress事件代码为:
PrivateSubCombo1_KeyPress(KeyAsciiAsInteger)
IfKeyAscii=13Then
WebBrowser1.NavigateCombo1.Text
Combo1.AddItemCombo1.Text
EndIf
EndSub
编写WebBrowser1的事件代码为:
PrivateSubWebBrowser1_NavigateComplete(ByValURLAsString)
DimiAsInteger,BFoundAsBoolean
Fori=1ToCombo1.ListCount-1
IfCombo1.List(i)=WebBrowser1.LocationURLThen
BFound=True
ExitFor
EndIf
Next
IfBFoundThenCombo1.RemoveItemi
Combo1.AddItemWebBrowser1.LocationURL,0
Combo1.ListIndex=0
EndSub
PrivateSubWebBrowser1_DownloadComplete()
OnErrorResumeNext
Me.Caption=WebBrowser1.LocationName
EndSub
与文本编辑器类似,应在Form窗体的Load,Resize事件过程中设计WebBrowser1的位置属性,以让其在任何时候都能充满窗体。
通过添加MDI窗体,还可以在浏览器中同时打开多个页面。
10.1.2使用VisualBasic收发电子邮件
发送和接收电子邮件,对于某些执行特殊任务的应用程序而言,是十分有用的功能。
例如,一个监视网络服务器资源使用情况的工具软件,若具有自动发送电子邮件的功能,那么当发现服务器资源使用已经接近事先设定的临界状态时,便可以向系统管理员发送一封告警邮件,从而使系统管理员能够及时地采取措施。
在VisualBasic中,应用程序可以通过调用微软公司的MAPI(MessagingApplicationProgrammingInterface),实现收发电子邮件的功能。
编制具有收发电子邮件功能的VB程序,需要使用两个实现电子邮件收发功能的核心控件:
MAPI会话控件和MAPI消息控件。
MAPI会话控件用于建立和控制一个Microsoft会话,MAPI消息控件用于创建和和收发邮件消息。
此外,程序必须运行在采用遵从MAPI的消息系统(如MicrosoftExchange,MicrosoftMail,Outlook等)环境中。
在ActiveX部件中选择“MicrosoftMAPIControl6.0”,单击“确定”按钮后,就把MAPISession
、MAPIMessages
控件添加到工具箱中了。
除属性窗口外,也可以在属性页或程序设计中设置两个控件的属性值,而且控件还提供了许多方法用于程序设计。
1.MAPI系统的建立和关闭
为了处理电子邮件,应先将MAPI系统打开,处理结束后再关闭系统。
MAPI系统的建立和关闭方法如下:
MAPISession1.SignOn'处理开始
MAPISession1.SignOff'处理结束
2.设置消息ID
打开MAPI系统并正常工作后,应使用MAPISession的SessionID属性,设置识别消息的标识码(ID:
Identifier)。
将该属性值与某一MAPIMessages控件的SessionID属性连接后,就能够通过MAPIMessages控件来处理消息,比如:
MAPISession1.SessionID=MAPIMessages1.SessionID
3.邮件组
使用Fetch方法可以读取收件箱的邮件,并将邮件收集在一起形成邮件组。
对邮件组可以用FetchMsgType按消息类别分类,或用FetchSorted进行排序。
另外,使用Fetch属性还可为未阅读的电子邮件设定标识。
例如,下面代码可做成已收到的邮件组:
MAPIMessages1.FetchUnreadOnly=False
MAPIMessages1.Fetch
4.邮件的指定
利用MAPIMessages控件的MsgCount属性可以显示邮件组中已收到的电子邮件的总数,MsgIndex则用于指定当前邮件的序号,有效序号从0开始。
使用邮件序号可以获取下列信息:
MAPIMessages1.MsgIndex=0'指定0号电子邮件
MAPIMessages1.MsgNoteText'电子邮件全文
MAPIMessages1.MsgSubject'电子邮件主题
MAPIMessages1.MsgOrigDisplayName'发信人姓名
MAPIMessages1.MsgDateReceived'发信日期
5.显示通讯簿
若要显示通讯簿,则可使用Show方法:
MAPIMessages1.Show
另外,使用Show方法还可以显示收件人详细信息,其代码为:
MAPIMessages1.ShowTrue
6.发送电子邮件
MAPIMessages控件管理收信缓冲区和发信缓冲区。
显示收信信息使用收信缓冲区,在收信缓冲区内存放收件箱内带序号的电子邮件。
创建电子邮件时则使用发信缓冲区,只要将MsgIndex属性设为-1,就可以生成发信缓冲区并处于激活状态,即可以进行电子邮件的发送操作。
例如,建立一个发送电子邮件界面,如图10.2所示。
图10.2发送电子邮件
其中,“发送”按钮的Click事件代码,可编写为:
WithMAPIMessages1
.MsgIndex=-1
.RecipDisplayName=Text1.Text
.MsgSubject=Text2.Text
.MsgNoteText=Text3.Text
.SessionID=MAPISession1.SessionID
.Send
EndWith
MsgBox"邮件发送完毕!
",,"发送邮件"
输入收件人的电子邮件地址后,单击“发送”按钮,即可将邮件发送出去,或放入到发信缓冲区(如Outlook的发件箱)中等待发送。
【例10.2】使用MAPI控件制作一个用于接收电子邮件的程序。
在窗体上添加4个标签分别用于显示邮件的日期、发件人、主题、接收邮件的总数及当前正在处理第几封邮件,1个文本框Text1用于显示邮件的内容,3个命令按钮用于浏览或关闭邮件。
添加MAPI控件MAPISession1,MAPIMessages1,并添加几个用于注释说明的标签,如图10.3所示。
图10.3接收电子邮件
首先需要使用MAPIMessages1控件的Fetch方法读取邮件,这个过程将把用户收件箱中所有未读的邮件全部装入MAPI控件中。
然后,检查MsgCount属性以确定通过Fetch方法读取的邮件的总数,并通过设置MsgIndex属性指定具体需要处理哪一封邮件。
程序代码及注释如下:
PublicSubDisplayMessage()'显示邮件的通用过程
Label4.Caption="总共"&_
LTrim(Str(MAPIMessages1.MsgCount))&"封邮件,这是第"&_
LTrim(Str(MAPIMessages1.MsgIndex+1))&"封邮件"
Label1.Caption=MAPIMessages1.MsgDateReceived
Label2.Caption=MAPIMessages1.MsgOrigDisplayName
Label3.Caption=MAPIMessages1.MsgSubject
Text1.Text=MAPIMessages1.MsgNoteText
EndSub
PrivateSubCommand1_Click()'上一封
IfMAPIMessages1.MsgIndex>0Then
MAPIMessages1.MsgIndex=MAPIMessages1.MsgIndex-1
DisplayMessage
Else
Beep
EndIf
EndSub
PrivateSubCommand2_Click()'下一封
IfMAPIMessages1.MsgIndexMAPIMessages1.MsgIndex=MAPIMessages1.MsgIndex+1
DisplayMessage
Else
Beep
EndIf
EndSub
PrivateSubCommand3_Click()'关闭
MAPISession1.SignOff
UnloadMe
EndSub
PrivateSubForm_Load()
MAPISession1.SignOn
MAPIMessages1.SessionID=MAPISession1.SessionID
MAPIMessages1.FetchUnreadOnly=True
MAPIMessages1.Fetch
DisplayMessage
EndSub
在窗体加载过程中,窗体Load事件中的代码会读取新邮件,如果有新邮件,就显示第1个新邮件,如果有多个新邮件,则可以使用“上一封”和“下一封”命令按钮前后翻阅。
如果要读取收件箱中所有的邮件,只需在执行Fetch方法之前将FetchUnreadOnly属性设置为“False”,还可以使用MsgRead属性判别具体邮件是否读过。
10.1.3电话拨号
为了能够制作通信应用程序,VB提供了一个Communication控件,用于建立与串行口的连接,并通过串行口连接其他通信设备(如Modem)。
利用Communication控件,用户可以拨打电话号码、监视串行口的输入数据、创建完备的终端应用程序。
在ActiveX部件中选择“MicrosoftCommControl6.0”,便可以将Communication控件放入工具箱内,其名称为MSComm
。
通过属性窗口、属性页及程序代码均可设置MSComm控件的属性,该控件只提供了一个在发生通信事件和错误时触发的事件OnComm。
1.串行口的连接
要建立通信程序,首先应建立MSComm控件和串行口的连接。
用于通信连接MSComm控件的属性有:
∙Commport:
设置或返回通信的端口号。
默认值为1,可以设定1到16之间的任一数值,例如在使用调制解调器一般设为2。
∙Setting:
以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
例如,使用Modem时可设为“115200,n,8,1”。
∙PortOpen:
设置或返回通信端口的状态(打开或关闭)。
∙InputLen:
设置如何读出接收缓冲区的内容。
当设定为0时,使用Input属性可读出全部内容。
通过设置Handshaking属性,还可以指定在应用程序中使用的握手协议。
握手协议是一种内部的通信协议,通过该协议将数据从硬件端口传输到接收缓冲区。
2.使用调制解调器
端口设定好以后,还要确定Modem是否正常工作。
如果正常,则可进行数据的发送和接收操作了。
一般使用Output属性向调制解调器发出命令,而使用Input属性接收来自调制解调器的信号,例如:
MSComm1.Output="atdt"+Text1.Text+";"+Chr(13)
Text1.Text=MSComm1.Input
命令由“AT”开始字符串组成,其中“at”进行初始化连接,“d”进行拨号,“t”指定使用音频。
调制解调器收到命令后,给终端返回一个结果:
OK,NOCARRIER,BUSY等。
如果调制解调器返回“OK”,则表示正常工作。
调制解调器处理有时占用很多时间,在此期间键盘和鼠标输入的命令都是无效的。
为了防止发生这种情况,可以使用特定的程序解除占有,如DoEvents()函数,该函数的功能是:
一旦中止执行中的处理,则处理返回操作系统。
3.发送、接收缓冲区
端口打开后,就创建了接收和发送缓冲区。
MSComm控件中用于管理缓冲区的属性有:
∙InBufferSize,OutBufferSize:
指定接收、发送缓冲区的内存容量。
∙Rthreshold,SThreshold:
用于表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
∙Input:
用来保存和接收从接收缓冲区获取的数据。
∙InBufferCount:
用于获得接收缓冲区中字节的数目。
接收缓冲区每接收到一个字节,该属性值加1。
如果将该属性值设置为0,便将接收缓冲区清空。
∙Output:
用于向发送缓冲区发出命令或数据。
∙OutBufferCount:
用于监视发送缓冲区中字节的数目。
如果将该属性值设置为0,即可清空发送缓冲区。
例如,为建立一个电话拨号程序,可在窗体上放置一个Mscomm1用于设置通信系统,1个文本框Text1用于输入电话号码,2个命令按钮用于发送控制和取消发送,以及1个说明性的标签,如图10.4所示。
图10.4电话拨号
适当设置MSComm1的属性后,编写拨号按钮的Click事件代码如下:
PrivateSubCommand1_Click()
DimDialstrAsString,RecstrAsString
DimDmyAsInteger
IfText1.Text=""ThenExitSub
Cancels=False'用来判断是否单击取消按钮的公共变量
Command1.Enabled=False
Dialstr="atdt"+Text1.Text+";"+Chr(13)
OnErrorResumeNext
MSComm1.PortOpen=True
IfErr.Number<>0Then
MsgBox"Com2端口不能使用"
ExitSub
EndIf
MSComm1.InBufferCount=0
MSComm1.Output=Dialstr
Recstr=""
Do
Dmy=DoEvents()
IfMSComm1.InBufferCountThen
Recstr=Recstr+MSComm1.Input
IfInStr(Recstr,"OK")Then
MsgBox"呼叫成功,请继续后续操作"
ExitDo
EndIf
EndIf
IfCancelsThenExitSub'单击“取消”按钮
Loop
MSComm1.Output="ath"+Chr(13)'切断线路
MSComm1.PortOpen=False
Command1.Enabled=True
EndSub
在应用程序中,还可以利用OnComm事件和CommEvent属性捕获并检查通信事件和错误的值。
比如在接收和发送数据的过程中,常需捕获这些事件和错误,并以此做出响应。
第2节OLE及其应用
OLE(ObjectLinkingandEmbedding)技术可以使得VisualBasic应用程序能够很方便地使用Windows环境中的其他应用程序的功能。
它可以让我们在自己的程序中显示别的应用程序的数据,或从应用程序中的数据来启动与其相关的应用程序,以便进一步处理数据(如编辑文本、修饰图案等)。
链接一个对象,实际上是在应用程序中插入链接对象的占位符,而并非数据本身,当数据源改变时,链接程序中看到的数据内容也将发生改变。
嵌入一个对象,是与对象相关的全部数据都将被复制或纳入到嵌入的应用程序中,其他程序不能访问嵌入对象中的数据。
10.2.1OLE控件
利用工具箱中的OLE控件
可以在窗体上创建一个OLE对象,它可以显示各种不同的数据类型,如Word文档、电子表格、图表等。
1.设计时插入OLE对象
将OLE控件放置在窗体上,就会出现“插入对象”对话框,如图10.5所示。
图10.5“插入对象”对话框图10.6插入Excel工作表对象
选择“新建”单选按钮,并在“对象类型”列表框中选择一种对象类型,例如“MicrosoftExcel工作表”,单击“确定”按钮后,就会在窗体上显示出Excel工作表,如图10.6所示。
在运行程序时双击OLE控件,则会显示Excel工作表及菜单。
选择“从文件创建”单选按钮,出现的对话框如图10.7所示。
单击“浏览”按钮,可以从弹出的对话框中选择要装入OLE对象的文件。
如果选中“链接”复选框,表示这个OLE对象为链接对象,否则为嵌入对象。
(a)“插入对象”对话框(b)嵌入Word文档后的窗体
图10.7从文件创建
用鼠标右键单击窗体上OLE控件,从弹出的快捷菜单中选择“插入对象…”命令,打开对话框,可重新设置装入的对象。
如果选择“特殊粘贴…”命令,在打开的“选择性粘贴”对话框中,可以将剪切板上内容嵌入或链接到OLE控件。
OLE控件的常用属性有:
∙DisplayType:
用于指示对象是显示