荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: Xie (。。。。。。), 信区: Program
标 题: [转寄] VB邮件(5.30)
发信站: BBS 荔园晨风站 (Thu Jun 3 09:55:45 1999), 转信
发信人: msnet (), 信区: VBVC
标 题: VB邮件(5.30)
发信站: 网易虚拟社区 (Sun May 30 09:01:05 1999), 站内信件
编者的话
====================================================================
各位网友:
VB邮件自开办以来已经发了36期了,您对该邮件
有什么建议和要求,请来信,来信请寄msnet@188.net
主题为:我有建议
如果您有好的作品或您发现了好的作品,不要忘
了让大家共享。
版主期待您的参与!!!
版主 冯德平
=============================================
VB邮件(5.30)
a VB编程中窗体的控制技巧
在Visual Basic中,每个应用程序都是从窗体(Form)开始的,窗体是构成用
户接口的所有控件的容器。录活运用窗体的各项属性和操作,可以为用户设计出
赏心悦目的操作界面。
1.窗体以当前屏幕分辨率全屏显示
在应用程序的编制调试过程中,用于经常用到菜单、工具条和工具框等辅助
工具,一般不将窗体设为全屏显示,以便于操作;另外,当屏幕分辨率改变时,
窗体可能不能正常显示,可以在窗体的Load事件中插入下列代码,即可使窗体启
动时以当前屏幕分辨率全屏显示:
Private Sub Form_Load()
Form1.top=0 ‘设置窗体上边界位置
Form1.left=0 ‘设置窗体左边界位置
Form1.Width=Screen.Width ‘设置窗体宽度为屏幕宽度
Form1.Height=Screen.Height ‘设置窗体高度为屏幕高度
End Sub
2.使窗体保持在最上层
有时应用程序需要一个信息或查询窗体总保持在最上层,即使用读书切换到
其他窗体也能看到该窗体,如Microsoft Word中的Find窗体,这是通过调用Wind
ows API函数SetWindowPos()实现的,示例如下:
Option Explicit
Private Declare Function SetWindowPos Lib“User32”(ByValhwnd As Long,
ByVal h WndInsertAfter As Long,ByVal x As Long,ByVAl y As Long,ByVal c
x As Long,ByVal cy As Long,ByVal wFlags As Long)As Long
Const HWND_TOPMOST=-1
Const SWP_SHOWWINDOW=&H40
Private Sub Form_load()
Dim retValue As Long
RetValue=setWindowPos(me.hwnd,HWND_TOPMOST,Me.CurrentX,Me.CurrentY,300
,300,SWP_SHOWWINDOW)
End Sub
3.窗体装入速度慢的处理技巧
在缺省情况下,Visual Basic装入和显示项目的第一个窗体。如果窗体装入
过程超过一秒,用户只好耐心等待,特别是在窗体中含有大型位图或许多控件时
。其实,微软在OFFICE组件中已经很好地处理了这一问题。下面的程序演示了处
理低速窗体的装入技巧,在应用程序启动时,首先启动一个简单的快速装入窗体
,可以将公司标志或其他信息显示在上面,然后在快速窗体后台中装入慢速窗体
,慢速窗体装入后将快速窗体卸出,从而解决了让用户厌烦的等待问题。
Private Sub Form_Load()
Form1.Show
Form1.Refresh
Load Form2 ‘装入慢速窗体
Form2.Show ‘显示慢速窗体
End Sub
如果省略Form1.Show方法,则需装入慢速窗体后才能显示信息窗体。Refres
h方法让Visual Basic更新显示后再执行后面的命令,缺省情况下,Visual Basi
c只在不执行其他代码时,才有机会刷新显示。慢速窗体Form2装入后,用下列代
码将快速窗体Fomr1卸出:
Private Sub Form_Load()
UnLoad Form1 ‘卸出快速窗体
End Sub
一旦装入窗体,它就占用了所要的资源,所以不再需要的窗体应及时卸出,
将占用的资源交还系统。另外,由于窗体装入比较慢,特别是包含位图或其他资
源的大文件装入更慢,所以应用程序运行期间应尽量避免频繁装入/卸出窗体,而
最好在应用程序启动时把窗体装入内存,需要时再显示。
haosus 推荐
b VB程序中处理随机事件
济南 于琬玲
在程序设计过程中,如何轻松地处理众多的随机事件,往往是制作大型系统
首先要考虑的问题之一。用C语言开发Windows程序时,可以方便地使用消息机制
(Message),但是,设计VB程序时,就没有这样的方便条件了。例如,多个窗口
同时打开同一个表(Table),当在一个窗口中对数据进行了修改,而其他的窗口
也能够随之进行数据更新,这时就需要有一条说明数据改变了的消息在所有的窗
口间进行广播。如果使用的语言是C,只需要定义一条用户消息(UserMessage)
,就可以实现这一点。可是如果是用VB编程,做起来就不是那么简单了,最初我
是试着这样实现的:
自定义了一个消息结构(VbMsg),并在程序的主窗体内,建立一个消息广播
引擎,主要由一个消息队列和一个定时消息广播器所组成。消息广播器固定隔一
定时间检查一次消息队列,如果有消息存在,就将其发送给所有的打开的窗口,
并将该消息从队列中删除。如此再定义一个全局的消息发送过程(SendMsg),将
要发送的消息(VbMsg)送入消息队列。这样当需要广播消息时,只需填充好消息
结构,调用SendMsg过程即可。这里较为复杂的是消息广播器如何将消息发送到各
窗口:这需要作个硬性规定,就是每一个窗体都必须定义一个形式完全相同的消
息接收函数(RecMsg),在这个函数中对接收到的消息进行处理,当然也可以什
么都不做。有了这样的规定之后,消息广播器在进行广播时,就可以是利用VB系
统定义的全局变量Forms,遍历所有的窗体,并调用一遍每个窗体的消息接收函数
,其样子大致如下:
Public Sub SendMsgToForms(msg as VbMsg)
Dim frm as Form
For Each frm In Forms
frm.RecMsg msg
Next frm
End Sub
通过上面的这些过程,就可以实现在独立的程序中,对随机事件进行异步处
理。这一方法我曾经在早期开发的几个系统中使用,效果基本还是令人满意的。
但是它有几个较大的局限性,当开发更大一些的系统时,就显得不能够满足需要
。主要有以下几点:
1.定时检查消息队列,需要利用Timer控件进行触发。这在程序运行时,就必
然要牺牲一部分效率;
2.消息广播的范围限定在一个程序模块内,如果整个系统分成多个大的模块
,那么存在于动态连接模块(.DLL)中的窗体,将不能直接接收到广播消息。而
要想实现进程间的消息传递,这一方法就更加不可能;
3.消息的接收者只能是窗体,而做为真正的基础单元--“类”却无法直接接
收消息。
为了打破上面的几点局限性,就必须寻找新的解决办法。非常庆幸的是,V
B5.0企业版的推出,给VB增添了许多强有力的特性,有几点特性,正好可以帮助
我们解决难题。先让我介绍一下这几个特性:
1.用户自定义事件:在类模块中,可以使用Event关键字来定义用户自定义事
件,使用RaiseEvent语句来产生该事件,这一机制给处理随机事件带来极大的方
便。上面说的消息广播引擎,就可以不再使用Timer控件做支持,而是当收到需要
广播的消息时,产生一个预定义的事件,而需要处理消息的客体对象,只需截获
该事件,就完成了消息的传递。
2.ActiveX EXE部件:利用VB,可以方便地将共享代码封装在ActiveX部件之
中。将消息广播引擎实现于一个ActiveX部件之中,不仅方便了在程序中使用,而
且更为重要的一点是,可以实现跨进程间的消息传递。因为ActiveX部件有内部(
DLL)外部(EXE)两种,对于外部部件,可以对模块内的全局数据实现共享(关
于ActiveX两种代码部件的区别,请阅读VB的联机帮助文件)。
3.远程自动化连接:ActiveX部件,是一种标准的客户机/服务器结构,利用
Windows平台的COM模型,VB已能方便地将这种结构扩展到整个网络的范围。所以
,我们的消息广播设计,在实现了进程间的消息传递之后,进而实现网络上的消
息传递,也成为可能。
通过上面的几点介绍,这一方式的设计思想也就比较清楚了,在具体设计时
,我通过四个模块之间的相互协作,完成了消息的发送、广播及接收,并将这四
个模块封装在一个ActiveXEXE部件之中。下面就是这三个类模块的简单介绍及源
代码:
类模块之一:Msg.cls----在该模块中,定义了消息数据结构VbMsg类,它是
消息传递中的载体。这里只是一个简单的例子,如果想实现更多的功能,如建立
两点间的数据通道,而不是单纯的广播消息,则可能需要对该结构进行一些扩充
。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "VbMsg"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
'-------------------------------
' 说 明:
'
' 消 息 类: 定 义 全 局 的 消 息 结 构
'-------------------------------
Public iType As Long ' 消 息 类 型 编 号
Public iName As String ' 消 息 名
Public iSource As String ' 消 息 源 说 明
Public iDescription As String ' 消 息 说 明
Dim iT As Date ' 消 息 发 生 时 间
' 返 回 日 期 型 时 间
Public Property Get iTime() As Date
iTime = iT
End Property
' 返 回 字 符 型 时 间
Public Property Get iTimeStr() As String
iTimeStr = Format(iT, "yyyy.mm.dd hh:mm:ss")
End Property
' 在 对 象 被 建 立 时, 设 置 消 息 发 生 时 间
Private Sub Class_Initialize()
iT = Now()
End Sub
类 模 块 之 二:MsgCli.cls ---- 本 模 块 是 对 客 户 接 收 端MsgCl
ient 类 的 定 义, 这 相 当 于 一 个 消 息 接 收 器。 在 这 个 类 中 定
义 的 一 个RecMsg 事 件, 当 接 收 器 收 到 消 息 时( 过 程SetMsg 被
调 用), 就 产 生 这 一 事 件。 接 收 器 的 建 立 者 就 截 获 这 一
事 件, 并 处 理 消 息。 为 了 避 免 接 收 不 必 要 的 消 息, 声 明 了
minMsg、maxMsg 两 个 变 量, 以 便 对VbMsg 中 的iType 属 性 进 行 过 滤
。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "MsgClient"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
'-------------------------------
' 说 明:
'
' 客 户 消 息 接 收 类
'-------------------------------
'
' 定 义 接 收 消 息 事 件, 该 对 象 的 宿 主 类 应 截 获 该 事 件, 并
处 理
' 接 收 到 的 消 息。
Public Event RecMsg(ByVal msg As VbMsg)
'
' 通 过 设 置 消 息 的 接 收 范 围, 可 以 过 滤 掉 不 需 要 的 消 息
Public minMsg As Long
Public maxMsg As Long
'
' 该 对 象 的 标 志 编 号, 使 用 时 不 应 修 改 该 值
Public ID As Long
'
' 事 件 产 生 过 程, 只 应 由 消 息 服 务 器(MsgServer) 调 用
Public Sub SetMsg(msg As VbMsg)
If msg.iType >= minMsg And msg.iType <= maxMsg Then RaiseEvent Rec
Msg(msg)
End If End Sub ' '
根 据ID, 返 回 对 象 的 关 键 字, 只 应 由 消 息 服 务 器(MsgSe
rver) 调 用 Public Property Get Key() As String Key="ID:" & ID End Pr
operty
类模块之三:Global.bas ---- 本 模 块 声 明 了 两 个 全 局 变 量,
一 个 是 接 收 器(MsgClient) 列 表(Clients), 一 个 是 接 收 器 计
数 器, 以 为 每 个 接 收 器 分 配 一 个 唯 一 的ID 标 志。 把 变 量
放 在 单 独 的 模 块 中, 是 为 了 实 现 数 据 在 进 程 间 的 共 享,
是 跨 进 程 间 消 息 传 递 的 关 键 所 在。( 应 保 证 在 编 译 时 工
程 是 单 限 程 的, 否 则 数 据 共 享 则 不 能 实 现。)。
Attribute VB_Name = "modGlobal"
Option Explicit
'-------------------------------
' 说 明:
'
' 消 息 服 务 器 全 局 变 量
'-------------------------------
' 消 息 接 收 客 户 列 表
Public Clients As New Collection
' 消 息 接 收 客 户ID 计 数 器
Public CliCount As Long
类模块之四:MsgSrv.cls----本模块中定义了消息服务器类MsgServer,该类
是消息广播引擎的主体,它主要管理维护消息接收器列表(Clients),将发送来
的消息(调用SendMsg过程)依次发送给列表中的所有接收器。注意,这个类被声
明为公共全局类,这主要是为了方便使用(不必在每个程序中再建立该类,过程
名全局有效)。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "MsgServer"
Attribute VB_GlobalNameSpace = True
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
'-------------------------------
' 说 明:
'
' 消 息 服 务 器 类
'-------------------------------
' 发 送 消 息
Public Sub SendMsg(msg As VbMsg)
Dim c As MsgClient
For Each c In Clients
c.SetMsg msg
DoEvents
Next c
End Sub
'
' 增 删 消 息 接 收 客 户
Public Sub AddMsgClient(c As MsgClient)
CliCount = CliCount + 1
c.Id = CliCount
Clients.Add c, c.Key
End Sub
Public Sub DelMsgClient(c As MsgClient)
Clients.Remove c.Key
If Clients.Count = 0 Then CliCount = 0
End Sub
到这里,一个小巧灵活的消息广播引擎就完成了,它的使用范围很广,用起
来也很方便,只需在工程中引入编译过的ActiveX部件,就可以直接调用SendMsg
发送消息,可能在安装消息接收器(MsgClient)时会稍许有点麻烦,下面举一个
简单的应用例子大致说明一下:
在设计Windows程序时,往往会感觉到程序的实际运行过程与你想象的相差甚
远,调试时就非常希望看到程序运行时后台的一些情况。利用VB的单步执行或De
bug命令,都会受到一些限制。利用消息广播引擎,制作一个通用的实时消息事件
查看程序,就可以很好地解决这一问题。查看程序的主要工作就是捕捉一组事先
定义好的消息事件,并将消息的内容显示在列表框内,可以只用一个窗体完成,
大体样子如下:
Const MsgInfoID=101
Private WithEvents mClient As MsgClient
Private Sub Form_Load()
Set mClient = New MsgClient
MClient.minMsg= MsgInfoID
MClient.maxMsg= MsgInfoID
AddMsgClient mClient
End Sub
Private Sub Form_Unload(Cancel As Integer)
DelMsgClient mClient
End Sub
Private Sub mClient _RecMsg(ByVal msg As VbMsgSrv.VbMsg)
List1.AddItem msg.iTimeStr & Chr(9) & msg.iName & Chr(9) & msg.iDe
scription
End Sub
在被调试的程序中,为了调用方便,可以编写一个全局过程,象下面这个样
子:
Const MsgInfoID=101
Public Sub MsgInfo(iName As String,iDes As String)
Dim msg As New MsgClient
With msg
.iName = iName
. iDescription = iDes
End With
SendMsg msg
End Sub
在程序的重点需要了解的环节插入MsgInfo过程,运行时信息就会在事件查看
程序的窗 口中被显示出来。这种方法尤其适合调试多程序协作的软件系统。当软
件系统正式交给用 户时,插入的MsgInfo过程也不一定要全部删掉,只要将实时
查看变为写入日志文件,这 些运行时的信息也是日后软件维护的第一手资料。
c VB的OPEN对话框控件图示功能扩充
安徽 刘成
Visual Basic For Windows(VB)提供了丰富的控件,但其提供的公用对话
框控件在打开文件时(例如*.Bmp和*.Pcx等)不能显示文件内容即图像,本
文给出了一个实例,可以模拟一些图形软件包在打开文件的同时显示图像,模拟
和扩充OPEN控件功能。
为模拟的扩充OPEN功能,下面给出了一个完整的VB程序,实现方法如下:
一、建立窗体
首先建立一个窗体(窗体名为OPNFILE),窗体上包含驱动器列表、目录列表
、文件列表、两个命令按钮(确认、取消)和显示影像的控件(picture或image
),下面是这6个控件的建立方法和有关属性的改变。
1、DirvelistBox驱动器列表控件
双击驱动器列表控件,在窗体上调准控件的位置,控件名称为“Drive1”。
2、DirlistBox目录列表控件
双击目录列表控件,在窗体上调准控件的位置,控件名称为“Dirl”
3、FilelistBox文件列表控件
双击文件列表控件,在窗体上调准控件的位置和尺寸,控件名称为“Filel”
,修改“Pattern”属性为“*.bmp, *.pcx”。
4、Command Buttom命令按钮控件
双击命令按钮控件,建立命令按钮,第一个取名为Command1,修改Caption属
性为“确认”,第二个取名为Command2,修改Caption属性为“取消”。
5、显示影像的控件
既可以选picture控件,也可选image控件显示图像,以image控件为例。双击
image控件,调准矩形框的大小和位置,取名为imagel,设置strtch属性。strec
h=false时,图形以原尺寸显示。
二、事件过程的建立
1、驱动器更改事件过程
Sub Drive-change()
①Dirl.Path=Drivel.Drive
②ChDrive Drivel.Drive
End Sub
其中①当驱动器发生更改时,改变目录路径;②更改路径。
2、目录更改事件过程
Sub Dirl change()
Filel.Path=Dirl.path
End Sub
该事件过程是对目录发生更改时,作出文件路径更改的响应。
3、文件列表单击事件
Sub Filel-click()
Imagel.picture=loadpicture(Filel.path+”\”+Filel.FileName)
End Sub
单击任一图形文件名时,在image控件框上显示图像。
4、命令按钮控件
Sub Command1-click()
F1$=Filel.path+”\”+FileName
End
End Sub
Sub Command2-click()
F1$=” ”
End Sub
F1$为选择文件名称,供软件使用,若用户单击“取消”按钮,F1$为空串
。
单击驱动器名可以改变驱动器,单击目录列表中某一目录可以更改目录,单
击某一图形文件可以显示图形,在文件列表中按“↑”或“↓”键,可以随着文
件名的变化,图像框中的图形也随之发生更改。
F1$可以供应用程序调用,其中包含驱动器名、目录和文件名。
=============================================
问题征答()
=============================================
其它
如果您想找到关于VB的文章,请您访问:
http://pccms.pku.edu.cn:8000/cgi-bin/allsearch?cdtype=ENG&dc=All&displ
ay=Standard&fno=0&method=Fuzzy&operation=And&word=vb?
关于VB的技巧大观:
http://zb169.net/~thriller/howto.htm
====================================================================
欢迎订阅VB免费邮件
====================================================================
订阅地址 http://server.com/WebApps/mail-list-subscribe.cgi?id=16852
====================================================================
如果您觉得这个邮件列表好的话,请告诉您的朋友。
====================================================================
欢迎投稿 msnet@188.net
====================================================================
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:goodvbhome.yeah.net
====================================================================
--
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:http://goodvbhome.yeah.net
m;32m※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 202.103.46.115]m
--
m;34m※ 转寄:.网易 BBS bbs.netease.com.[FROM: bbs.huizhou.gd.cn]m
.
--
曾经有一份真诚的感情摆在我的面前,但是我没有珍惜,
等到了失去的时候 才后悔末及,尘世间最痛苦的事莫过
于此。如果上天可以给我一个机会再来一次 的话,我会
跟那个女孩子说:“我爱你。如果非要把这份爱加上一个
期限,我希 望是一万年。”
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.8]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店