admin管理员组

文章数量:1647029

文章浏览广告

VB编程技巧几例 

现在加入 http://14.66.102.214 

VB5 引入枚举变量,使用它,我们可以显著地改变应用程序的易读性:

 

Public Enum TimeOfDay

 

Morning = 0

 

Afternoon = 1

 

Evening = 2

 

End Enum

 

Sub Main()

 

Dim RightNow As TimeOfDay

 

If Time >= #12:00:00 AM# And Time < #12:00:00 PM# Then

 

RightNow = Morning

 

ElseIf Time >= #12:00:00 PM# And Time < #6:00:00 PM# Then

 

RightNow = Afternoon

 

ElseIf Time >= #6:00:00 PM# Then

 

RightNow = Evening

 

End If

 

End Sub

 

 

 

VB编程技巧几例

山东 许振华

 

 

1 文本框内容的自动选择。

 

    在软件安装等一些场合需要将文本框中的内容自动选择,比如选择确省安装路径,在VB中可用如下的事件驱动代码:

 

 

sub text1_getfocus()

 

text1selstart0 ’选择起始位置

 

text1sellength65000 ’选择长度

 

end sub

 

sellength接近文本框允许的最大长度(65535),这样做是为了

 

强迫VB使用文本的实际长度。

 

 

 

2 防止自身多次运行。

 

    由于WINDOWS的多任务处理功能, 有些程序可能打开后忘记了,下次用时还可能再打开,这样做会占用系统资源降低系统效率。为了防止自身被多次运行,可利用VB应用对象提供的PrevInstance属性来检测内存中是否已有一个自身的副本,若有则给出提示后结束。一般将检测代码放在FORM_LOAD()中,因为程序一运行就要检测。

 

代码如下:

 

sub form_load()

 

if AppPrevInstance then

 

msg$=Appexename ”has already run”

 

msgbox msg$,48 ’给出程序已运行的提示和一惊叹号以示警告

 

end

 

endif

 

end sub

 

 

3 格式化输入。

 

    在数据输入过程中,有些数据要求一定的格式,比如限制输入的只能为数字或英文字符,这可用VB的格式输入文本框来实现。它与文本框(TEXT BOX)功能基本相似,但多了一个MASK属性,MASK属性常用的设定如下:

 

       #—限定仅能输入数字09

       A— 限定输入为英文字符及数字;

       ?—限定仅能输入英文字符;

       .—限定小数点位置;

       :—限定时间分隔号;

       /—限定日期分隔号

 

    不需编写代码,只要在设计时将格式化文本框对象(MASKED EDIT)的MASK属性设计好所需格式即可。比如 ## - ## - ## 可输入121196

 

4 MSGBOX函数设计版权信息。

 

    MsgBox函数可用来设计简易的版权信息,它只能显示文本,如果要求不高的话可采用它,优点是非常方便,比如在菜单ABOUT项中显示版权信息。

 

    MsgBox函数的用法如下:MsgBox msg [, type][, title

 

       msg —需要显示的文字信息,如版权信息。

       type—按钮显示选择项。

       0 只显示 OK按钮(确省选择),4 显示 Yes No 按钮

       title—标题文字信息。

 

 

    MSGBOX最多能显示1024个字符, 超出的将被截去;它可自动换行,如果你想强制换行的话需要在换行处加入换行符CHR10)。

 

例子:

 

Sub Form_Click ()

 

Msg1 ” Copyright c 1996” Chr10 ”Ver

 

10 ” ’分两行显示

 

MsgBox Msg1 0 ”Copyright demo” ’只显示一个OK按钮

 

End Sub

 

 

 

使用 IIF SWITCH 以精减代码

 

 

    在很多地方你都可以使用一个更紧凑的 IIf 函数来代替 If...Else...Endif 的结构: 例:返回两个值中较大的一个 maxValue = IIf(first >= second, first, second)

 

 

    Switch 则是一个很少使用的函数,可是在很多方面它都提供比 If...ElseIf 结构更好的 例:判断 "x" 是正、负还是 null?

 

        Print Switch(x<0,"",x>0,"", True, "Null")

 

 

 

变量的地址

 

    VB5 内置了一个 VarPtr 函数,可是此函数在 VB4 中没有提供。可是你知道吗?VB4 的运行库中已经包含了此函数。只是在用它之前,我们需要声明一下:

 

        #If Win16 Then

 

        Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long

 

        #Else

 

        Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long

 

        #End If

 

    此函数在传递一个 Type 结构(如果此结构要求其一段是另一个变量或记录的地址)给一个外部的 API 程序时十分有用。

 

 

 

 

向文件中写入非 ASCII 字符

 

 

    如何向一个文件中写入非ASCII字符(ASCII码在128-255之间)?这在 VB3 中按常规方法就可以很好处理。但是,自 VB4 起,微软引入 Unicode 后,此问题就显得有些麻烦。方法如下:

 

      Dim a As Byte '如果你不用 Unicode,微软推荐使用 Byte 类型替换 String 类型

 

      a=&HF5 '此处直接给处 ASCII 码即可

 

      Open "test.dat" For Binary As #1

 

      Put #1, , a

 

      Close (1)

 

 

VB中感叹号“!”与圆点“.”的用法差异

河北 马昱

 

 

    Visual Basic中,惊叹号“!”与圆点“.”都用于给对象命名,但两者语法上却存在很大的区别,这点在编程时尤其需要注意。

 

    圆点操作符“.”用来表示对象的属性和方法,在引用时,需要用到对象的Name、圆点和需要的属性或方法。例如要引用文本框Textl中的文本属性时可用reponse$=Text1Text,再如要改变Form1窗体返回或读取对象高度的单位时用Form1ScaleHeigh2000表示。

 

    感叹号“!”常用于当一个控件作为一个特性访问的情况下,例如引用Fomr2Text1文本框文本属性时,可采用response$=Form2text1text语法格式。

 

    虽然两者的语法应用结构有较大差异,但两条语句的性能是相同的,值得注意的是如果你在感叹号“!”的位置使用“.”可以获得对窗体上Text1特性的直接访问权,为了进一步增加感性认识,你不妨运行下面的例子来试试。

 

    1.建立一个新项目,并在Form1窗体中增加一个命令控件。

 

    2.双击Form1窗体,编辑FormLoad事件并输入:

 

        Form1Command1Caption=”Text”

 

        Form1Command1Caption=”It Works”

 

    3.运行试项目,这时你就会在Command1命令框中看到字符串It Works

 

    为了在程序中清楚地界定引用的控件名和该控件的属性或方法,增加程序的可读性,最好使用感叹号“!”,这也是VB的推荐方式。

 

 

 

0""(空字串)NullEmpty、与 Nothing 的区别

 

 

    先回答以下问题吧! 经过以下的叙述之后, 变量 ABCD 分别等于 0""Null Empty Nothing 的哪一个?

 

Dim A

 

Dim B As String

 

Dim C As Integer

 

Dim D As Object

 

    A 等于 Empty 因为尚未初始化的「不定型变量」都等于 Empty。但如果检测 A = "" A = 0 也都可以得到 True 值。

 

    B 等于 "" 因为尚未初始化的非固定长度「字串」都等于 "" 但请注意 B<> Null

 

    C 等于 0 这个还有问题吗?

 

    D 等于 Nothing 尚未设定有物件的「物件变量」都等于 Nothing 但请不要使用 D = Nothing , 而要使用 D Is Nothing 来判断 D 是否等于 Nothing 因为判断 是否相等的符号是 Is 不是 =

 

    最令人迷惑的地方是 Null 这个保留字, 请看以下语句:

 

Print X = Null

 

Print X <> Null

 

    结果都是输出 Null(不是 True 也不是 False) 这是因为任何一个运算式只要含有 Null 则该运算式就等于 Null 实际上想要判断某一数据是否为 Null 绝对不能使用:

 

        If X = Null Then ' 永远都会得到 Null

 

    而要使用:

 

        If IsNull(X) Then

 

    哪一种数据会等于 Null 呢? 除了含有 Null 运算式之外, 就属没有输入任何数据的「数据字段」(在数据库中) 会等于 Null

 

 

 

巧用Visual BasicRND()函数

浙江 傅昌盛

 

    Visual BasicRND()函数有一个重要的特征:当RND()的参数(我们称这里可以称它为种子)为负值时,同一种子(负值)产生同一个随机数序列。同时Visual Basic还具有强大的二进制技术功能,这样我们可以按以下思路实现文件内容加密:

 

      X=RND(-KEY) ’KEY为正数

 

      VAULE=INT(256*RND) ’产生一个随机数(以此为密码)

 

      Open FILENAME$ For Binary As #FILENUM’打开文件

 

      Get #FILENUM,I,A ’取文件内容

 

      B=A XOR VAULE ’得到加密文件

 

    结合

 

      C=B XOR VAULE’得到解密文件(B为加密后文件内容)

 

    注意:这里的A非整个文件内容,可以是极少部分、几个字节甚至单个字节,若为单字节,则文件中的每个字节同不同的数异或,破译难度可见有多么大。具体过程:

 

      Sub ENDECODE(FILENAME$,MA,FILE2$)'参数为:源文件,密码,目标文件

 

      Dim FILENUM As Integer,X As Single,I As Single

 

      Dim CHARNUM As Integer,RANDOMINTEGER As Integer

 

      Dim SINGLECHAR As String *1,filen2 As Integer'取单字节

 

      If MA<0 Them

 

      MA=MA*(-1)

 

      End If

 

      X=Rnd(-MA)'参数为负

 

      FILENUM=FreeFile

 

      Open FILENAME$ For Binary As #FILENUM '二进制方式打开源文件

 

      filen2=FreeFile

 

      Open FILE2$ For Output As #filen2’以顺序文件打开目标文件

 

      For i=1 To LOF(FILENUM)'LOF()文件字节长

 

      Get #FILENUM,i,SINGLECHAR'取单字节内容

 

      CHARNUM=Asc(SINGLECHAR)

 

      RANDOMINTEGER=Int(256*Rnd)'得到字母表

 

      CHARNUM=CHARNUM Xor RANDOMINTEGER'异或

 

      Print #filen2,Chr$(CHARNUM);’写入目标文件

 

      Next I

 

      Close FILENUM

 

      Close filen2

 

      ok ’调用成功对话框

 

      End Sub

 

        调用格式:ENDECODE 源文件名,密码,目标文件名

 

    上面过程可以对任何EXE、COM、文本等文件进行加解密(奇数次加密,偶数次解密),重演性极好,保密性特优,若对上述过程进一步加工,如进行多重随机等手段处理,那么将会更上一层楼,在此不累述。

 

    顺便提一下,上面过程若对目标文件同样以二进制文件打开、写入,那么只能对纯西文文本进行加解密,对于纯中文文本则通过修改取双字节、I的步长为2来实现,其它(中西文结合文本、EXE、COM等文件)则将得不到预期结果,其原因可以能是ASCII大于127的字符,不能正常显示,不能用put语句正常写入文件(得到的只是空格),有兴趣者不妨一试。

 

 

 

利用 lstrlen 计算中英文混合字串的长度

 

32-bit 版本的 VB 底下, 将每一个字符都视为两个 Byte 所以

 

Len("中英Mixed") 等于 7

LenB("中英Mixed") 等于 14

 

但是在很多场合底下, 我们希望中文字长度以 2 计算, 英文字母长度以 1 计算, 此时使用的方法如下:

 

' 欲计算字串 S 的长度

N = 0

For I = 1 To Len(S)

 

C = Asc(Mid(S, I, 1)) ' 取得第 I 个字符组的字符码

If C >= 0 And C < 128 Then ' 英文

 

N = N + 1

 

Else ' 中文

 

N = N + 2

 

End If

 

Next

 

看起来程序有点罗唆, 如果您不喜欢这个方法, 可以使用 Windows API lstrlen 函数, 假设假计算 S 的长度, API 声明式如下:

 

Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long

 

而调用的叙述则是:

 

n = lstrlen("中英Mixed" + Chr(0))

Print n ' n 将等于 9

 

请注意调用 lstrlen 时必须加上 Chr(0) 因为此一函数是根据 Chr(0) 来判断字串的结束。

 

调用 lstrlen 除了程序比较简短之外, 速度也比我们写 VB 程序判断中英文字然后计算长度来的快。

 

 

 

利用 StrConv 计算中英文混合字串的长度

 

上一周说明利用 Windows API lstrlen 计算中英文混合字串的长度之后,台中的 Rose 读者来函, 说还有更简单的计算方法, 如下:

 

LenB(StrConv("中英Mixed", vbFromUnicode))

 

说真的, 因为笔者懂得调用 Windows API 所以竟然忽略了此一 VB 内建的函数,可见闻道有先后, 在此笔者亦希望先闻道的读者能够将您的心得发表出来, 与喜欢 VB 的读者交流。

 

StrConv 的作用是字串内容的转换, 其中将叁数二设定成 vbFromUnicode,作用是把「双位元」的字串转换成中文字占用 2 Bytes、英文占用 1 Bytes 的字串,所以紧接着调用 LenB 便可以计算出中英文混合字串的长度。

 

 

 

如何传递不固定个数的叁数?

 

定义副程序时, 我们必须把叁数一一列出来, 例如:

 

Sub MySub( P1, P2, )

 

但如果我们将来调用副程序时, 可能会传入不固定个数的叁数, 那么副程序该如何定义呢?答案如下:

 

Sub MySub( ParamArray P() ) ' 把叁数 P 定义成一个阵列

 

如此定义副程序之后, 以下都是将来可能出现的调用叙述:

 

MySub "ABC" ' 只传递一个叁数

MySub 1, 3, 9, 988, 776, 234 ' 传递 6 个整数叁数

MySub 123, "abc", Date() ' 传递 3 个不同型别的叁数

 

以最后一个调用叙述为例, P(0) 叁数将等于 123 P(1) 叁数等于 "abc" P(2) 叁数则等于 Date() 函数的传回值, 而由于 P() 是一个阵列, 我们可以利用以下方法读取每一个叁数:

 

For i = 0 To UBound(P)

    ' P(i) 等于第 i 个叁数

Next

最后, 请注意以 ParamArray 所定义的叁数一定是 Variant(不定型) 型别, 若要判断每一个个别叁数的资料型别, 可以使用 TypeName 函数。

 

 

 

 

 

       0

>>上篇文章:VB编程技巧几例

 

 

>>下篇文章:VB实现全屏幕图形界面及动态功能提示

 

 

 

 

『关闭窗口』

 

文章浏览时的广告

文章浏览广告

VB实现全屏幕图形界面及动态功能提示 

现在加入 http://14.66.102.214 

在许多Windows软件的安装程序中,时常可以看到以某种颜色由浅至深的渐变为背景的窗口。使用VB制作这类窗口的方法有不少,而通过调用API函数绘制渐变的窗口背景色,似乎是一种既简单又节省资源的方法。

 

  首先,在module文件中加入下列声明语句:

 

  Declare Function CreateSolidBrush Lib"GDI"(ByVal crColor As Long) As Integer

 

  Declare Function FillRect Lib"USER"(ByVal hDC As IntegerlpRect As RECTByVal hBrush As Integer)As Integer

 

  Declare Function DeleteObject Lib"GDI"(ByVal hObject As Integer)As Integer

 

  Type RECT

 

  left As Integer

 

   top As Integer

 

   right As Integer

 

   bottom As Integer

 

  EndType

 

  然后,在窗口的Paint事件中加入下列代码:

 

  Private Sub Form_Paint()

 

  Dim Color As Integer

 

  Dim hBrush As Integer

 

  Dim OldMode As Integer

 

  Dim RetVal As Integer

 

  Dim StepSize As Integer

 

  Dim X As Integer

 

  Dim FillArea As RECT

 

  OldMode%=Me.ScaleMode

 

  Me.ScaleMode=3

 

  StepSize%=1+Me.ScaleHeight/80

 

  Color%=255

 

  FillArea.left=0

 

  FillArea.right=Me.ScaleWidth

 

  FillArea.top=0

 

  FillArea.bottom=StepSize%

 

  For X%=1 To 80

 

  hBrush%=CreateSolidBrush (RGB(0,0,Color%))

 

   RetVal%=FillRect(Me.hDC,FillArea,hBrush%)

 

   RetVal%=DeleteObject(hBrush%)

 

  Color%=Color%-4

 

   If Color% < 0 Then Color%=0

 

   FillArea.top=FillArea.bottom

 

  FillArea.bottom=FillArea.bottom+StepSize%

 

  Next

 

  Me.ScaleMode=OldMode%

 

  EndSub

 

  按F5运行,就会出现一个以从上至下、由浅至深的渐变蓝色为背景的窗口。对上述代码稍加改动,便可制作出各种颜色和水平方向的渐变背景。

 

 

 

 

如何在VBDelphi中快速实现立体化窗口显示

 

    VBDelphi中,我们可以很方便地创建具有立体化观感的窗口,这也是近两年来,Win3.X中较为流行的显示方式。许多专业化的软件都采用了这种立体化的窗口和相应的控件,达到了赏心悦目的效果。下面我们来谈谈如何在目前最流行的两种Win编程语言中实现这样的效果。

 

    其实,无论是VB还是Delphi,要实现这种效果都较为容易,在编程中,并不需要调用外部的DLL,在程序运行时,会自动调用CTL3dV2.dll

 

    我们先来看看如何在VB中实现:

 

    1.新建一个窗口。

 

    2.在窗口form的属性列表中有一项Auto3D属性,缺省值为false,将其设置为true。它是控制VB中是否显示立体窗口的重要属性。

 

    3.form的属性列表中还有一项BorderStyle属性,这是控制窗口的边框显示类型,将其设置为3Fixed Double

 

    4.现在可以运行这个程序了,你将会看到立体窗口出现。

 

    Auto3D属性设置为true,还有一个很好的副作用,那就是在这个窗口上的TextFrameCheckBoxOptionButtonListBox都自动具有了立体效果。

 

    Delphi中实现似乎显得更加容易和直观:

 

    1.新建一个窗口。

 

    2.在窗口form的属性列表中有一项BorderStyle属性,它的缺省值为bsSizeable,表示边界可以任意调整,将其重新设置为bsDialog

 

    3.运行程序,你会发现立体窗口出现了。(看来,Delphi中将这种立体化窗口称为“对话窗口”,确实如此,比如在Word中,对话窗口都是这种立体化的显示,而主窗口仍然是一般的风格。)

 

    VB中的Auto3D类似,在Delphi中有一个属性为Ctl3D,将其设置为true,将使所有在这个窗口上的控件具有立体观感,并且这种变化是立刻反映的,而不象VB中在运行时才能看到。

 

    Delphi的窗口form中,你还可以通过设置FormStyle属性为fsStayOntop来轻而易举的实现“永远浮在其他窗口”上的效果。著名的“译林”Win版本就是用Delphi写的,它其中就有一个“永远在最上面”的功能,就是这样实现的。

 

 

 

Visual Basic设计更好的用户界面

 

    有时在一个窗口中出现较多的控制件时,如果能向导式地建议用户下一步该做什么,不失为上策。

 

    Visual Basic的程序设计中,我们可以使用语句:Object.SetFaocus使我们希望的控件得到输入焦点,举个例子:在Form1中我们加入一个按钮Command1和一个文本输入Text1,双击按钮控件,然后键入如下代码:

 

        Text1.SetFocus

 

    再按F5运行程序,您就会看到一单击按钮,文本框会立即取得输入焦点。另外,我们还可以使用语句:Sendkeys "{TAB}"使下一个控件获得焦点,但我们需要在设计时确定各控件的Index值。(Properties窗口中)让控件自己感知自己的工作已完成,而主动将焦点让出,会使用户觉得应用程序很聪明,也减少了用户出错的机会。

 

    可是当焦点切换的两个控件相隔有一定距离时,上述的方法有时也不足以引起用户的注意,那么一种好的解决方法是将鼠标箭头也移到控件上。可惜,VB并不支持鼠标移动,那我们就求助API函数,API函数SetCursorPos可让我们如愿。

 

    下面是子程序MoveCursorOn,它可让鼠标移动到指定控件上方。

 

    下列代码请放在declarations段中:

 

Type PoinTAPI

 

x As Integer

 

y As Integer

 

End Type

 

Declare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)

 

Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)

 

Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer

 

    然后建立一个新的子程序(ALTNN→键入子程序名MoveCursorOn),下面是子程序的代码:

 

Sub MoveCursorOn(source As Control)

 

Dim Pt As PoinTAPI

 

Dim hparent As Integer

 

p.x=(Source.LeftSource.Width/2)/Screen.Twipsperpixel)

 

p.y=(Source.TopSource.Height/2)/Screen.Twipsperpixel)

 

hparent=GetParent(source.hwnd)

 

ClientToScreen hparent pt

 

SetCursorPos pt.x pt.y

 

End Sub

 

    使用该子程序很容易,例如我们想把鼠标移动到按钮Command1上,就可使用语句

 

Move Cursor On Command1

 

    您会看到鼠标箭头已经指着按钮Command1

 

    需要说明的是,千万不要滥用该子程序。让鼠标自己满屏乱飞,我们的用户会感到失去对应用程序的控制,这是违反我们的初衷的。

 

    在有数个输入框的窗口中(这在数据库应用程序中是很典型的),当用户完成第一个输入框的输入后,总爱习惯性的加一个回车,希望输入焦点落到下一个输入框中(DOS中大多数应用程序是如此),可往往事与愿违,这一回车却触发了拥有Default特性的按钮,结果不是关闭了当前窗口就是又蹦出另一窗口。用户睁大眼睛看着屏幕,“咦?!我到底做了什么?”这是Windows新用户经常遇到的事情。

 

    解决它其实很容易,只需在输入框的KeyPress事件中加入如下代码:

 

IF KeyASCII=13 Then

 

KeyASCII=0

 

Sendkeys "{TAB}"

 

END IF

 

    这样,当用户在这个输入框中键入Enter时,就象键入TAB键时,焦点被移到下一控件上。但需注意,这种方法不适用于多行的TextBox,即TextBoxMultiLine特性设为True时,因为这时的回车键是起换行的作用。

 

 

 

利用VB三维面板控件设计流动条

 

    VB提供了一个三维面板控件,利用这个控件可设计图形效果的立体界面,从而使应用程序的截面显得更生动、美观,该控件还可以设置各种形式的背景,然后在背景上显示各种形式的字符,令人感兴趣的是,使用三维面板控件,还可设计我们经常在安装程序中看到的表示安装进度的流动条,并可显示进程的流动条,并可显示进程百分比,改变流动条的颜色等。

 

 

一. 介绍属性

 

    FloodColor: 确定流动条的颜色,缺省为蓝色。

 

    FloodPercent: 显示当前过程如流动条进行的百分比,参数改变时显示的百分数和流动条的面积改变,设为一整型值,取值范围是0~100

 

    FloodShowpct: 决定是否在三维面板控件上显示百分比,是一个逻辑值。为Ture时显示,为False时不显示。

 

    FloodType: 表示用户对三维面板控件的使用方式。可取值有6个,如下所示:

 

0 缺省设置

 

1 表示流动条方向从左到右

 

2 表示流动条方向从右到左

 

3 表示流动条方向从上到下

 

4 表示流动条方向从下到上

 

5 表示使用指定的颜色从圆心向外画圆

 

 

 

二. 流动条设计

 

    如果在Windows 3.x下,工具箱中不存在三维面板控件,可选择File菜单中的"Add File…" 进行添加,在弹出的对话框中找到Windows/System目录,然后选定Threed.vbx文件即可,如果使用VB 4.0,需在Tools菜单中选择Custom Control命令,选定Sheridan 3d Controls项,按OK按纽,可在工具箱中增加三维面板控件。

 

    启动VB ,在窗体中画一水平方向的长方形三维面板控件,按F4,在属性窗口中设置其NameP3dBevellnner2-RaisedFloodType1FloodshowPctTrue,再在窗体中画一个按纽Command1,双击该按纽,键入下面的代码:

 

 

 

Sub Command1_Click()

 

P3d.floodpercent=0

 

For N%=1 To 100

 

If N%>100 Then

 

Exit sub

 

End If

 

P3d.FloodPercent=N%

 

Next N%

 

End Sub

 

    F5,运行该程序,点击Command按纽,即可看到流动条效果。

 

 

 

利用VB的图片框实现屏幕的滚动

 

    对于学习使用VB来编程的电脑爱好者来说,可能会遇到这样一个问题:就是如何实现屏幕的滚动,因为当要显示的内容超出了屏幕的大小后,利用VB所提供的垂直滚动条和水平滚动条等控件是不可能直接实现这一特殊显示功能的。那么有没有其它的办法呢?答案是肯定的。我们知道VB的图片框是用来显示图形的,但它还有许多其它用途,比如可以用来创建一些动画图形等。其实对于上面的问题我们也可以利用图片框来巧妙地解决。方法如下:

 

    首先,单击工具框中的图片框(Picture Box)控件和命令按钮控件,在窗体(Form1)上建立图片框对象Picture1和命令按钮对象Command1,将命令按钮的Caption属性设置为"退出"Picture1的大小设置为显示区域的大小,再单击工具框中的图片框控件,在Picture1上建立另一个图片框对象Picture2,将它的LeftTop属性设置为0。用文本框,标签框等其它控件或导入一幅图象在Picture2上设定具体的显示内容,当然Picture2的大小一定要先调整到能全部容纳所有要显示的内容,最后单击工具框中的垂直滚动条控件和水平滚动条控件,在窗体(Form1)上分别建立垂直滚动条对象VScroll1和水平滚动条对象HScroll1,并设置好它们的属性。至此在窗体(Form1)上的所有设置工作就完成了,下面是具体的程序代码:

 

Private Sub VScroll1_Change()

 

Picture2.Top= -VScroll1.Value

 

End Sub

 

Private Sub Hscroll1_Change()

 

Picture2.Left= -HScroll1.Value

 

End Sub

 

Private Sub Command1_Click()

 

End

 

End Sub

 

    运行程序,当按下横、竖滚动条时,就能使显示内容实现左右、上下的滚动。此方法简单易行,有兴趣的朋友不妨试一试。

 

 

VB中阴影字体的实现

太原 胡建民

 

    Visual Basic确实是一种很不错的应用程序开发工具。笔者在使用中,也确实感到用VB设计程序,许多方法的实现是那么的简单。有时,仅仅需要几条语句,就可实现一种方法、效果或功能。下面就介绍一下,阴影字体在VB中的实现。程序如下:

 

Private Sub FormClick()

 

CurrentX700

 

CurrentY1000

 

FontSize30

 

ForeColorQBColor8

 

Print”Software Weekly”

 

CurrentX750

 

CurrentY1050

 

FontSize30

 

ForeColorQBColor12

 

Print”Software Weekly”

 

End Sub

 

    在属性(properties)窗口中设置:Auto3Dtrue Font选一种True Type字体。

 

    该程序是把代码加到FormClick事件中,通过先打印字体的阴影部分,再打印出字体,以实现阴影字体效果的。试运行该程序,单击窗体后,即呈现出阴影字体Software Weekly

 

 

 

 

VB中制作单独程序封面的两种方法

辽宁铁岭 金永涛

 

    这里所谓的单独封面,是只独立应用程序窗口本身的一个窗口,这个窗口在程序运行时首先弹出屏幕,用于装饰程序本身,或简单的演示一下程序的优越性。这样的封面在很多专业的WINDOWS程序中均存在,在VB中可有两种简单的方法实现这一功能。

 

 

第一种方法:多窗体编程方法

 

    此方法是通常采用的方法,即在程序中创建两个或两个以上的Form窗体,把其中的一个作为专门的程序封面制作场所,具体方法:

 

    1、创建一个新项目Form1,并在此窗体内安放Command1命令按钮,在Command1-Click()事件中输入结束程序代码“END”

 

    2、单击菜单的“Insert"项目,加入一个新窗体Form1

 

    3、双击Form1窗体空白处,在Form1-Load()事件中输入如下代码,用于隐藏主窗体Form1,置第二窗体为最大模式,并在运行程序首先显示和二窗体:

 

Private Sub Form-Load () ’隐藏主窗口

 

Form1.Visible = 0 ’窗口2最大模式

 

Form2.WindowState =2 ’显示窗口2

 

Form2.Show

 

End Sub

 

    4 在窗体Form2中定义全程变量:

 

Dim strr1 As String

 

Dim i As Integer

 

    5、在窗体Form2中放入一个时间控件Timer1

 

    6、在窗体Form2中的Form-Load ()事件中输入以下代码,用于在窗体2中显示图像,并置时间控件频率:

 

Private Sub Form-Load ()

 

Form2.Picture = LoadPicture("c:/windows/setup.bmp")

 

Timer1.Interval = 10

 

i =0

 

End Sub

 

    7、在时间控件Timer1- Timer1()事件中进行程序封面的制作工作,演示简单的动画,并控制此动画运行一段时间后自动停止,关闭程序封面,返回程序主窗口;下面的代码实现在一个图片上随机显示字符串,显示30次字符串后自动退出。

 

Private Sub Timer1-Timer ()

 

Strr1 = "程序封面演示“

 

With Form2

 

.Font.Transparent =True ’透明显示字符

 

.Font.Size = Rnd *30+10 ’随机变化字号

 

.Font.Italic =True ’斜体有效

 

.ForeColor=RGB(Rnd*256,Rnd*256,Rnd*256) ’随机变化前景

 

.FontName =Screen.Fonts (Rnd*7+14) ’随机变化字体

 

End With

 

hh=Form2.TextHehght (strr1) ’取字符串高度

 

ww= Form2.TextWidth (strr1) ’取字符串宽度

 

x=Rnd * ( Form2.ScaleWidth-ww) ’随机改变坐标

 

y=Rnd *( Form2.ScaleHeight-hh)

 

Form2.Current X=x

 

Form2.Current Y=y

 

Form2.Print strr1 ’显示字符

 

i = i +1 ’计数

 

If i >30 Then

 

Unload Me ’关闭封面

 

Form1.Show ’调入主窗口

 

Timer1.Enabled =False ’关闭时间控件

 

End If

 

End Sub

 

 

 

    8、为了能够人为地控制程序封面的停留时间,可在窗体Form2鼠标单击事件中安放退出封面代码:

 

Private Sub Form-Click ()

 

Unload Me

 

Form1.Show

 

Timer1.Enabled =False ’关闭时间控件

 

End If

 

End Sub

 

    至此工作全部完成,当运行程序时,首先弹出程序封面,封面上显示一幅·BMP图像,之后在此图像上进行随机字符串的显示,字符串的位置、字体、字号、前景色等值都是随机变化的,显示30次后自动关闭封面返回主窗口,演示过程中用鼠标单击窗口也会返回主窗口,在主窗口中按下结束按钮退出程序。具体操作时还有很多其它技巧,比如可以置第二个窗体为主窗体,这样运行时可自动先弹出程序封面,可省略隐藏窗体和调入窗体的过程,另外第二窗体也可以在程序运行时由代码动态生成,这样编程时复杂一些,但有利于程序代码的管理;程序封面的具体制作过程,有许多动态图像控制方法可以使用,只要灵活动用VB的作图方法,再加上一些必要的API函数的配合,会制作出理想的程序封面。

 

 

 

第二种方法:隐藏控件方法

 

    多窗口编程存在着一定的复杂性,需要对多个窗体的·Frm文件进行管理,编码时还需要频繁地在多个窗口间进行转换。实际上通过一个窗体也可以编制出类似的封面效果。基本原理就是在程序运行时首先通过VISIBLE属性隐藏全部控件,然后在主窗体内进行程序封面设计和演示,延时一定时间再恢复所有控件的显示,即达到了独立程序封面的制作过程。由于窗体内的控件很多,逐一隐藏或显示非常繁琐,可采用容器控件简化操作过程,即把控件全部放到Frame1等控件上,这样只要执行Frame1.Visible=0,即可使其上面的所有控件隐藏起来。

 

c由于程序只涉及一个窗体,程序设计的大部分工作只是编码过程,所以不再分步介绍。在窗体Form1中安放一个时间控件Timer1 和一个容器控件Frame1,再在Frame1上安放一个命令按钮Command1,具体程序设计时可把所有主程序工作控件放在Frame1上;之后把下面的代码填入相应的事件之中即可完成全部程序设计工作。运行此程序后首先在全屏幕窗体内显示图像,并从左上角开始逐渐放大字符串“程序封面演示”,放大过程中颜色发生平滑变化,形成美丽的拖尾效果,连续显示5次后自动关闭封面,返回主程序窗口,同样立即关闭程序封面,返回主程序窗口,单击主窗体中的命令按钮退出程序。

 

’定义全程变量

 

Dim i ,j As Integer

 

’退出程序按钮

 

Private Sub Command1-Click ()

 

End

 

End Sub

 

’单击窗体关闭封面

 

Private Sub Form-Click ()

 

Frame1.Visible =1 ’恢复容器控件

 

timer1.Enabled =False ’关闭时间控件

 

Form1.WindowState =0 ’恢复缺省窗口模式

 

End Sub

 

’准备工作

 

Private Sub Form -Load ()

 

Form1.WindowState =2 ’窗口最大化

 

Frame1.Width =Form1.Width ’调整容器控件尺寸

 

Frame1.Height =Form1.Height

 

Frame1.Top =0 ’调整容器控件位置

 

Frame1.Left =0

 

Frame1.Visible =0 ’隐藏容器控件

 

timer1.Interval =10 ’置时间频率

 

Form1.Picture =LoadPicture ("c:/windows/setup.bmp") ’装入图像

 

Form1.ScaleMode=3 ’置坐标刻度

 

Form1.FontName =“黑体”置字体名称

 

End Sub

 

’封面制作 (动画演示)

 

Private Sub timer1-Timer ()

 

Strr ="程序封面演示"

 

With Form1 ’透明显示

 

.Font.Transparent =True

 

.Font.Size = i + 1 ’放大字号

 

.Font.Italic =True ’斜体有效

 

.ForeColor=RGB(i*3,56,256-i*3) ’平滑变化颜色

 

End With

 

string =strr

 

Form1.Current X=i ’连续改变坐标

 

Form1.Current Y=i

 

Form1.Print stringg ’显示字符串

 

i = i +1

 

If i >72 Then ’放大到72号字

 

j =j +1 ’循环计数

 

i =0

 

Form1.Current X=72

 

Form1.Current Y=72

 

Form1.ForeColor =RGB(255,56,0) ’重新显示一次字符

 

Form1.Print stringg

 

End If

 

If j =5 Then ’动画计数

 

Frame1.Visible =1 ’显示容器控件

 

timer1.Enabled =False ’关闭时间控件

 

Form1.WindowState=0 ’恢复窗口模式

 

End If

 

End Sub

 

    以上方法及程序在WINDOWS 95系统下,在VB4.0环境下调试通过。

 

 

 

VB实现全屏幕图形界面及动态功能提示

王华 张晖 黄润发

 

 

一、 全屏幕图形界面设计

 

    图形界面是现代软件中人机交互的主要手段。为了追求界面的统一和美观,在软件开放过程中,图形界面大多采用全屏幕构图方式。这是通过将窗体的边框设置为无边框(BorderStyle=None),将窗体显示模式设置为极大化(WindowState=Maximized)来实现的。

 

    当一个窗体界面的设计中要容纳多张图片和多个控制时,将出现窗体显示速度明显变慢的现象,严重影响了程序运行的流畅性。为了解决这一问题,在开放过程中,采用了一种将【界面设计窗体】与【功能实现窗体】分开处理的方法。

 

    在【界面设计窗体】中,首先按功能的需要和界面设计的创意,将所需的大量图片和控制在屏幕上安排好,选择美观的字体、颜色、线型,对屏幕界面进行设计、修饰加工;然后在其全屏幕运行的状态下,利用剪贴技术,将这一设计完成的图形界面全屏幕复制到剪贴板上;接着将这一屏幕映象作为一张图片粘贴在【功能实现窗体】的背景上。这样,从外观上看,两个窗体的形状完全相同,而在屏幕的显示速度上,后者明显加快。这时,【功能实现窗体】中的控件已变成一个象征性的图标,对它的操作,可在控制图标的对应位置上设置一个Image 类型的图象框,通过对图象框的操作,来代替原先对控制对象的操作。

 

    采用这种方法,使窗体界面设计的灵活性大大增加,可以任意发挥,而不用担心控件、图片太多,影响窗体的显示速度。但采用这种方法,将不可避免地增加应用程序本身所占的存储容量,这是以容量换取速度必须付出的代价。

 

二、 动态功能提示信息的实现

 

    在现代软件设计中,多数功能图标、按钮都在界面上直接确定其对应的名称,同时也提供了动态提示的功能,即当鼠标移至某一控件时,或使鼠标的形状用一具有象征意义的图标代替,或自动出现一条文字提示,下面介绍一下如何实现这种先进的提示模式。

 

    动态改变鼠标的图形形状,是通过控件的MousePointer属性设置为13(自定义),然后在MouseIeon属性中选取一ICO图标文件来完成的;动态文字提示功能是利用控件的MouseMove事件来实现的:将功能提示处理程序设计在对应的MouseMove事件过程中,当鼠标移动到该控件范围区域时,即可触发程序执行,完成动态功能提示;为了防止处理程序反复触发,必须设置一控制开关,使处理程序只在鼠标第一次触发该控件区域时被执行;取消功能提示的处理程序设计在窗体的MouseMove事件中,说明程序如下:

 

Dim FirstTouch As Boolean '防止反复触发处理程序的控制变量

 

Private Sub ControlObject- MouseMove ()

 

If FirstTouch Then

 

FirstTouch =False '显示功能提示字符

 

End Sub

 

 

 

Private Sub Form- MouseMove ()

 

FirstTouch =True '取消功能提示字符

 

End Sub

 

 

 

Visual Basic窗体背景花纹的实现

 

    我们在开发软件过程中,为提高软件的商品化程度,感觉到界面的美观程度是一个软件能否获得成功的一个重要因素,我们仔细研究了一些成功的商品化软件,从这些软件上可以看到,程序窗口背景能显示出非常美丽的、富有立体感的花纹。而采用Visual Basic进行窗体设计,若只按照系统提供的功能,只能从有限的几种颜色中选择一种颜色或采用程序绘制一些简单的线条。而想实现立体感很强的纹理图案,一般只能采用窗体的PICTURE属性调用位图文件,使用这种方法实现有许多缺点 ,其一是窗体大小受位图大小的限制,调整起来麻烦,不具有通用性和灵活性;其二是浪费资源,因为花纹图案基本上是重复图案,采用与窗体同样大小的位图是一种浪费。

 

    下面介绍一种窗体背景花纹实现的方法。在窗体上建立一个网格控件,设定网格行不可见,去掉固定行和固定列,用程序实现网格控件与窗体同样大小,并随窗体大小的改变而改变。然后设计一个花纹图案,形成BMP位图文件(本文程序使用文件Pict1.bmp),或者从其它图象中截取一段图案,也可以利用Windows系统提供的图案(如c:/windows/Tiles.bmp),将其调入Picture控件。设定网格的每个单元与该图案大小相同,使单元的数量正好覆盖整个窗体背景,再将所有单元均显示该图案。通过子程序Backpict()实现以上过程,不论图案大小、窗体大小,程序都能自动调整网格控件大小和网格单元大小及单元数量。

 

    该程序在Visual Basic 5.0上调试成功。

 

    1.新建窗体Form1,属性如下:

 

    Caption =“背景花纹的实现”

 

    Borderstyle=3(无最大、最小化按钮)

 

    2.建网格控件Grid1,它的位置和大小将在程序中设置(与Form1同样大),属性为:

 

    Enabled = False(焦点不会落在网格控件Grid1上)

 

    Fillstyle=1(改变所有单元Text特性)

 

    Fixedcols=0(无固定行)

 

    Fixedrows=0(无固定列)

 

    Gridlines = False(网格行不可见),

 

    Visible = True

 

    3.建立图象控件Picture1,程序运行时将背景花纹基本图案放入其中,属性为

 

    Visible = False(不可见)

 

    Autosize = True(自动调整大小)

 

    4.控件中加入Sheridan 3D Controls,选取其中的三维命令按钮SSCommand,建立两个按钮

 

    SSCommand1.Caption=“退出”

 

    SSCommand2.Caption=“更换背景”(演示不同的背景图案)

 

    它们的属性Picture可调用与背景相同或不同的图案,如果使用普通的命令按钮控件Command也可,只是命令按钮无背景图案。

 

    5.建立背景图案形成子程序:

 

    Dim pictfile As String '位图文件名

 

    Dim FILEPATH As String '文件路径

 

    Sub Backpict(pictfile)

 

    picture1.ScaleMode = 3

 

    Form1.ScaleMode = 3

 

    picture1.Picture = LoadPicture(pictfile)

 

    '网格控件覆盖整个窗体背景

 

    grid1.Top = -1

 

    grid1.Left = -1

 

    grid1.Width = Width

 

    grid1.Height = Height

 

    grid1.Cols=Int(Form1.ScaleWidth/picture1.ScaleWidth) + 1

 

    grid1.Rows=Int(Form1.ScaleHeight/picture1.ScaleHeight) + 1

 

    '所有单元大小等于基本图案大小

 

    For i = 0 To grid1.Cols - 1

 

    For j = 0 To grid1.Rows - 1

 

    grid1.ColWidth(i) = picture1.ScaleWidth * 15

 

    grid1.RowHeight(j) = picture1.ScaleHeight * 15

 

    Next j

 

    Next I

 

 

    '选定所有单元

 

    grid1.SelStartCol = 0

 

    grid1.SelStartRow = 0

 

    grid1.SelEndCol = grid1.Cols - 1

 

    grid1.SelEndRow = grid1.Rows - 1

 

    grid1.Picture = Picture1.Picture

 

    End Sub

 

 

    6.窗体主程序

 

Private Sub Form_Load()

 

Private Sub Form_Load()

 

 

'得到运行程序路径名,路径名后带反斜杠

 

If Right(App.Path, 1) <> "/" Then

 

filePath = App.Path & "/"

 

Else

 

filePath = App.Path

 

End If

 

 

'窗体初始显示由Tiles.bmp基本图案组成的背景

 

pictfile = "c:/windows/Tiles.bmp"

 

backpict (pictfile)

 

End Sub

 

    7.退出程序命令按钮

 

Private Sub SSCommand1_Click()

 

End

 

End Sub

 

    8.演示不同的底纹图案

 

Private Sub SSCommand2_Click()

 

 

 

'两种背景图案交替演示

 

If pictfile = filePath & "Pict1.bmp" Then

 

pictfile = "c:/windows/Tiles.bmp"

 

Else

 

pictfile = filePath & "Pict1.bmp"

 

End If

 

Backpict (pictfile)

 

End Sub

 

 

VB编程的一些心得

 

 

    在大学作毕业设计的课题是编制一个教学软件,所以很自然地和VB这种易学、易懂、界面友好漂亮的语言打上了交道。在编写的过程中当然遇到了许多的问题,这里将一些简单的小程序写下来与喜爱编程的朋友们分享。

 

一、封面

 

    封面的设计是这样的,先出现一窗体,上面为你喜欢的图案。然后出现一艘从左向右行驶着的船。屏幕上方从两侧分别移动出“欢迎”两个字。

 

    具体的制作方法是:把预先选好的背景图案装入封面窗体中,窗体命名为CAI。再分别在三个图像控件(image)中装入预先制作好的位图“欢”、“迎”和船型图案。然后把三个image放置在初始位置( 图案刚在窗体出现时的位置),并把它们的可视属性都设置为“false”。程序如下:

 

 

Sub Form_load()

 

cai.Show ′显示封面窗体

 

Dim i ′定义变量

 

image3.visible=True ′船型图像控件出现

 

a1: If image3.Left < 6120 Then

 

6120为船移动到屏幕右边的坐标,此值可以随需要选取

 

image3.Move image3.Left50

 

′移动此图像控件如嫌移动慢,可改变移动值

 

Goto a1

 

End If

 

image1.visible=True ′“欢”字出现

 

a2: If image1.Left < 2120 Then

 

2120为“欢”字移动到屏幕中间的位置

 

image1.Move image1.Left50 ′移动此图像控件

 

Goto a2

 

End If

 

image2.visible=True ′“迎”字出现

 

a3: If image2.Left > 5420 Then

 

5420为“迎”字移动到屏幕中间的位置

 

image2.Move image2.Left50 ′移动此图像控件

 

Goto a3

 

End If

 

For i=1 To 10000

 

′使窗体暂停一段时间时间长短可通过改变循环次数实现

 

Next i

 

menul.Show ′显示程序主窗体

 

Unload cai ′卸载封面窗体

 

End Sub

 

 

二、简单的“动画”

 

    点击一3D按钮后,屏幕表现光线平行进入一玻璃管,在管中有一散射中心,有的光线射到此中心后反射到管的初始端。程序如下:

 

 

Sub Command3Dl_Click()

 

Dim i, j, k, m, n ′定义变量

 

For i=2080 To 5520

 

′显示出三条线,直到图像中的散射中心处,颜色为黑色

 

Line(2080,2760)(i,2760),RGB(0, 0, 0)

 

Line(2080,2860)(i,2860),RGB(0, 0, 0)

 

Line(2080,2660)(i,2660),RGB(0, 0, 0)

 

Next i

 

For j=5520 To 4800 Step1 ′反射光线第一次射到管壁上

 

Line(5520,2760)(j,2760(5520j).33333333),RGB

 

(255, 0, 0) ′反射光线,颜色为红色

 

Line(5520,2660)(5520(5520j),2660),RGB(0, 0, 0)

 

Line(5520,2860)(5520(5520j),2860),RGB(0, 0, 0)

 

′没有遇到散射中心的两条光线,为黑色,继续前进

 

Next j

 

For k=4800 To 3360 Step1 ′反射光线第二次射到管壁上

 

Line(4800,2520)(k,2520(4800k).33333333),

 

RGB(255, 0, 0) ′反射光线,颜色为红色

 

Line(6240,2660)(6240(4800k),2660),RGB(0,0,0)

 

Line(6240,2860)(6240(4800k),2860),RGB(0,0,0)

 

′没有遇到散射中心的两条光线,颜色为黑色

 

Next k

 

For m=3360 To 2080 Step1 ′反射光线第三次射到管壁上

 

Line(3360,3000)(m,3000(3360m).33333333),

 

RGB(255, 0, 0) ′反射光线,颜色为红色

 

Next m

 

End Sub

 

三、封底

 

    封底的设计是:先出现全黑的屏幕,然后从上至下逐渐拉出白底红字的“再见”的字样。先按要求在画板中做一个BMP图,上面写着“再见”。然后在一名为BYE的窗体中加入一个全屏大的Picturel, BMP图装入。程序如下:

 

Sub Form_Load()

 

Dim i ′定义变量

 

bye.Show ′封底出现

 

Unload menu1 ′卸载主菜单

 

al: If picture1.Height < 7130 Then 7130为图的高度

 

picturel.Height=picture1.Height50 ′下拉屏幕

 

GoTo al

 

End If

 

For i=1 To 20000 ′使窗体暂停一段时间

 

Next i

 

End ′结束所有操作

 

End Sub

 

 

 

处理过程时的鼠标显示

 

 

    为让你的程序更加专业一点,我们往往需要在程序处理过程时的鼠标形状显示为“沙漏”状态。我们一般的方法是在子程序的开始及结尾编程来改变鼠标形状,这样十分烦琐且容易忘记。我们还可以以下面的方法来实现这一目标:

 

    1、创建一个新类,命名为:CHourGlass

 

    2、在此类中加入以下代码:

 

      Private Sub Class_Initialize()

 

      Screen.MousePointer = vbHourglass

 

      End Sub

 

      Private Sub Class_Terminate()

 

      Screen.MousePointer = vbDefault

 

      End Sub

 

    3、在子程序的开始加入下面代码:

 

      Dim MyHourGlass As CHourGlass

 

      Set MyHourGlass = New CHourGlass

 

 

 

 

       0

>>上篇文章:VB编程技巧几例

 

 

>>下篇文章:VB实现全屏幕图形界面及动态功能提示

 

 

 

 

『关闭窗口』

************************************************************************

文章浏览时的广告

文章浏览广告

VB应用程序访问SQL Server方法探讨 

现在加入 http://14.66.102.214 

VB应用程序访问SQL Server方法探讨

 

摘要

本文讨论了Visual Basic应用程序访问SQL Server数据的几中常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法的性能和优缺点。

 

引言

 

Microsoft Visual Basic(简称VB)作为一种面向对象的可视化编程工具,具有简单易学的,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集。因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端。与后端的Microsoft SQL Server相结合,VB能够提供一个鲁棒的、高性能的客户机—服务器方案。

 

使用Visual Basic作为前端开发语言,与SQL Server接口有三种常用的方法,即:

 

*数据访问对象/Jet

 

*ODBC API编程

 

*使用SQL ServerVisual Basic(VBSQL)DBAPI编程

 

本文将讨论这三种VB应用程序管理SQL Server数据的方法,并比较每种方法的性能和优缺点。

 

方法1. 数据访问对象/JetVisual Basic支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机椃衿髦涞亩曰胺绞剑酚行矶嘤诺恪J褂?/FONT>DAOs访问SQL Server的过程如下:应用程序准备好语句并送至JetJet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通地调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。

 

下面是一个用DAOs访问SQL ServerVB实例。

 

'Form Declarations

 

Dim mydb As Database

 

Dim mydynaset As Dynaset

 

Private Sub Form_Load()

 

Set mydb=OpenDatabase("",Fa|se,Fa|se,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es")

 

Set mydynaset=mydb CreateDynaset("Select*from Customers")

 

End Sub

 

上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。

 

方法2.ODBC API编程

 

ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器反过来通来驱动器(SQLSRVR.DLL)把它们送到服务器中。

 

ODBC API编程,一般要用到以下一些函数。下面列出了常用的函数以及它们的功能。

 

下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。

 

Global giHEnv As Long

 

Global giHDB As Long

 

Global giHStmt As Long

 

Dim myResult As integer

 

Dim myConnection As Srting

 

Dim myBuff As String*256

 

Dim myBufflen As Integer

 

If SQLA||ocEnv(giHEnv)<>SQL_SUCCESS Then

 

MsgBox"A||ocation couldn't happen!"

 

End if

 

if SQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then

 

MsgBox "SQL Server couldn't connect!"

 

End if

 

myConnection="DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales"

 

myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),

 

myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)

 

myResult=SQLA||ocStmt(giHDS,giHStmt)

 

myResult=SQLFreeStmt(giHStmt,SQL_COLSE)

 

rsSQL="Select*from Customers Where City="Wuhan""

 

myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))

 

方法3.使用VBSQLDBAPI编程

 

DB库是SQL Server的本地APISQL ServerVisual Basic(VBSQL)Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:

 

VBSQL.VBX 包含库函数,具有访问重要的消息和处理错误的能力

 

VBSQL.BI 包括所有的常量和变量说明

 

VBSQL.HLP Windows帮助文件,使用VBSQL的指南

 

使用VBSQL时,必需将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBSQL.VBX文件。 一个典型的VBSQL对话中,一般要用到以下这些函数。

 

<div align="center"><center><table border="0" width="100%">

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; 函数&nbsp;&nbsp;&nbsp; </td>

 

<td><p ALIGN="JUSTIFY">功能 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLALLocEnv </td>

 

<td><p ALIGN="JUSTIFY">初始化ODBC环境,返回环境句柄 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLALLocConnect </td>

 

<td><p ALIGN="JUSTIFY">为连接句柄分配内存并返回连接句柄 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLConnect </td>

 

<td><p ALIGN="JUSTIFY">连接一个SQL数据资源 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLDriverConnect </td>

 

<td><p ALIGN="JUSTIFY">连接一个SQL数据资源,允许驱动器向用户询问信息</td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLALLocStmt </td>

 

<td><p ALIGN="JUSTIFY">为语句句柄分配内存并返回语句句柄 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLExecDirect </td>

 

<td><p ALIGN="JUSTIFY">SQL语句送到服务器 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLFetchAdvances </td>

 

<td><p ALIGN="JUSTIFY">到结果集的下一行(或第一行) </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLGetData </td>

 

<td><p ALIGN="JUSTIFY">从结果集的特定的一列取回数据 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLFreeStmt </td>

 

<td><p ALIGN="JUSTIFY">释放与语句句柄相关的资源 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLDisconnect </td>

 

<td><p ALIGN="JUSTIFY">切断连接 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLFreeConnect </td>

 

<td><p ALIGN="JUSTIFY">释放与连接句柄相关的资源 </td>

 

</tr>

 

<tr>

 

<td><p ALIGN="JUSTIFY">&nbsp;&nbsp;&nbsp; SQLFreeEnv </td>

 

<td><p ALIGN="JUSTIFY">释放与环境句柄相关的资源 </td>

 

</tr>

 

</table>

 

</center></div>

 

一般的DBAPI编程的过程是这样的:先通过调用SqlInitDB库进行初始化,再调用SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。

 

Private Sub InitializeApplication()

 

DBLIB-VERSION=SqlInit()

 

If DBLIB_VERSION=""Then

 

MsgBox"Could not initialize DBLIB!Exit application.", MB_ICONEXCLAMATION

 

End

 

End if

 

End Sub

 

Private Function LoginToServer() As integer

 

loginToServer=SUCCEED

 

Status%=SqlSetloginTime%(loginTimeOut)

 

If giSqlConn<>0 Then

 

SqlClose(giSqlConn) '关闭已打开的连接

 

giSqlConn=SqlOpenConnection(gsServerName,gsLoginID,gsPassword,ProgramName, ProgramName)

 

If giSqlConn<>o Then

 

liresult=SqlUse(giSqlConn,"Sales")

 

Else

 

LogintoServer=FAIL

 

End If

 

End Function

 

性能比较

 

以上三种访问SQL Server的方法各有各的特点。DAOs方法是基于对象的,因而便于使用,但是它从Visual BasicSQL Server的最慢的方式。ODBC APIVBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的互操作性,编程简单,但速度慢于VBSQL方法。VBSQL方法通过VBSQL控件,提供了重要的SQL Server前端应用程序所需的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计算列等。这些都是VBSQL方法超出其它方法的优势,但其编程稍复杂。至于实际使用哪一种接口方式,在很大程度上依赖于用户的应用程序的具体情况而定。

 **********************************************************************文章浏览广告

VB编程的一些心得 

现在加入 http://14.66.102.214 

在大学作毕业设计的课题是编制一个教学软件, 所以很自然地和

VB这种易学、易懂、界面友好漂亮的语言打上了交道。 在编写的

过程中当然遇到了许多的问题, 这里将一些简单的小程序写下来

与喜爱编程的朋友们分享。

一、封面

封面的设计是这样的,先出现一窗体,上面为你喜欢的图案。

后出现一艘从左向右行驶着的船。 屏幕上方从两侧分别移动出“

欢迎”两个字。

具体的制作方法是:把预先选好的背景图案装入封面窗体中,

体命名为CAI。再分别在三个图像控件(image) 中装入预先制作好

的位图“欢”、“迎”和船型图案。然后把三个image放置在初始

位置( 图案刚在窗体出现时的位置),并把它们的可视属性都设

置为“false”。程序如下:

Sub Form_load()

cai.Show  '显示封面窗体

Dim i  '定义变量

image3.visible=True '船型图像控件出现

a1: If image3.Left <6120 Then '6120为船移动到屏幕右边的坐标,此值可以随需要选取 image3.Move image3.Left50 '移动此图像控件如嫌移动慢,可改变移动值 Goto a1 End If image1.visible="True" '“欢”字出现 a2: If image1.Left < 2120 Then '2120为“欢”字移动到屏幕中间的位置 image1.Move image1.Lefe50 '移动此图像控件 Goto a2 End If image2.visible="True" '“迎”字出现 a3: If image2.Left> 5420 Then

'5420为“迎”字移动到屏幕中间的位置

image2.Move image2.Left50 '移动此图像控件

Goto a3

End If

For i=1 To 10000 

'使窗体暂停一段时间时间长短可通过改变循环次数实现

Next i

menul.Show  '显示程序主窗体

Unload cai  '卸载封面窗体

End Sub

二、简单的“动画”

点击一3D按钮后,屏幕表现光线平行进入一玻璃管, 在管中有一

散射中心,有的光线射到此中心后反射到管的初始端。程序如下:

Sub Command3Dl_Click()

Dim i, j, k, m, n  '定义变量

For i=2080 To 5520    

'显示出三条线,直到图像中的散射中心处,颜色为黑色

Line (2080,2760)(i,2760),RGB(0, 0, 0)

Line (2080,2860)(i,2860),RGB(0, 0, 0)

Line (2080,2660)(i,2660),RGB(0, 0, 0)

Next i

For j=5520 To 4800 Step1 '反射光线第一次射到管壁上

Line (5520,2760)(j,2760(5520j)*.33333333),RGB

(255, 0, 0) '反射光线,颜色为红色

Line (5520,2660)(5520(5520j),2660),RGB(0, 0, 0)

Line (5520,2860)(5520(5520j),2860),RGB(0, 0, 0)             

'没有遇到散射中心的两条光线,为黑色,继续前进

Next j

For k=4800 To 3360 Step1 '反射光线第二次射到管壁上

Line (4800,2520)(k,2520(4800k)*.33333333),

RGB(255, 0, 0)    '反射光线,颜色为红色

Line (6240,2660)(6240(4800k),2660),RGB(0, 0, 0)

Line (6240,2860)(6240(4800k),2860),RGB(0, 0, 0)

  '没有遇到散射中心的两条光线,颜色为黑色

Next k

For m=3360 To 2080 Step1 '反射光线第三次射到管壁上

Line (3360,3000)(m,3000(3360m)*.33333333),

RGB(255, 0, 0)          '反射光线,颜色为红色

Next m

End Sub

三、封底

封底的设计是:先出现全黑的屏幕, 然后从上至下逐渐拉出白底

红字的“再见”的字样。先按要求在画板中做一个BMP图,上面写

着“再见”。  然后在一名为  BYE 的窗体中加入一个全屏大的

Picturel,BMP图装入。程序如下:

Sub Form_Load()

Dim i  '定义变量

bye.Show  '封底出现

Unload menu1  '卸载主菜单

al: If picture1.Height <7130 Then '7130为图的高度 picturel.Height="picture1.Height50" '下拉屏幕 GoTo al End If For i="1" To 20000 '使窗体暂停一段时间 Next i End '结束所有操作 End Sub

文章浏览广告

Visual Basic调用Windows API函数的应用举例  

现在加入 http://14.66.102.214 

要】

       Visual Basic Windows API 法,

       API 如:VB 取, 测。

 

       字】

       Windows Microsoft( ) 统。

       Visual Basic(VB) Microsoft( ) 具。

       API(Application Program Interface) 口。

       件( 如:DEMO.INI

 

      

 

一、 VB API 法。

 

       (1) Declare API 数, 值, Sub 程; 值, Function 数。

 

       注: API ./VB/WINAPI/WIN31API.HLP 中, Copy Paste 方。

 

       (2) API 后, VB 样。 意, 对, 机。

 

二、 VB 取。

 

       Windows .INI 的, INI 数, 中; 退 INI 中。Windows API GetPrivateProfileString WritePrivateProfileString 能。

 

       明:

       1 GetPrivateProfileString 明:Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

 

       能: INI 数( 性) lpReturnedString 中。

 

      

      

      

       lpApplicationName

       String

      

       lpKeyName

       String

      

       lpDefault

       String

      

       lpReturnedString

       String

       nSize

       nSized

       Integer

       lpReturnedString

       lpFileName

       String

      

      

       Integer

       lpReturnedString

 

       2WritePrivateProfileString

       明:Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

 

       能: 数( 串)。

       值: 功, TRUE FALSE

 

三、 VB

 

       API GetWindowsDirectoryGetWinFlags,GetVersionGetSystemDirectory, 等, 使 例。

 

四、

 

       DEMO.PRJ

 

       一) DEMO.PRJ DEMO.BAS. DEMO.BAS 中。

 

       Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

 

       Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

 

       Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

       Declare Function GetKeyboardType Lib "user32" (ByVal nTypeFlag As Long) As Long

       Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

       Declare Function GetVersion Lib "kernel32" () As Long

       Declare Function GetWinflags Lib "kernel32" () As Long

 

       注:

 

GetWindowsDirectory Windows 径。

 

GetSystemDirectory Windows 径。

 

GetVersion Windows DOS 号。 Windows 号, Windows 号, DOS 号, DOS 号。

       4 GetWinflags: Windows 置。

 

      

      

       WF_80X87

       Intel

       WF_CPU386

       80386 CPU

       WF_CPU486

       80486 CPU

       WF_ENHANCED

       Windows 386

       WF_PMODE

       Windows

       WF_STANDARD

       Windows

       WF_WLO

       OS/2

 

       5GetKeyboardType(): 型,nTypeFlag=0 型。

      

      

       1

       IBM PC/XT

       2

       Olivetti "ICO" 盘(102 键)

       3

       IBM 盘(84 键)

       4

       IBM 盘(101 102 键)

       5

       Nokia 1050

       6

       Nokia 9140

       7

      

 

       6 API 便, 数。 中。

 

 

Function SysDir()

Temp = Space$(255)

StringLen = GetSystemDirectory(Temp, 255)

SysDir = Left$(Temp, StringLen)

End Function

___________________________________________________________________________

Function WinDir() As String

Temp = Space$(255)

StringLen = GetWindowsDirectory(Temp, 255)

WinDir = Left$(Temp, StringLen)

End Function

___________________________________________________________________________

Function KeyType()

KbType = GetKeyboardType(0)

Select Case KbType

       Case 1

       KeyType="IBM PC/XT,or compatible(83key)"

       Case 2

       KeyType="Olivetti 'ICO'(102key)"

       Case 3

       KeyType="IBM AT,or similar(84key)"

       Case 4

       KeyType = "IBM Enhance (101 or 102 keys)"

       Case 5

       KeyType = "Nokia 1050 or similar"

       Case 6

       KeyType = "Nokia 1050 or similar"

       Case 6

       KeyType = "Nokia 9140 or similar"

       Case 7

       KeyType = "Japan Keyboard"

       End Select

End Function

___________________________________________________________________________

Function Initial()

Form1.Left = Val(StringFormINI("Form", "left", "0 ", "c:/windows/demo.ini"))

Form1.Top = Val(StringFormINI("Form", "top", "0 ","c:/windows/demo.ini" ))

Form1.WindowState = Val(StringFormINI("Form", "windowstate", "0 ","

c:/windows/demo.ini"))

End Function

_______________________________________________________________________

Function SaveInfor()

x = WritePrivateProfileString("Form", "left", Str$(Form1.Left),

   "c:/windows/demo.ini")

x = WritePrivateProfileString("Form", "top", Str$(Form1.Top),

   "c:/windows/demo.ini")

x = WritePrivateProfileString("Form", "windowstate", Str$

   (Form1.WindowState), "c:/windows/demo.ini")

End Function

___________________________________________________________________________

Function StringFormINI(SectionName As String, KeyName As String,

Default As String, FileName As String) As String

MaxStringLen% = 255

returnedstr$ = Space$(MaxStringLen%)

Result% = GetPrivateProfileString(SectionName, KeyName,

Default, returnedstr$, MaxStringLen%, FileName)

returnedstr$ = LTrim$(RTrim$(returnedstr$))

returnedstr$ = Left$(returnedstr$, Len(returnedstr$) - 1)

StringFormINI = returnedstr$

End Function

__________________________________________________________________________

Function WinVer()

ver& = GetVersion()

winhigh = ver& Mod 256

winlow = Int(ver& / 256) Mod 256

WinVer = ((winhigh * 100) + winlow) / 100

End Function

___________________________________________________________________________

 

Function DosVer()

ver& = GetVersion()

Temp = ver& / 65536

doshigh = Int(Temp / 256) Mod 256

doslow = Temp Mod 256

DosVer = ((doshigh * 100) + doslow) / 100

End Function

___________________________________________________________________________

Function CPU()

Flags&=GetWinFlags()

Match=1

Select Case Match

       Case (Flags& And &H8)/&H8

 

            CPU=486

       Case (Flags& And &H4)/&H4

 

            CPU=386

End Select

End Function

___________________________________________________________________________

Function Mode()

Flags&=GetWinFlags()

If flags& And &H20 Then

   Mode="Enhanced"

Else

   Mode="Standard"

End If

End Function

 

二) Form1.frm

Form1.Caption="System Information"

Sub Form_Paint()

Cls

Print

Print , "System Information"

Print

Print , "WindowsDir: ", WinDir()

Print , "SystemDir: ", SysDir()

Print , "WindowsVersion: ", WinVer()

Print , "DosVersion:  ", DosVer()

Print , "KeyboardType: ", KeyType()

End Sub

Sub Form_Load()

x = Initial()

 

End Sub

Sub Form_Unload(Cancel As Integer)

x = SaveInfor()

End Sub

 

 

       三) 序。( 486 Windows3.1 过)

       息, 退 左、 DEMO.INI 中, 时, 退 态。

       注: DEMO.INI

 

 

    [Form]

    Left=100

    Top=100

    Windowstate=0

 

 

       Windows 下。

       API 使 法, 用。 API 数, 力。

  *******************************************************************8

文章浏览广告

第七章(2)★输出(2 

现在加入 http://14.66.102.214 

很久没有继续VB教程了,也有很多初学VB的朋友来信留言要求继续,说起来惭愧,不是有时候犯懒,就是杂物缠身,今天好不容易做在电脑前想敲几个字,哪知打开VB5出现非法操作,卸载后重新安装非法提示依然出现,真是岂有此理!Windows系统用了很久了,看来冲突实在是太多,但这么久没有更新,实在说不过去,这次就算是一次纸上谈兵,带来不便之处还请大家包涵。

 

上次为大家讲解了MsgBox的用法,这次我来讲讲其他的输出方法。

 

在程序中我们如果想输出执行的结果最经常要用到什么对象,你可能会告诉我是文本框或标签控件,但事实往往不是这样,因为它们的显示方法单调,不能把各种字体的文字、图形结合在一起,因此最符合要求的控件应该是图片框(PictureBox),或直接就在Form本身上显示,其中要用到一个很重要的方法:“Print”,它的用法是:

 

对象.Print Spc(n)/Tab(n);字符串表达式;……

 

其中Spc(),表示打印字符之间的空格,n表示空格数目,Tab()表示绝对列数,n表示列数,也就是说你可以指定在那一列上打印,它们用“;”和字符串表达式分开,但也可以是这样:

 

对象.Print 字符串表达式1,字符串表达式2,……

 

用“,”隔开字符串,这样系统就会按默认的(14列)为一个输出位。每使用一次Print方法,程序就会在指定的对象上打印一行,在用Print则在下一行打印,当对象是窗体时,对象可以省略,例如打印一个表格:

 

(注意:要把使用Print的对象的Autoredraw属性设为True,我们知道,当有多个窗口层叠时,哪个窗口得到焦点就会显示到最上面,当它显示时就是一种重绘的过程,Windows系统需要重新计算原来它的图形界面,这是一个非常复杂的过程,不过在VB中只需用一个Autoredraw属性就可以做到了,不信的话可以保持该属性为False,看看会怎样?)

 

Private Sub Form_Load()

 

Print '空一行

 

FontUnderline = True

 

FontSize = 18

 

FontBold = True

 

Print , "中国VB联盟成员列表"

 

Print

 

FontUnderline = False

 

FontSize = 10

 

Print Tab(3); "姓名"; Tab(15); "年龄"; Tab(25); "性别"; Tab(35); "个人简介"

 

FontBold = False

 

Print Tab(3); "Mars"; Tab(15); "21"; Tab(25); ""; Tab(35); "……"

 

……………

 

……………

 

End Sub

 

更多的内容我将在下一章的用VB作图中向你说明。

 

 

 

当然,在平时用文本框或标签控件显示输出结果也是一种简单的方法,这些和我们以前讲到的大同小异,也就不再进行过多的介绍了,下面我来讲讲对字符串的格式化方法。

 

这里要用到Format()函数,它可以对字符串按照指定的形式输出,也可以用做数字、日期的格式化,方法是:

 

Format (表达式,[格式化表达式])

 

其中格式化的表达式可以为:“0”,“#”,“.”,“,”,“:”,“$”,以及“()+-E+E-”等等表示,下面我将举一个小例子说明Format的所有功能(奇迹!奇迹!这时在打开VB5居然非法操作消失了!):

 

请先建立一个项目文件,在Form1上添加两个框架控件(Frame)和若干按钮、文本框、无线钮和标签控件,具体如图所示:(图7-2-1):

 

 

 

其中有两排八个按钮为Command1Index07,又有七个无线钮Option1Index07,下面为了能够使用,请为它们修改Caption属性,如图7-2-2

 

 

 

然后加入如下代码:

 

Dim FormatExp As String

 

Dim ThisTime As Date

 

Private Sub Command1_Click(Index As Integer)

 

FormatExp = FormatExp + Command1(Index).Caption

 

Text1.Text = FormatExp

 

End Sub

 

 

 

Private Sub Command2_Click()

 

a$ = Format("1234567890.0987654321", FormatExp)

 

Label1.Caption = "格式化后的数值:" + a$

 

Text1.Text = ""

 

FormatExp = ""

 

End Sub

 

 

 

Private Sub Form_Load()

 

ThisTime = Now

 

Label2.Caption = ThisTime

 

End Sub

 

 

 

Private Sub Option1_Click(Index As Integer)

 

Text2.Text = Format(ThisTime, Option1(Index).Caption)

 

End Sub

 

其中0#代表数值显示的位数,不同的是如果定义格式化表达式的位数如果多于原表达式,则使用0则补0,使用#则省略0;“.”用来指定小数点的位置;其余字符用来分割数值,如“,”

 

结果如下图:7-2-3

 

 

 

关于时间的格式化表达式的定义方法如下表:

 

格式符

含义

 

d

显示不带0的日期(131

 

dd

显示带0的日期(0131

 

ddd

SunSat格式显示日期

 

dddd

SundaySaturday格式显示日期

 

ddddd

以年月日标准格式显示日期

 

/分钟

m

显示不带0的月,如果后面紧跟hhh则显示不带0的分

 

mm

显示带0的月,如果后面紧跟hhh则显示带0的分

 

mmm

JanDec显示月份

 

mmmm

January-December显示月份

 

yy

以两位数显示年(0099

 

yyy

以四位数显示年(19002040

 

 

好吧,第七章的内容就讲完了,在第八章中我将把VB的简单绘图知识教给大家,下次再见!

 *************************************************************88

文章浏览广告

第七章★输出 

现在加入 http://14.66.102.214 

上一章里,我们讨论的VB的输人机制,这次我们来集中讨论VB中信息的输出。

 

输入和输出是不可分割的,人们输入的最终目的是希望计算机作出反应,任何一个程序都不可能避开这个问题,所以就算要完成一个最基本的程序,也要有输出的部分,复杂的程序更是如此。

 

在输入的一章里,我们学习的第一个输入方法是InputBox,相应的在输出中我们第一个要接触的是MsgBoxMessage Box),和InputBox相似,MsgBox也是简化了的窗体,可以以函数的形式返回操作。它的基本语法是:

 

MsgBox "显示内容",按钮值,"标题"

 

通过这个函数可以产生一个标准的Windows消息框,象我们平时经常接触的“Yes/No”、“OK/Cancel”,“Retry/Abort/Ignore”等等,这些都是在按钮值中设定的,按钮值如下:

 

数值

含义

 

0

OK

 

1

OKCancel

 

2

AbortRetryIgnore

 

3

YesNoCancel

 

4

YesNo

 

5

RetryCancel

 

 

 

 

并且不同的消息可以搭配不同的图标,比如帮助文件用问号,一般提示用一个圈里一个I等等,它们也是按钮值的一部分:

 

数值

含义

 

16

表示危险

 

32

表示问号

 

48

表示警告

 

64

表示信息

 

 

 

 

但是如何既显示按钮也显示相应的图标呢,请看一会儿下面的例子。前面说过,MsgBox是函数,那么它就会有返回值,当你按下某个按钮就会返回一个数值,以便对用户不同动作的捕捉,返回值如下:

 

数值

含义

 

1

OK

 

2

Cancel

 

3

Abort

 

4

Retry

 

5

Ignore

 

6

Yes

 

7

No

 

 

 

 

说了这么多,可能你已经不知所措了,不过看过下面的例子后,相信一切都会迎刃而解。

 

 

 

首先建立一个新项目文件,并添加以下对象(见图71)――一个ButtonCommand1),两个ComboBoxCombo1Combo2),不要对其属性做更多的修改,只需把Command1Caption改为“Click Me”。这个程序的目的是自由组合上面的按钮值,以显示各种消息框,并且返回按下的按钮,Combo1Combo2分别用来选择按钮值,首先在Form_Load中初始化程序:

 

Private Sub Form_Load()

 

Combo1.AddItem "OK"

 

Combo1.AddItem "OK and Cancel"

 

Combo1.AddItem "Abort,Retry and Ignore"

 

Combo1.AddItem "Yes,No,Cancel"

 

Combo1.AddItem "Yes,No"

 

Combo1.AddItem "Retry,Cancel"

 

Combo1.ListIndex = 0

 

Combo2.AddItem "危险"

 

Combo2.AddItem "询问"

 

Combo2.AddItem "警告"

 

Combo2.AddItem "信息"

 

Combo2.ListIndex = 0

 

End Sub

 

ComboBox的用法已经在上一章中讨论过,在此不再赘述,ListIndex属性用来把第一个元素放在选择位置。

 

但是如何显示需要的按钮和图标呢?很简单,只需把它们相加,比如说要显示OKCancel按钮和警告的图标,只需把148相加,得到49即可,于是我们在Command1中填写这样一行:

 

Private Sub Command1_Click()

 

message = MsgBox("显示" & Combo1.List(Combo1.ListIndex) & "" & Combo2.List(Combo2.ListIndex), Combo1.ListIndex + (Combo2.ListIndex + 1) * 16, "消息演示")

 

End Sub

 

因为图标值是从16开始的所以要把Combo2ListIndex1再乘以16

 

小知识:按钮值并非简单的相加

 

按钮值并非简单的相加,我们知道,在计算机里最终的语言是机器语言,而机器语言是以01的二进制表示的,在这里用到的实际上不是相加,而是逻辑操作符“OR”,你知道ORAND是怎样工作的吗?正如你所知,True And False得到False,而True Or False得到True,这是怎么形成的呢?我们有时也用0代表False,用1或-1代表True(其实,只要非零都可以代表True),而01在二进制中还是本身,于是TrueFalse的运算就变成的0 1的运算,我们可以把And叫做补0运算,把Or叫做补1运算,当用And处理两个二进制数的时候,它们逐位比较,如果相同的位上都是0或都是1则没有变化,而如果一位上是0,另一位上是1,最后结果上相应的位上就变成0。比如1010(十进制中10And 1101(十进制中13),最后就得1000(十进制中8),相同的Or亦是如此,只不过在不同的地方补1。在位数不同时,前面补0,你可以在VB中试试看。但为什么要讲这些呢,原因是我不想让大家真的以为这个例子中就是相加,只不过碰巧它们的01处在不同的位置上,并且这个小知识在今后的位图操作和API操作中很有用处。

 

下面在来判断用户按下的按钮。

 

Private Sub Command1_Click()

 

message = MsgBox("显示" & Combo1.List(Combo1.ListIndex) & "" & Combo2.List(Combo2.ListIndex), Combo1.ListIndex + (Combo2.ListIndex + 1) * 16, "消息演示")

 

Select Case message

 

Case 1

 

MsgBox "你按下了OK"

 

Case 2

 

MsgBox "你按下了Cancel按钮"

 

Case 3

 

MsgBox "你按下了Abort按钮"

 

Case 4

 

MsgBox "你按下了Retry按钮"

 

Case 5

 

MsgBox "你按下了Ignore按钮"

 

Case 6

 

MsgBox "你按下了Yes按钮"

 

Case 7

 

MsgBox "你按下了No按钮"

 

End Select

 

End Sub

 

运行程序,结果如图7273

 

 

 

 

第七章未完待续

 

 

 

由于时间仓促,这次就只能写这么多了,请大家多多原谅。--Mars

 *******************************************************8

文章浏览广告

第六章(3)★输入(3 

现在加入 http://14.66.102.214 

首先,我想先对第六章的拖拖拉拉表示歉意,一是因为它实在太长了,二也是因为我自己太懒了,今天写几个字,明天添两笔,以致于写了三次才将它真正完成,还请大家原谅。

 

好,废话少说,让我们赶快切入正题。上次我们讨论了无线钮和检查框的使用方法,相信你已经熟悉,因为它们实在太简单了,现在让我们继续“输入”的最后几个部分。

 

滚动条(ScrollBar)在视窗中也是一个不可缺少的部分,由于面积所限,我们不得把屏幕上的内容滚来滚去,以显示大量的内容,这就是我们经常要用到的滚动条。但滚动条除去滚动窗口,还有一个很重要的作用――输入,想想你经常用到的一些家用电器上调节声音或别的什么东西的滑块,你把它滑向大的一方音量就会增大,而你把它滑向小的一方音量就会减小,或者一个控制左右两个音箱的均衡器,当滑块在正中央的时候,两个音箱的音量是相同的,当你把滑块偏向一方时,音箱的音量有了大小之分,在Windows操作中,我们也经常要用到类似的效果。

 

VB中提供了两个常规的滚动条控件――VscrollHscroll,分别代表垂直的和水平的滚动条,它们只不过是方向不同而已,而它们的属性,以及会发生的事件都是相同的。,滚动条有几个特殊的属性:

 

Value属性,当滑块挪动后停在某一位置时,就改变了滚动条的Value属性。

 

MaxMin属性,用来设置滚动条的最大值和最小值,譬如把Max设为100,把Min设为0时,滚动条的Value就在0100之间移动,当MaxMin倒置时,滚动条的方向也会相反,也就是说,当Max<Min时,原来Value增加的方向就会变成相反的方向。MaxMin也可设为负值。

 

SmallChangeLargeChange属性,当鼠标在滚动条两头的箭头上单击时,就会把滚动条向相应的方向挪动一点,这时用到的就是SmallChange属性,当你把它设为1时,每点一下,滚动条的Value就改变1;当鼠标在滚动条上点击时,用到的就是LargeChange,当设为10时,每点击一下滚动条,Value就改变10

 

下面我们看一个实例。

 

大家都知道,物体之所以会有颜色是因为物体表面的材料吸收了太阳光中的部分色光,而还有部分色光没被吸收而被反射回来,它就成了我们看到的颜色,黑色就是物体吸收了所有的太阳光的所有色光,没有反射颜色,所以在我们看来是黑的,而当物体反射了所有的色光,我们看到的就是白色。在计算机中,颜色的表示就是象我们刚才描述的样子,它把颜色分为红(R)、绿(G)和蓝(B)。众所周知,计算机的机器语言是使用二进制表示的,为了方便查阅我们看到的往往是十六进制代码,一个字节包括两位十六进制数字,从0255(十六进制表示0FF),而一个字节是由八位二进制数值表示(2^828次方),计算机中用分别用一个字节,也就是八位表示一种颜色,和在一起也就是三个字节(24位)表示所有的颜色,这就是我们平时常说的24位真彩,它一共可以组成256×256×2562^24)种颜色,对于我们的肉眼,是根本分辨不出来相邻两个不同的颜色的,比如用FFFFFF表示白色,就好象我们刚才说的物体反射了所有的色光,相反的可以用000000表示黑色,它吸收了所有的色光,还可以用FF0000表示红色,在HTML语言中就是这样表示颜色的。

 

小知识:现在你可以根据你的显卡的显存来计算一下显卡在24位真彩下可以以多大的分辨率显示,计算是这样的,用显存的字节数÷324位色)=显示器宽的象素数×显示器高的象素数,宽的象素数:高的象素数=43,比如4兆显存,就应该是4×1024×1024÷31365×1024

 

 

 

在下面的小程序中,我们通过三个滚动条分别代表RGB,滚动滚动条,将在右边的图片框中显示相应的颜色,并且在下面的文本框中显示颜色的十六进制数值。

 

现在,新建一个项目文件,在Form1中如图612布局控件,各控件属性如下表:

 

 

 

HsrollBar

Name Hscroll1

 

Index 012

 

(共同属性)

 

Max 255

 

Min 0

 

LargeChange 10

 

SmallChange 1

 

Label

Name Label1

 

Index 012

 

Index 0 Caption “红:”

 

Index 1 Caption “绿:”

 

Index 2 Caption “蓝:”

 

Label

Name Label2

 

Caption “颜色值”

 

TextBox

Name Text1

 

Text “”

 

PictureBox

Name Picuture1

 

 

 

 

为了把十进制数值换成十六进制数值,要使用一个叫做Hex()的函数,它把十进制数值转化为十六进制的字符,但对于只有一位的十六进制字符,这个函数并不在高位补零,为了视觉上的正确,我设计了一个小函数帮助它给一位的十六进制字符补零.

 

程序代码很简单,见下:

 

Dim RedStr, GreenStr, BlueStr As String’RGB的字符

Dim RedNum, GreenNum, BlueNum As Integer’RGB的数值

 

 

 

Function GetColorValue() As String

 

‘获得输入值

RedNum = HScroll1(0).Value

GreenNum = HScroll1(1).Value

BlueNum = HScroll1(2).Value

 

RedStr = Hex(RedNum)

If Len(RedStr) < 2 Then RedStr = "0" + RedStr’补零

 

GreenStr = Hex(GreenNum)

If Len(GreenStr) < 2 Then GreenStr = "0" + GreenStr

 

BlueStr = Hex(BlueNum)

If Len(BlueStr) < 2 Then BlueStr = "0" + BlueStr

 

GetColorValue = RedStr + GreenStr + BlueStr’合并

 

End Function

 

Private Sub Form_Load()

 

‘初始化程序

Text1.Text = GetColorValue

Picture1.BackColor = RGB(RedNum, GreenNum, BlueNum)'RGB函数返回颜色值

 

End Sub

 

 

 

Private Sub HScroll1_Change(Index As Integer)

 

‘当滚动条被改变时

Text1.Text = GetColorValue

Picture1.BackColor = RGB(RedNum, GreenNum, BlueNum)

 

End Sub

 

运行如图613

 

 

 

列表框(ListBox)和复合列表框(ComboBox)也是我们经常见到的视窗元素,我们从它所列示的条目中选出所需的,两种列表框只是在外观上略有不同,但从本质和操作方法来说它们是很相象的,它们也有一些特殊的属性:

 

List属性,你可以利于该属性象列表框或复合列表框中添加条目,但也可以在程序设计中通过AddItem方法添加。

 

ListCount属性,返回列表框或复合列表框中条目的数目。

 

ListIndex属性,表示列表框或复合列表框的第几项条目。(从0ListCount-1

 

Sorted属性,可以通过该属性对列表框或复合列表框中的条目根据字母顺序排序。

 

MultiSelect属性,0表示不能多选,1表示简单多选,2表示宽展多选,仅限于列表框。

 

Columns属性,表示条目是以一列显示还是两列显示,仅限于列表框。

 

Style属性:表示列表框或复合列表框以何种风格显示,二者参数不同。

 

举两个简单的例子。

 

例子一,建立一个新项目文件,在Form1上添加一个List控件,调整适当的尺寸,无需改变任何属性。填写以下代码。

 

Private Sub Form_Load()

 

With List1

 

.AddItem "0-Default"

.AddItem "1-Arrow"

.AddItem "2-Cross"

.AddItem "3-I-Beam"

.AddItem "4-Icon"

.AddItem "5-Size"

.AddItem "6-Size NE SW"

.AddItem "7-Size NS"

.AddItem "8-Size NW SE"

.AddItem "9-Size WE"

.AddItem "10-Up Arrow"

.AddItem "11-Hourglass"

.AddItem "12-NoDrag"

.AddItem "13-Arrow And Hourglass"

.AddItem "14-Arrow And Question"

.AddItem "15-Size All"

 

End With

 

End Sub

 

 

 

Private Sub List1_Click()

 

MousePointer = List1.ListIndex’这里的MousePointer是窗体全局内的属性

 

End Sub

 

当你点在不同项上面鼠标指针也会随着改变,如图614

 

 

 

AddItem方法语法如下:

 

ListObject “字符串”,数值

 

字符串后的数值可以指定条目加入在第几个条目的位置上,如果没有的话,添加项将逐次排下去。

 

下面举一个复合列表框的例子,例子通过选择复合列表框中的选项来改变文本框的字体。请新建一个项目文件,在窗体中添加一个ComboBoxCombo1)和一个TextBoxText1),添加如下代码。

 

Private Sub Combo1_Click()

 

Text1.FontName = Combo1.List(Combo1.ListIndex)

 

End Sub

 

 

 

Private Sub Form_Load()

 

With Combo1

 

.AddItem "宋体"

.AddItem "隶书"

.AddItem "黑体"

.AddItem "楷体"

.ListIndex = 0'把第一个条目作为初始项

 

End With

 

Text1.FontSize = 30’放大字体

Text1.FontName = Combo1.List(0)’初始字体为“宋体”

 

End Sub

 

 ************************************88

文章浏览广告

第六章(2)★输入(2 

现在加入 http://14.66.102.214 

在继续上面的内容时,我想再回顾和强调几个在字符串操作中经常函数:

 

先是几个已经接触过的,Mid()Asc()Len(),它们的语法分别是:

 

Mid(字符型,起始字符,长度)

 

返回子字符串,如果从字符串的第一个字符取起,起始字符为1,依此类推。

 

Asc(字符型)

 

返回数值,如果参数不是一个字符,而是字符串(多个字符),将返回参数的第一个字符ASCII值。

 

Len(字符型)

 

返回字符串的长度。

 

下面我再为你解释几个新的函数:

 

Left(字符串,长度)

 

将返回字符型,从字符串的第一个字符向左取字符串,与之相对应的是Right(),它将从字符串的最后一个字符向右取字符串。

 

Chr(数值型)

 

该数值范围从0255,返回字符型,如Chr(65)可返回字符“A”,这样可以输入一些用键盘无法输入的字符。

 

Str(数值型)

 

该函数把数值型转换为字符型,也许你觉得数值“123”和字符串“123”没什么区别,但在内存中一个ASCII字符是占一个字节,也就是说字符串“123”3个字节,而当数值“123”是整型时,它占两个字符,当它是长整型时,占4个字节。与之向对应的是Val(数值型),它把数值型转换为字符型。

 

上面的函数都是以后要经常用到的,请将它们熟悉。

 

上次讲到文本框的用处,还有意思吗?你是否能把上次的程序稍稍变动一下,来计算出输入的单词数,提示一下,单词与单词之间是用空格分隔开的。

 

我们继续下面的内容。

 

上次说到,输入不仅仅是向文本框输入字符,凡是从外界向程序传递数据都可以叫做输入,我们一一说明白。

 

无线钮,记得我们曾在第一章中完成过我们的第一个程序――“Hello World!”它就是一种输入的方法,在设计VB程序时可以通过一组这样的无线钮,它们之间互相排斥,也就是说,只能有一个按钮被选中。它因为很象无线电收音机上的按钮因而得名无线钮。如果要在一个窗体内放置多组无线钮必须用Frame控件把它们区分开来。下面我们在来完成一个例子,顺便熟悉一下另外两个处理字符串的函数――LTrim()Rtrim(),它们分别用来删除字符串左边的空格和右边的空格,让我们看看它们是如何工作的。

 

 

 

程序窗体如图68,由于窗体比较简单,无需修改更多的属性,一共有三个文本框(Text13),分别用来显示输入字符,显示把空格换成星号的字符,和经过处理的字符,还有三个无线钮(Option13),要修改的只有Caption属性,分别是“删除左边的空格”、“删除右边的空格”和“删除两边的空格”。因为空格在我们在文本框中无法看到空格,所以我们通过一个称作AddStar的函数把原有字符串中的空格转换为星号,使我们能够看到函数的效果。下面在程序中添加代码,首先在General中声明窗体级变量:

 

Dim LTrimmedword$, RTrimmedword$ '删除左边空格和右边空格后的字符串

 

Dim LRTrimmedword$ '删除两边空格后的字符串

 

然后,我们通过一个叫做addstar的函数为字符串加上星号,以前曾说过函数与过程的分别,函数会返回一个函数值,所以addstar也就相当于一个变量,其实这很好理解,就象中学代数中的函数,函数就相当于变量Y,而函数中的参数则相当于自变量X,当然可能有很多自变量X1X2……请原谅,我并不想在这里上数学课,因为我厌恶那玩意儿,特别是上了大学之后,好在大二以后就再也不会有数学课了,哈哈……

 

Function addstar(tempword As String) As String

 

Dim charindex%

Dim pasteword$ '加星号后的字符串

For charindex = 1 To Len(tempword)

 

If Mid(tempword, charindex, 1) = " " Then '如果字符为空格

 

pasteword = pasteword + "*"

 

Else: pasteword = pasteword + Mid(tempword, charindex, 1)

End If

 

Next

addstar = pasteword '返回函数值

 

End Function

 

下面的代码很简单,并且我为它做了注释,就不再一一解释了,我只想简要的提几句,LtrimRtrim只有一个参数(字符型),另外下面用到了焦点事件,我们曾在第三章中介绍过,当Text1得到焦点(GotFocus)时,清空所有的文本框,当它失去焦点(LostFocus)时,对字符进行addstar并且在Text2中显示。

 

Private Sub Text1_GotFocus() '但焦点于Text1

 

'清除所有文本框中的字符

Text1.Text = ""

Text2.Text = ""

Text3.Text = ""

 

End Sub

 

 

 

Private Sub Text1_LostFocus()

 

Dim Origionword As String

Origionword = Text1.Text

Text2.Text = addstar(Origionword)

LTrimmedword = addstar(LTrim(Origionword))

RTrimmedword = addstar(RTrim(Origionword))

LRTrimmedword = LTrim(RTrim(Origionword))

 

End Sub

 

 

 

Private Sub Option1_Click()

 

Text3.Text = LTrimmedword '显示删除左空格后的字符串

 

End Sub

 

 

 

Private Sub Option2_Click()

 

Text3.Text = RTrimmedword '显示删除右空格后的字符串

 

End Sub

 

 

 

Private Sub Option3_Click()

 

Text3.Text = LRTrimmedword '显示删除两边空格后的字符串

 

End Sub

 

最后结果如图69

 

 

 

与无线钮相对的是检查框,在同一范围内一组无线钮只能有一个被选中,而检查框则可以有多个选择,就象在添表时,性别那项只能有一个选择,而在描述你以前的职业时可以有学生、程序员、家庭教师或者什么,总之有很多选择,下面我们举一个简单的例子加以说明。

 

假设编写了一个共享软件,在让用户注册的时候你想知道你的用户使用的计算机情况,你就需要一个调查表,为了使这个调查表不止枯燥,可以在这个程序中加入一些图形。新建一个项目文件,窗体布局如图610

 

 

 

程序很简单,一共有两个框架(Frame1Frame2),它们的Caption分别为“选择你的计算机拥有的配置”和“这是你的计算机系统”,在Frame1有四个检查框(Check1Check4),Caption分别为“网络系统”、“鼠标”、“密码保护”和“电子邮件”,另把Check4Enabled属性改为False,使其无效;在Frame2中放置四个图片框(Picture1Picture4)与四个检查框向对应,请把所有图片框的BorderStyle属性设为0(无边框),它们的Picture属性请根据上图,在存放图标的目录中找到相对的图标。下面是程序代码:

 

Private Sub Check1_Click()

 

If Check1.Value Then

 

Check4.Enabled = -1

Picture1.Visible = -1

 

Else: Check4.Enabled = 0

Picture1.Visible = 0

Check4.Value = 0

Picture4.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check2_Click()

 

If Check2.Value Then

 

Picture2.Visible = -1

 

Else: Picture2.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check3_Click()

 

If Check3.Value Then

 

Picture3.Visible = -1

 

Else: Picture3.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check4_Click()

 

If Check4.Value Then

 

Picture4.Visible = -1

 

Else: Picture4.Visible = 0

 

End If

 

End Sub

 

 

 

这个程序比我们见过的任何程序都简单,就不再做说明。

 

(第六章 未完)

在继续上面的内容时,我想再回顾和强调几个在字符串操作中经常函数:

 

先是几个已经接触过的,Mid()Asc()Len(),它们的语法分别是:

 

Mid(字符型,起始字符,长度)

 

返回子字符串,如果从字符串的第一个字符取起,起始字符为1,依此类推。

 

Asc(字符型)

 

返回数值,如果参数不是一个字符,而是字符串(多个字符),将返回参数的第一个字符ASCII值。

 

Len(字符型)

 

返回字符串的长度。

 

下面我再为你解释几个新的函数:

 

Left(字符串,长度)

 

将返回字符型,从字符串的第一个字符向左取字符串,与之相对应的是Right(),它将从字符串的最后一个字符向右取字符串。

 

Chr(数值型)

 

该数值范围从0255,返回字符型,如Chr(65)可返回字符“A”,这样可以输入一些用键盘无法输入的字符。

 

Str(数值型)

 

该函数把数值型转换为字符型,也许你觉得数值“123”和字符串“123”没什么区别,但在内存中一个ASCII字符是占一个字节,也就是说字符串“123”3个字节,而当数值“123”是整型时,它占两个字符,当它是长整型时,占4个字节。与之向对应的是Val(数值型),它把数值型转换为字符型。

 

上面的函数都是以后要经常用到的,请将它们熟悉。

 

上次讲到文本框的用处,还有意思吗?你是否能把上次的程序稍稍变动一下,来计算出输入的单词数,提示一下,单词与单词之间是用空格分隔开的。

 

我们继续下面的内容。

 

上次说到,输入不仅仅是向文本框输入字符,凡是从外界向程序传递数据都可以叫做输入,我们一一说明白。

 

无线钮,记得我们曾在第一章中完成过我们的第一个程序――“Hello World!”它就是一种输入的方法,在设计VB程序时可以通过一组这样的无线钮,它们之间互相排斥,也就是说,只能有一个按钮被选中。它因为很象无线电收音机上的按钮因而得名无线钮。如果要在一个窗体内放置多组无线钮必须用Frame控件把它们区分开来。下面我们在来完成一个例子,顺便熟悉一下另外两个处理字符串的函数――LTrim()Rtrim(),它们分别用来删除字符串左边的空格和右边的空格,让我们看看它们是如何工作的。

 

 

 

程序窗体如图68,由于窗体比较简单,无需修改更多的属性,一共有三个文本框(Text13),分别用来显示输入字符,显示把空格换成星号的字符,和经过处理的字符,还有三个无线钮(Option13),要修改的只有Caption属性,分别是“删除左边的空格”、“删除右边的空格”和“删除两边的空格”。因为空格在我们在文本框中无法看到空格,所以我们通过一个称作AddStar的函数把原有字符串中的空格转换为星号,使我们能够看到函数的效果。下面在程序中添加代码,首先在General中声明窗体级变量:

 

Dim LTrimmedword$, RTrimmedword$ '删除左边空格和右边空格后的字符串

 

Dim LRTrimmedword$ '删除两边空格后的字符串

 

然后,我们通过一个叫做addstar的函数为字符串加上星号,以前曾说过函数与过程的分别,函数会返回一个函数值,所以addstar也就相当于一个变量,其实这很好理解,就象中学代数中的函数,函数就相当于变量Y,而函数中的参数则相当于自变量X,当然可能有很多自变量X1X2……请原谅,我并不想在这里上数学课,因为我厌恶那玩意儿,特别是上了大学之后,好在大二以后就再也不会有数学课了,哈哈……

 

Function addstar(tempword As String) As String

 

Dim charindex%

Dim pasteword$ '加星号后的字符串

For charindex = 1 To Len(tempword)

 

If Mid(tempword, charindex, 1) = " " Then '如果字符为空格

 

pasteword = pasteword + "*"

 

Else: pasteword = pasteword + Mid(tempword, charindex, 1)

End If

 

Next

addstar = pasteword '返回函数值

 

End Function

 

下面的代码很简单,并且我为它做了注释,就不再一一解释了,我只想简要的提几句,LtrimRtrim只有一个参数(字符型),另外下面用到了焦点事件,我们曾在第三章中介绍过,当Text1得到焦点(GotFocus)时,清空所有的文本框,当它失去焦点(LostFocus)时,对字符进行addstar并且在Text2中显示。

 

Private Sub Text1_GotFocus() '但焦点于Text1

 

'清除所有文本框中的字符

Text1.Text = ""

Text2.Text = ""

Text3.Text = ""

 

End Sub

 

 

 

Private Sub Text1_LostFocus()

 

Dim Origionword As String

Origionword = Text1.Text

Text2.Text = addstar(Origionword)

LTrimmedword = addstar(LTrim(Origionword))

RTrimmedword = addstar(RTrim(Origionword))

LRTrimmedword = LTrim(RTrim(Origionword))

 

End Sub

 

 

 

Private Sub Option1_Click()

 

Text3.Text = LTrimmedword '显示删除左空格后的字符串

 

End Sub

 

 

 

Private Sub Option2_Click()

 

Text3.Text = RTrimmedword '显示删除右空格后的字符串

 

End Sub

 

 

 

Private Sub Option3_Click()

 

Text3.Text = LRTrimmedword '显示删除两边空格后的字符串

 

End Sub

 

最后结果如图69

 

 

 

与无线钮相对的是检查框,在同一范围内一组无线钮只能有一个被选中,而检查框则可以有多个选择,就象在添表时,性别那项只能有一个选择,而在描述你以前的职业时可以有学生、程序员、家庭教师或者什么,总之有很多选择,下面我们举一个简单的例子加以说明。

 

假设编写了一个共享软件,在让用户注册的时候你想知道你的用户使用的计算机情况,你就需要一个调查表,为了使这个调查表不止枯燥,可以在这个程序中加入一些图形。新建一个项目文件,窗体布局如图610

 

 

 

程序很简单,一共有两个框架(Frame1Frame2),它们的Caption分别为“选择你的计算机拥有的配置”和“这是你的计算机系统”,在Frame1有四个检查框(Check1Check4),Caption分别为“网络系统”、“鼠标”、“密码保护”和“电子邮件”,另把Check4Enabled属性改为False,使其无效;在Frame2中放置四个图片框(Picture1Picture4)与四个检查框向对应,请把所有图片框的BorderStyle属性设为0(无边框),它们的Picture属性请根据上图,在存放图标的目录中找到相对的图标。下面是程序代码:

 

Private Sub Check1_Click()

 

If Check1.Value Then

 

Check4.Enabled = -1

Picture1.Visible = -1

 

Else: Check4.Enabled = 0

Picture1.Visible = 0

Check4.Value = 0

Picture4.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check2_Click()

 

If Check2.Value Then

 

Picture2.Visible = -1

 

Else: Picture2.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check3_Click()

 

If Check3.Value Then

 

Picture3.Visible = -1

 

Else: Picture3.Visible = 0

 

End If

 

End Sub

 

 

 

Private Sub Check4_Click()

 

If Check4.Value Then

 

Picture4.Visible = -1

 

Else: Picture4.Visible = 0

 

End If

 

End Sub

 *****************************************************8

文章浏览广告

第六章(1)★输入 

现在加入 http://14.66.102.214 

我们为什么要设计计算机程序呢,当然是为了计算机能为我们完成工作,但是要完成不同的任务,我们就必须对计算机下达命令,然后计算机在把信息返馈回来――任务是否完成。以上就是所谓的人机对话或交互功能,尤其是在Windows操作里我们需要进行更多的输入工作,我们需要填写各种各样的表格,设置程序的重要参数,把数据输入给计算机,再又它完成既定的工作就是今天我们本章要重点讨论的问题――在VB中如何建立完整的输入机制。

 

VB中提供了一个函数InputBox能帮助我们建立一个最简单的输入窗体,语法如下:

 

InputBoxprompt[,title][,default][,xpos][,ypos][,helpfile,context]

 

该函数返回一个字符串表达式,其参数含义为:(“[]”表示可缺省)

 

prompt――字符串表达式,最大长度为1024字符,窗体上的提示部分。

 

Title――字符串表达式,显示标题栏里的文本。

 

Default――字符串表达式,窗体中文本框的缺省值。

 

xposypos――数值表达式,以Twips为单位指定窗体出现在屏幕上的位置。

 

helpfile――字符串表达式,是帮助文件的完整路径。

 

Context――数值表达式,指定适合的帮助主题。

 

可能你看了上面的说明并不明白,那么下面我们就用Input语句完成一个最简单的程序。

 

 

 

小知识:屏幕坐标

 

在计算机的屏幕上也有一个类似于我们在中学里常用到的直角坐标系,之不过它的原点不在左下,而是在屏幕的右上角,屏幕的最右上方坐标为(00),它的横坐标和我们的习惯是一致的,而纵坐标则是越向下越大,不仅是屏幕,所有的对象里都是一样,需要记清。见图61

 

 

 

新建一个项目(project),在Form_load里填写一行代码:

 

a$ = InputBox("举荐你最欣赏的网站", "最佳网站投票", "VB小驿")’不算无耻吧?:->

 

按下F5运行程序,在Form1出现之前先会弹出一个输入对话框,如图62。这时,无论你按下OK还是Cancel都是没有区别的,因为我们并没有对输入数据进行处理,下面我们完成一个更加复杂些的程序。

 

 

 

新建一个项目文件,把窗口布局成类似于图63的结构,各对象属性如下表:

 

 

 

Form1

Caption “最佳网站投票演示”

 

BorderStyle 3’不可调整大小

 

ControlBox 0’False

 

Frame1

Caption “输入框属性“

 

Label1

Autosize 1’True

 

Index 05

 

05 Caption “提示语句”

 

“标题”

 

“缺省网站”

 

X坐标”

 

Y坐标”

 

“”

 

Index 4 Enabled False

 

Index 4 Enabled False

 

Text1

Text “”’(空字符串)

 

Index 04

 

Index 3 Text 0

 

Index 4 Text 0

 

Check1

Caption “指定输入框位置”

 

Button1

Index 0,1

 

Index 0 Caption “显示输入框”

 

1 Caption “退出程序”

 

 

 

 

本例中出现了一个Frame1控件,它是一种框架,可以用来把窗体分成好几个部分,首先应该在窗体上画出Frame1控件,然后再选择相应的控件,在Frame1上描出轮廓,使其是出现在Frame1之上,本例中除去两个按钮,其余都在Frame1上面。本例中用到了几组控件数组,其创建方法是,在选定的点右键,选择Copy,再在窗体其他部位单击右键,选择Paste即可,注意,若要使粘贴的对象在Frame1上,请在Frame1上单击右键选择Paste

 

我们通过这个窗体,对输入框进行完整的控制,原理是这样的:当我们把窗体中要填写的对输入框的参数完成后按下OK按钮,就会出现我们设计的那个输入框,我们从输入框退出时则返回我们投票的结果,代码如下.

 

窗体初次被装入时,Label1(3)Label(4)Text1(3)Text1(4)Enabled属性都是False,我们需要通过改变Check1Value1,被选中,0,未选中)是他们有效或无效。

 

声明全局变量(General):

 

Dim PosChk As Boolean '检查XY坐标是否有效

 

Check1_Click 事件:

 

Private Sub Check1_Click()

 

If Check1.Value = 1 Then

 

Label1(3).Enabled = True

 

Label1(4).Enabled = True

 

Text1(3).Enabled = True

 

Text1(4).Enabled = True

 

PosChk = True

 

Else

 

Label1(3).Enabled = False

 

Label1(4).Enabled = False

 

Text1(3).Enabled = False

 

Text1(4).Enabled = False

 

PosChk = False

 

End If

 

End Sub

 

接着在按钮中填写代码:

 

Private Sub Command1_Click(Index As Integer)

 

Dim Prompt, Title, Default As String

 

Dim xPos, yPos As Integer

 

Select Case Index

 

Case 0

 

Prompt = Text1(0).Text

 

Title = Text1(1).Text

 

Default = Text1(2).Text

 

If PosChk Then

 

xPos = Val(Text1(3).Text)

 

yPos = Val(Text1(4).Text)

 

a$ = InputBox(Prompt, Title, Default, xPos, yPos)

 

Else

 

a$ = InputBox(Prompt, Title, Default, xPos, yPos)

 

End If

 

Label1(5).Caption = "谢谢您的投票,您的选择是" & a$ & ""

 

Case 1

 

Unload Me

 

End Select

 

End Sub

 

按下F5运行程序,你会看到这样的结果。图6465。是不是有种受骗的感觉,啊哟哟,可不是我的错,就是这么容易嘛!

 

 

 

 

从刚才的例子里,我们接触了一些VB中的输入方法,其实数据输入不仅仅局限于向Text框中输入数据,数据的输入还有许多其他的方法,譬如前面的Check1也是向程序发出一定的信息,只要是通过操作向计算机发布命令就可以叫做输入,下面我们来一一介绍。

 

首先要介绍的当然是输入用到最多的Text框。Text没有Click事件,它的缺省事件是Change,也就是当Text框里的一旦内容改变就会激发该事件发生,还是让我们用实例说话吧。

 

Text有几个特殊的属性,一是MultiLine(多行)属性,MultiLine属性为False的时候,不论文本有多长,它都会在一行里显示下去,换行符无效,当它为True的时候,字符串显示到Text框边缘的时候就会自动换行。另一个与之配合的属性是ScrollBars属性,它有4个值,03,分别是没有滚动条,水平滚动条,垂直滚动条,和二者都有,它是一个只读属性,也就是说只有在程序设计过程中才能改变,而不能在程序运行中改变,但是我们可以通过API解决运行中改变的问题,我们放在以后再讲。PasswordChart属性,我们经常在程序操作中遇到要填写密码的部分,为了保密起见,在屏幕上显示的字符一般“*”表示,并且这时是无法用剪贴板的,这在VB中非常容易做到,把PasswordChart中设一个用来代替字符串的字符即可,并不一定是“*”哦。

 

下面我们完成一个有趣的小程序,是我以前遇到过的一个程序,我对其进行了部分修改。程序的意思是这样的,假设你是一个司机应超速被警察扣留,现在需要你向警察陈述你的理由,如果你的话能打动他,就可以免交罚金,如果你在规定的字数里没有说出什么有震撼力的话,那老兄你可就惨了,交钱吧。J

 

这个程序比原来的英文程序有了几点不同,第一,由于用到的是双字节中文的中文,所以对于检测中文字符和英文有很大不同,第二,原来的英文程序不管你说多少,警察依然是依法从事,本例中给了犯规者10%的免罚机会(有点无聊……L ,不过也是为了学一些东东嘛)。下面就跟我来设计窗体吧。(如图66

 

 

 

Form1

Icon Stop图标

 

Caption 停车检查

 

BorderStyle 3

 

Label1

Caption 警官,我超速是有原因的,请听我说:

 

BackColor &H00808080&

 

ForeColor &H80000012&

 

Label2

Caption 你必须在30字之内完成你理由的申诉,否则将受到罚款!

 

BackColor &H00808080&

 

ForeColor &H00FF0000&

 

Text1

MultiLink True

 

Text “”

 

Picture1

Autosize True

 

BackColor &H00808080&

 

Visible True

 

Picture2

Autosize True

 

BackColor &H00808080&

 

Visible False

 

Picture3

Autosize True

 

BackColor &H00808080&

 

Visible False

 

Command1

Visible False

 

 

 

 

 

 

三个图片框Picture13Picture属性分别为绿灯,黄灯和红灯,这些图标在VB目录下的Graphics/Icons/Traffic下(VB5),或是VB目录下的Icons/Traffic下(VB4VB3),你还可以为Label1Font属性里选一个合适的字体和字重。下面我们来看代码:

 

首先初始化程序:

 

Private Sub Form_Load()

 

'Command1放在水平的中央

 

Command1.Top = Label2.Top200

 

Command1.Left = (Form1.Width - Command1.Width) / 2

 

'重叠三个图片框

 

Picture2.Left = Picture1.Left

 

Picture2.Top = Picture1.Top

 

Picture3.Left = Picture1.Left

 

Picture3.Top = Picture1.Top

 

End Sub

 

下面我来讲一讲程序是怎样运行的,我们将用到TextChange事件,每当字符串改变一次就对它进行一次检查,算出已经说的字数,当字数超过10时,下面的红绿灯会变成黄色,并且在这时随机抽取一个数,它在一个范围内出现的可能是10%,如果在这个范围内就可以免交罚金,如果不在范围则继续,当文字超过20的时候,红绿灯会变成红色,再一次抽取随机数字,步骤同上,如果30个字已满,再进行一次检查,如果你真的那么不幸就该罚款了。

 

程序的步骤清楚了,我们在来看看程序的要点。由于中文是双字节字符,也就是说一个汉字占两个ASC码的位置,而VB显然是为英语国家设计的用Len函数无法返回汉字字节,也就是说一个汉字和和一个ASC字符在Len函数中得到的值是一样的,这就需要特殊处理。用Asc()函数,在括号内放入一个ASC字符或字符串,它会把第一个ASC码转化为0255的数值,而把一个汉字放入,它的值必然不在0255,这也就可以作为判定汉字的基础。我们可以把英文算作半个汉字。

 

下面我们来看看代码:

 

General 里声明窗体级变量:

 

Dim Level As Integer

 

 

 

Private Sub Command1_Click()

 

Unload Me

 

End Sub

 

 

 

Private Sub Text1_Change()

 

Dim StrLength As Integer’字符串长度

 

Dim RandomNum As Single’随机数

 

Dim Str1 As String

 

Dim a As String

 

Dim i, Temp

 

StrLength = 0’每次开始时把字符串长度还原为0

 

a = Text1.Text

 

For i = 1 To Len(a)’Len(a)代表字符串的长度

 

Temp = Asc(Mid$(a, i, 1))’挨个取字符

 

If Temp > 255 Or Temp < 0 Then’不是ASC

 

StrLength = StrLength + 2

 

Else

 

StrLength = StrLength + 1

 

End If

 

Next i

 

 

 

StrLength = StrLength / 2

 

Select Case StrLength

 

Case 0 To 9

 

Picture1.Visible = True

 

Picture2.Visible = False

 

Picture3.Visible = False

 

Label2.Caption = "慢慢说。你还有" & Str(30 - StrLength) & "个字可以说"

 

Level = 1

 

Case 10 To 19

 

If Level = 1 Then

 

RandomNum = Rnd * 10’得到随机数

 

If RandomNum <= 10 And RandomNum > 9 Then

 

Text1.Enabled = False

 

Label2.Caption = "很抱歉这是个误会……"

 

Command1.Visible = True

 

Command1.Caption = "您可以离开了"

 

End If

 

Level = 2

 

Else

 

Picture1.Visible = False

 

Picture2.Visible = True

 

Picture3.Visible = False

 

Str1 = "怎么还没说完!"

 

Label2.Caption = Str1 & "你还有" & Str(30 - StrLength) & "个字可以说"

 

End If

 

Case 20 To 29

 

If Level = 2 Then

 

RandomNum = Rnd * 10

 

If RandomNum <= 10 And RandomNum > 9 Then

 

Text1.Enabled = False

 

Label2.Caption = "很抱歉这是个误会……"

 

Command1.Visible = True

 

Command1.Caption = "您可以离开了"

 

End If

 

Level = 3

 

Else

 

Picture1.Visible = False

 

Picture2.Visible = False

 

Picture3.Visible = True

 

Str1 = "我已经不耐烦了!"

 

Label2.Caption = Str1 & "你还有" & Str(30 - StrLength) & "个字可以说"

 

End If

 

Case Else

 

Text1.Enabled = False

 

Label2.Caption = "你已经没有机会了!"

 

Command1.Visible = True

 

Command1.Caption = "交钱吧,肇事犯!"

 

End Select

 

End Sub

 

 

 

中间有几个函数需要解释一下:

 

Mid可以从字符串中取出一部分,返回字符型,格式:

 

Mid(字符串,从第几个字符开始,取字符的长度)

 

Asc可以把字符转换为ASCII码,格式:

 

Asc(字符串)

 

Rnd,取得大于0但小于1 的数值,可以没有参数。

 

怎么样,十分简单吧,我们将在下一次继续讨论VB的输入机制,再见!

 

***********************8

文章浏览广告

第二章:事件、属性及数据类型 

现在加入 http://14.66.102.214 

以后两章可能会比较枯燥,但不可否认也很重要,所以为了学好VB,我们一定要打好基础才行。

 

一、事件

 

通过上一章的例子,你可能对“面向对象的编程”已经有了一定了解,它是由事件驱动的,对于不同的对象,所能感应到的事件也会不同,譬如说当你把鼠标移进某一区域时就会触发MouseMove事件,这很直观,也容易理解,但也有些事件比较抽象,下面我来对一般的事件进行一下解释。

 

窗体和图象框类事件

Paint事件:当某一对象在屏幕中被移动,改变尺寸或清除后,程序会自动调用Paint事件。注意:当对象的AutoDraw属性为True(-1)时,程序不会调用Paint事件。

Resize事件:当对象的大小改变时触发Resize事件。

Load事件:仅适用于窗体对象,当窗体被装载时运行。

Unload事件:仅适用于窗体对象,当窗体被卸载时运行。

 

  2.当前光标(Focus)事件

 

GotFocus事件:当光标聚焦于该对象时发生事件。

LostFocus事件:当光标离开该对象时发生事件。

 

注意:Focus英文为“焦点”、“聚焦”之意,最直观的例子是,比如有两个窗体,互相有一部分遮盖,当你点下面的窗体时,它就会全部显示出来,这时它处在被激活的状态,并且标题条变成蓝色,这就是GotFocus事件,而相反,另外一个窗体被遮盖,并且标题条变灰,称为LostFocus事件。上面所说的“光标”并非指鼠标指针。

 

  3.鼠标操作事件

 

Click事件:鼠标单击对象。

DbClick事件:鼠标双击事件。

MouseDownMouseUp属性:按下/放开鼠标键事件。

MouseMove事件:鼠标移动事件。

DragDrop事件:拖放事件,相当于MouseDownMouseMoveMouseUp的组合。

DragOver事件:鼠标在拖放过程中就会产生DragOver事件。

 

  4.键盘操作属性

 

KeyDownKeyUp事件:按键的按下/放开事件。

KeyPress事件:按键事件。

 

  5.改变控制项事件

 

Change事件:当对象的内容发生改变时,触发Change事件。最典型的例子是文本框(TextBox)。

DropDown事件:下弹事件,仅用于组合框(ComboBox)对象。

PathChange事件:路径改变事件,仅用于文件列表框(FileBox)对象。

 

  6.其他事件

 

Timer事件:仅用于计时器,每隔一段时间被触发一次。

 

二、属性

 

    每个对象都有它的属性,并且“Name”属性是共有的,有了“Name”属性才可以在程序中进行调用。对于属性,可以在窗体的布局操作中完成,也可以在程序运行中改变,这取决你的需要,但有些属性是只读的,它只能在控件布局时改变。我将在以后的实例中具体介绍各个属性的作用。

 

 

 

三、数据类型

 

学过编程的人都知道大多数的计算机语言都规定了各自的数据类型,VB也不例外。其实,在一个最简单的程序中数据类型是可以不作规定的,也就是说,变量可以使用各种类型,但是在一个复杂的程序里,这样做就很危险,因为很可能给同一个变量赋予了不同的类型,而导致程序出错。所以,为了程序的严谨和便于查看,正确的定义数据类型是必要的。定义数据的另一个原因是,不同的数据占用不同的内存数量,譬如整型(Interger)数据占2字节,而长整型数据占4个字节,定义合适的数据类型,不管你相信不相信,它可以节省内存!

 

VB常用的数据类型有:整型(Integer,表示-3276832767之间的整数)、长整型(Long,表示-2,147,483,6482,147,483,647之间的整数)、实型(Single,表示-3.37E+383.37E+38之间的实数)、双精度实型(Double,表示-1.67E+3081.67E+308之间的实数),字符(String,每个字符占一字节,可以储存065,535个字符),布尔(Boolean,只有两个值True/-1,或False/0)。

数据类型的定义方法:

定义变量最简单的方法是用“Dim”关键字,它的语法:

 

Dim 【变量名】As 【数据类型】

 

如:Dim Index As Integer

 

也可以在一行中定义多个变量,如:

 

Dim Index As Integer , Dim Number As Long

 

把多个变量定义成同一类型可以写成:

 

Dim Index , Number As Integer

 

更可以在定义时进行初赋值:

 

Dim Index=3

 

有时为了简便,也以符号进行简单的定义,作用是和上面一样的。整型可以用“%”代替,长整型可以用“&”代替,实型可以用“!”,双精度实型可以用“#”定义,如刚才的第一个例子可以写成:

 

Dim Index% 等价于 Dim Index As Integer

 

对于常量的定义用Const定义,如:Const COLOR=255

 

为了在程序中便于查阅,我们对变量和常量的写法进行规定,变量一般用小写方式,常量则全部大写。

 

注意:使用常量的好处,对于程序中经常出现的数值,应设常量等于它,这样一是书写方便,其二,如果要改变该数值,只需改变定义常量的语句值,而不需改变每个语句,提高了效率。

 

数组的定义类似于变量定义,所不同的是数组需要指定数组中的元素个数,例如:

 

Dim IntegerArray(99) As Integer

 

这个数组中包含100个元素,脚标从099

 

也可以指定脚标的起始值,例如:

 

Dim IntegerArray(2 to 10) As Integer

 

这个数组含有九个元素,脚标从210

 

还可以定义多维数组:

 

Dim ThreeD(4,2 to 5,3 to 6) As Integer

 

上例定义了一个三维数组(4×4×4)

 

记录的定义

 

记录定义是把控制权交给用户的方法,它让用户可以定义自己的数据类型,它使用关键字“Type”,方法是:

 

Type 【数据类型标识符】

 

<域名> As <数据类型>

<域名> As <数据类型>

<域名> As <数据类型>

…………………………

 

End Type

 

例如,定义一个地址数据:

 

Type Address

 

Street As String

ZipCode As String

Phone As String

 

End Type

 

这个地址数据里包括三个属性,街区、邮政编码和电话,可以把某数据定义成此类型:

 

Dim MyHome As Address

 

要调用或改变“MyHome”的值时,类似于对对象的属性的操作:

 

变量名.域名=“……”

 

为了简化书写重复的部分,可以用关键字“With”

 

With MyHome

 

.Street=”阜成路”

.ZipCode=”100037”

.Phone=”12345678”

 

End With

  

 

本文标签: 编程技巧VB