精华内容
下载资源
问答
  • vb编程软件怎么把不同长度的数组连接,下标恢复成一个连续的,请问怎么连接非0下标的数组为新数组?
  • vb编程软件制作怎么看一个ocx的空间里定义了什么变量,以及变量定义的类型?怎么得到使用的ocx内存里分配的变量的变量名?
  • 10进制转16进制小软件VB编程,10进制转16进制小软件VB编程
  • 请问在vb编程编制的软件屏幕选择对话框,同时虚化背景的做法是什么?怎么实现屏幕选择对话的时候虚化背景?
  • VB编程技巧

    千次阅读 2006-04-11 13:16:00
    文章浏览广告 VB编程技巧几例 现在加入 http://14.66.102.214 VB5 引入枚举变量,使用它,我们可以显著地改变应用程序的易读性: Public Enum TimeOfDay Morning = 0 Afternoon = 1 Evening = 2 End Enum ...

    文章浏览广告

    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为单位指定窗体出现在屏幕上的位置。