博文
用VB控制EXCEL生成报表(2006-04-02 13:22:00)
摘要:做为一种简捷、系统的 Windows应用程序开发工具,Visual Basic 5 具有强大的数据处理功能,提供了多种数据访问方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多种数据库,被广泛应用于建立各种信息管理系统。
但是,VB缺乏足够的、符合中文习惯的数据表格输出功能,虽然使用Crystal Report控件及 Crystal Reports程序可以输出报表,但操作起来很麻烦,中文处理能力也不理想。Excel作为Micorsoft公司的表格处理软件在表格方面有着强大的功能,我们可用VB5编写直接控制Excel操作的程序,方法是用VB的OLE自动化技术获取Excel 97 的控制句柄,从而直接控制Excel 97的一系列操作。
下面给出一个实例:
首先建立一个窗体(FORM1)在窗体中加入一个DATA控件和一按钮,引用Microsoft Excel类型库:从"工程"菜单中选择"引用"栏;选择Microsoft Excel 8.0 Object Library;选择"确定"。
在FORM的LOAD事件中加入:
Data1.DatabaseName = 数据库名称
Data1.RecordSource = 表名
Data1.Refresh
在按钮的CLICK事件中加入
Dim Irow, Icol As Integer
Dim Irowcount, Icolcount As Integer
Dim Fieldlen() "存字段长度值
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
Wi......
在VB程序中处理随机事件(2006-04-02 13:17:00)
摘要:在程序设计过程中,如何轻松地处理众多的随机事件,往往是制作大型系统首先要考虑的问题之一。用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.定时......
vb高手搜集-常见问题总结(2006-04-02 13:08:00)
摘要:一、如何用 VB 启动其他程序或开启各类文件
要在 VB 中启动其他程序或开启各类文件,最简单的方法就是使用 Shell 函数,例如:要开启 C:\Test.txt 这个文字文件,则要启动记事本来开启这个文件案,程序如下:
Dim RetVal As Long
RetVal = Shell("C:\Windows\Notepad.exe C:\Test.txt", 3)
'3代表视窗会最大化,并具有驻点,细节请查 Help
以上的语法虽然很简单,但有一个风险,若是我们不知道开启文件的执行文件位置,则程序便会有错误产生,尤其一般软件在安装的时候都可以让使用者自行选择安装目录,所以执行文件的路径不能写死在程序中,要解决这个问题,就是在注册文件中找到该副文件名之启动程序位置,再放入 Shell 中。
但是以上的作法必须熟悉注册文件,而且必须使用 Windows API 来 Call (注册文件的存取以后会有专文来说明),如果您对注册文件的存取及 API 的使用都很纯熟的话,当然没问题,但是有些人对于注册文件会有畏惧,这时候,您可以使用下面的方法:
Shell("Start C:\Test.txt")
您完全不用知道这份文件的启动程序是什么?它放在什么地方?参数 Start 便会自动依照附文件名到注册文件中找到启动程序来开启该份文件案! 不赖吧!
注一:在 Windows 95/98/NT 平台中, 什么副文件名之文件案, 该由什么执行文件来启动, 都设在关联中,代码为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Extensions
例如: 名称为 ".DOC" 之资料为 "C:\Progra~1\Micros~2\Office\WINWORD.EXE ^.DOC"
名称为 ".TXT" 之资料为 "notepad.exe ^.txt"
注二:使用 Start 之唯一缺点为 "会比直接指定执行文件稍为慢 0.5-1 秒钟."
二、让您的文字框有 Undo / Redo 的功能
......
vb 高手搜集-常见问题总结1(2006-04-02 13:06:00)
摘要:如何检查软盘驱动器里是否有软盘
使用:
Dim Flag As Boolean
Flag = Fun_FloppyDrive("A:")
If Flag = False Then MsgBox "A:驱没有准备好,请将磁盘插入驱动器!", vbCritical
'-------------------------------
'函数:检查软驱中是否有盘的存在
'-------------------------------
Private Function Fun_FloppyDrive(sDrive As String) As Boolean
On Error Resume Next
Fun_FloppyDrive = Dir(sDrive) <> ""
End Function
如何弹出和关闭光驱托盘
Option Explicit
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Sub Command1_Click()
mciExecute "set cdaudio door open" '弹出光驱
Label2.Caption = "弹 出"
End Sub
Private Sub Command2_Click()
Label2.Caption = "关 闭"
mciExecute "set cdaudio door closed" '合上光驱
Unload Me
End
End Sub
如何让你的程序在任务列表隐藏
Private Declare Function RegisterServiceProcess Lib "......
VB实现的MSN信息群发软件(2006-04-02 12:59:00)
摘要:MSN是目前网络上广泛使用的一个即时信息交流工具(IM),笔者就常用它与同事或朋友联系,但是在使用过程中发现缺乏一个群发信息的功能,于是笔者寻思着自己编写一个MSN信息群发的软件,在查阅了一番资料之后,终于写出来了。下面大家和我一起动手来自己做一个MSN的信息群发工具。
第一步:新建一个工程。启动VB,选择“文件”菜单的“新建”子菜单新建一个VB工程,系统回自动添加一个窗体,并且取名叫Form1。
第二步:添加MSN接口的引用。点击VB的IDE环境的菜单中的工程菜单,在弹出的下拉菜单中选择“引用(N)...”子菜单。在弹出的“引用”窗体中的“可用的引用”下拉列表中找到“Messenger API Type Library” 项,将起前面的钩打上,然后关闭“引用”窗口。参见图1
图1
第三步:设置窗体,添加控件。首先在vb的工程管理器中双击Form1,打开窗体设计环境。选中窗体,将它的Caption值改为“MSN消息群发”。然后在窗体上添加控件,并且设置其初始属性。要添加的控件的信息见下表:
名称
类型
Caption属性的值
Label1
Label
群发对象:
Combo1
ComboBox
Check1
CheckBox
只发送在线的
Label2
Label
消息内容:
Text1
TextBox
Command1
CommandButton
发送[&O]
Command2
CommandButton
退出[&X]
添加完控件后调整其位置,最后形成图2的效果:
图2
第四步:编写代码。
Dim m_MSG As New MessengerAPI.Messenger 'MSN的Com对象
Dim m_Groups As MessengerAPI.IMessengerGroups 'MSN中的分组
Dim m_Group As MessengerAPI.IMessengerGroup 'MSN中组的内容......
VB十七种可用一行代码完成的技巧(2006-04-02 12:56:00)
摘要:编程要讲效率,尽管现在的计算机,速度是不成问题,但是,如果一行代码能完成,为什么要用更多的代码呢?现在介绍VB中一些可用一行代码完成的技巧。
1、下列代码,则是对逻辑运算不清楚造成
If A=true Then
C= Not B
Else
C= B
End If
可以:
C=A XOR B
2、如果加上下列代码:
If C=true then
D=28
Else
D=29
End IF
D=Iif((A XOR B),28,29)
3、布尔赋值,常被人忽略,如:
If A= 13 then
B=True
Else
B=False
End If
可以:
B = A = 13
或者:
B = (A = 13)
我更喜欢用后者,这样代码易于看懂。
4、字串有效性检测:
If IsNull(StrOrg) Or StrOrg="" then
可以:
If Len(StrOrg & "")<>0 then
5、字串重复次数
RepeatCount=Ubound(Split(StrOrg,StrFind))
同样,如果要对字串有效性判断:
RepeatCount=Iif((Len(StrOrg & "")=0), 0, Ubound(Split(StrOrg,StrFind))
6、有时需要判断字串数组中是否有这一元素,这时最好不用数组,而用分隔符字串,于是:
If Len(OrgStr)= Len(Replace(OrgStr,FindStr)) then
则表明,此元素不存在。
7、对数组初始化,最好用变体,这样,也是一行语句,如:
IntArr=Array(12,28,29,30,31,52,24,60)
注意,此时需要用变量后缀。上面代码,如要定义为长整型,则
IntArr=Array(12&,28&,29&,3......
用VB编写你自己的MSN即时通讯软件(2006-04-02 12:53:00)
摘要:你用VB已经有很长时间了,一直疑惑MSN是如何工作的。现在你不用再为这个问题苦恼了,这篇文章不仅告诉你MSN是如何工作的,甚至还告诉你如何用VB编出你自己的MSN即时通讯软件。
我们可以把MSN的工作机制分成两个阶段:
认证阶段
认证阶段包括登陆到MSN即时通的服务器并且取得好友列表
即时通讯阶段
即时通讯阶段包括发送/接受进入即时通讯阶段的请求和发送/接受消息。
MSN即时通讯软件的协议是基于ASCII码的协议,用其他话来讲就是所有的命令都必须是英文的!第一个阶段包括连接到MSN即时通软件的服务器。在这个阶段我们应该连接到服务器“messenger.hotmail.com”的1863端口(MSN即时通讯软件通过1863端口进行工作)。一旦连接上以后,我们就应该开始登陆过程了。此过程的第一步是验证MSN的版本。在此步中,客户端(即你的MSN软件)列出及向服务器发送它可以支持的版本,然后等待服务器的回应。
VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVRO
在MSN协议中,伴随着每个命令都有一个“试验ID”被发送。此实验ID从0开始,并且当每次服务器成功的对客户端的命令做回应时,都会增加。
服务器的回应如下
VER 0 MSNP7 MSNP6 MSNP5 MSNP4
现在客户端(MSN)和服务器之间确定了它们之间将要进行通讯的版本。
下一步客户端(MSN)向服务器发送一个请求,要求服务器提供它所支持的认证时需要的安全包的名字。
INF 1
不像ahoo,Rediff和其它的一些即时通讯软件,MSN在发送密码时会将密码加密,保证如有人监控你的端口时,密码不会轻易的泄露。
服务器的回应如下
INF 1 MD5 (MD5在这里是服务器当前支持的安全包的名字)
下一步客户端(MSN)将向服务器发送用户ID
USR 2 MD5 I venky_dude@hotmail.com
然后服务器将检验它是否包含有验证所需的此用户的所有相关信息。如没有的话,服务器将会发送如下回应:
XFR 2 NS 64.4.13.55:186......
VB实现远程共享显示及声音(2006-04-02 12:47:00)
摘要:在局域网内共享调制解调器以及共享打印机都是我们非常熟悉的,而对于显示器和声卡的共享一般比较陌生。
当你在进行教学、演示或展示时,也许你希望主控电脑上的画面同时也出现在其它电脑上;当你在跟踪调试程序时,你也许梦想过两台显示器能够同步,以便观看源代码时不破坏运行程序画面;还有,出于管理的目的,或许你需要远程监控其它电脑的运行状况,等等。上述所有情况都是远程共享显示的例子。
共享声卡的需求也不少:首先这可以降低硬件投资,让没有装或者没法装声卡的电脑(如某些笔记本电脑)也有了“喉舌”;其次,即使每台机器都有声卡也不无用武之地:至少你的 mp3背景音乐与你的英语有声软件不再经常发生冲突了;还有,共享声卡使得“远程有声通知”成为可能,其作用类似于立即型声音邮件,在日常工作中有广泛的应用。
共享显示器或声卡的硬件(一般在扩展槽内插一块卡)在市场上不难找到。但扩充本文的示例程序即可以用软件轻松实现这些功能。
一、共享显示
我们通过一个完整的示例程序(VB 6.0)来说明。在例子中,被共享端(即服务器端)的任务是:自动捕获本机的当前显示画面,并将之传给共享端(即客户端)。
1. 服务器端程序(frmServer.frm)
这里有三点需要重点说明:一是自动捕获画面问题。为了模拟“捕获屏幕键”被按下的动作,程序里使用了 API调用 keybd_event。虽然VB的SendKeys语句也有类似功能,但它不如 keybd_event稳定和可靠。二是画面粘贴和压缩存储问题。为了能把已经被捕获到系统剪贴板中的图像粘贴下来并存储到文件,程序里使用了 ImgEdit控件。该控件强大的功能远非PictureBox控件或 Image控件可比。ImgEdit 不仅支持多种压缩图像格式(如 JPG、TIFF等),而且它对画面进行操纵和编辑的功能也非常强大(如图像旋转、缩放、嵌入等)。ImgEdit 还能对剪贴板进行Copy、Cut、Paste等操作。使用 Ctrl+T 或菜单(工程->部件)来添加 Windows标准的 ImgEdit控件(参见图一)。三是文件传输问题。用 ImgEdit存储的压缩文件一般只有 40 KB左右,使用 Winsock控件可以一次传输出去。但由于接收方的 Winsock控件一般......
身份证号码校验位计算函数(VB版)(2006-02-28 20:57:00)
摘要:
身份证号码校验位计算函数(VB版)
function fcs(s)'s为17位号码,含“19”,仅返回最后的校验位
sum1 = Mid(s, 1, 1) * 7 + Mid(s, 2, 1) * 9 + Mid(s, 3, 1) * 10 + Mid(s, 4, 1) * 5 + Mid(s, 5, 1) * 8 + Mid(s, 6, 1) * 4 + Mid(s, 7, 1) * 2 + Mid(s, 8, 1) + Mid(s, 9, 1) * 6 + Mid(s, 10, 1) * 3 + Mid(s, 11, 1) * 7 + Mid(s, 12, 1) * 9 + Mid(s, 13, 1) * 10 + Mid(s, 14, 1) * 5 + Mid(s, 15, 1) * 8 + Mid(s, 16, 1) * 4 + Mid(s, 17, 1) * 2
Select Case sum1 Mod 11
Case 0
fcs = "1"
Case 1
fcs = "0"
Case 2
fcs = "x"
Case 3
fcs = "9"
Case 4
fcs = "8"
Case 5
fcs = "7"
Case 6
fcs = "6"
Case 7
fcs = "5"
Case 8
fcs = "4"
Case 9
fcs = "3"
Case 10
fcs = "2"
End Select
end function常用的正则表达式和身份证号码验证方法
1、车牌号:
/^苏[A-M]-[A-Z0-9][0-9]{4}$/
2、电子邮件:
/^[a-zA-Z][a-zA-Z0-9._-]*@([a-zA-Z0-9-_]+\.)+(com|gov|net|com\.cn|edu\.cn)$/
3:身份证号码:
身份证号都代表什么意思?
1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。......
VB中串口通讯的实现(2006-02-19 13:35:00)
摘要:
VB中串口通讯的实现
福建 李铭 陈春美
一、概述
串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。 提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通 讯,甚至其实现方法和C、汇编相比,要更加快捷方便。下面,笔者就介绍一下在VB中实现串口通讯的方法。
在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。我们只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。下面,笔者就简要地介绍一下
MSComm控件的使用方法。
二、MSComm控件的主要属性、事件
1、MSComm的属性
由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。
Commport:设置通讯所占用的串口号。如设成1(默认值),表示对Com1进行操作。
Setting:对串口通讯的相关参数。包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。其默认值 是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。
Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。
&......