精华内容
下载资源
问答
  • VB编程用经常要用到算法

    千次阅读 2008-06-25 07:37:00
    感觉不错,转了过来我看到原始...算法描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。

    感觉不错,转了过来

    我看到的原始地址http://www.cnblogs.com/redfox241/archive/2008/04/15/1154841.html

    算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
    
    一、计数、求和、求阶乘等简单算法
    
      此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
    
      例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
    
      本题使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
    
      将程序编写在一个GetTJput过程中,代码如下:
    
       Public Sub GetTJput()    
    
          Dim a(1 To 100) As Integer
    
          Dim x(1 To 10) As Integer
    
          Dim i As Integer, p As Integer
    
          '产生100个[0,99]范围内的随机整数,每行10个打印出来
    
          For i = 1 To 100
    
              a(i) = Int(Rnd * 100)
    
              If a(i) < 10 Then
    
                  Form1.Print Space(2); a(i);
    
              Else
    
                  Form1.Print Space(1); a(i);
    
              End If
    
              If i Mod 10 = 0 Then Form1.Print
    
          Next i
    
          '统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来
    
          For i = 1 To 100
    
              p = a(i)  Mod  10    ' 求个位上的数字
    
              If p = 0 Then p = 10
    
              x(p) = x(p) + 1
    
          Next i
    
          Form1.Print "统计结果"
    
          For i = 1 To 10
    
              p = i
    
              If i = 10 Then p = 0
    
              Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"
    
          Next i
    
      End Sub
    
      
    
    二、求两个整数的最大公约数、最小公倍数
    
    
    
    分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
    
           (1) 对于已知两数m,n,使得m>n;
    
           (2)  m除以n得余数r;
    
           (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
    
           (4) m←n,n←r,再重复执行(2)。
    
         例如: 求 m=14 ,n=6 的最大公约数.        m      n        r
    
                                            14      6       2
    
                                                 6       2       0
    
      m=inputBox("m=")
    
      n=inputBox("n=")
    
      nm=n*m
    
      If m < n Then t = m: m = n: n = t
    
        r=m mod n
    
        Do While (r <> 0)                                
    
             m=n
    
             n=r
    
             r= m mod n
    
        Loop
    
        Print "最大公约数=", n 
    
      Print "最小公倍数=", nm/n 
    
    三、判断素数
    
      只能被1或本身整除的数称为素数  基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
    
         m =val( InputBox("请输入一个数"))
    
              For i=2 To int(sqr(m))
    
                   If m Mod i = 0 Then    Exit  For
    
               Next i
    
              If i > int(sqr(m)) Then
    
                  Print "该数是素数"
    
              Else
    
    
    
    Print "该数不是素数"
    
              End If
    
       将其写成一函数,若为素数返回True,不是则返回False
    
          Private Function Prime( m as Integer)  As  Boolean
    
                      Dim  i%           
    
                      Prime=True
    
                      For i=2 To int(sqr(m))
    
                          If m Mod i = 0 Then   Prime=False:  Exit  For
    
                      Next i
    
                 End Function
    
    
    
       
    
    
    
    四、验证哥德巴赫猜想
    
      (任意一个大于等于6的偶数都可以分解为两个素数之和)
    
       基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2   再检验n1、n2是否素数,… 直到n1=n/2为止。
    
       利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
    
      Dim  n%,n1%,n2% 
    
           n=Val(InputBox("输入大于6的正整数"))
    
           For n1=3 to n step 2
    
              n2=n-n1 
    
              If  prime(n1)   Then 
    
                   If  prime(n2) then  
    
                        Print n & "=" & n1 & "+" & n2 
    
                        Exit For                                '结束循环
    
                   End if
    
               End if
    
    
    
    Next  n1
    
    
    
    五、排序问题
    
      1.选择法排序(升序)
    
      基本思想:
    
       1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
    
       2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
    
       3)依次类推,选择了n-1次后,这个数列已按升序排列。
    
                  
    
      程序代码如下:
    
      For i = 1 To n - 1
    
            imin = i
    
            For j = i + 1 To n
    
                If a(imin) > a(j) Then imin = j
    
            Next j
    
            temp = a(i)
    
            a(i) = a(imin)
    
            a(imin) = temp
    
      Next I
    
      
    
      2.冒泡法排序(升序)
    
        基本思想:(将相邻两个数比较,小的调到前头)
    
       1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
    
       2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
    
       3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
    
       程序段如下
    
    For i = 1 To n - 1
    
       For j = 1 To n-i
    
            If a(j) > a(j+1) Then 
    
               temp=a(j): a(j)=a(j+1): a(j+1)=temp
    
            End if
    
       Next j
    
    Next i
    
    
    
      
    
      3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)
    
      基本思想:
    
       1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
    
       2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
    
       3)将另一个数组剩余元素抄入C数组,合并排序完成。
    
    程序段如下:
    
       Do While ia <= UBound(A) And ib <= UBound(B)   '当A和B数组均未比较完
    
              If A(ia) < B(ib) Then
    
                    C(ic) = A(ia):  ia = ia + 1
    
              Else
    
                    C(ic) = B(ib):  ib = ib + 1
    
              End If
    
              ic = ic + 1
    
    
    
    Loop
    
        Do While ia <= UBound(A)    'A数组中的剩余元素抄入C数组
    
              C(ic) = A(ia)
    
              ia = ia + 1:   ic = ic + 1
    
        Loop
    
        Do While ib <= UBound(B)   'B数组中的剩余元素抄入C数组
    
               C(ic) = B(ib)
    
                ib = ib + 1:  ic = ic + 1
    
        Loop
    
    
    
    
    
    六、查找问题
    
      1.①顺序查找法(在一列数中查找某数x)
    
        基本思想:一列数放在数组a(1)---a(n)中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a(p),则使p=p+1,不断重复这个过程;一旦x等于a(p)则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)
    
          p = 1
    
          Do While x <> a(p) And p < =n
    
              p = p + 1
    
          Loop
    
    下面写一查找函数Find,若找到则返回下标值,找不到返回0
    
    Option Base 1
    
    Private Function Find( a( ) As Single,x As Single)  As Integer
    
          Dim n%,p%
    
          n=Ubound( a )
    
       p = 1
    
      Do While x <> a(p) And p < =n
    
             p = p + 1
    
      Loop
    
          If  p>n then  p=0
    
           Find=p
    
     End Function    
    
    
    
    ②基本思想:一列数放在数组a(1)---a(n)中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)
    
    Public Sub Search(a() As Variant, key As Variant, index%)
    
      Dim i%
    
      For i = LBound(a) To UBound(a)
    
        If key = a(i) Then
    
          index = i
    
          Exit Sub
    
        End If
    
      Next i
    
        index = -1
    
    End Sub
    
    
    
    2.折半查找法(只能对有序数列进行查找)
    
    基本思想:设n个有序数(从小到大)存放在数组a(1)----a(n)中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
    
    (1)x=a(mid),则已找到退出循环,否则进行下面的判断;
    
    (2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
    
    (3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
    
    (4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。
    
    
    
    将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回-1。
    
      Function search(a() As Integer, x As Integer) As Integer
    
          Dim bot%, top%, mid%
    
          Dim find As Boolean   '代表是否找到
    
          bot = LBound(a)
    
          top = UBound(a)
    
          find = False          '判断是否找到的逻辑变量,初值为False
    
          Do While bot <= top And Not find
    
               mid = (top + bot)  2
    
              If x = a(mid) Then
    
                  find = True
    
                  Exit Do
    
                ElseIf x < a(mid) Then
    
                    top = mid - 1
    
                  Else
    
                    bot = mid + 1
    
                  End If
    
              Loop
    
          If find Then
    
             search = mid
    
           Else
    
             search = -1
    
          End If
    
    End Function
    
    
    
      
    
    七、插入法
    
      把一个数插到有序数列中,插入后数列仍然有序
    
      基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。首先确定x插在数组中的位置P;(可由以下语句实现)
    
      p=1
    
      do while x>a(p) and p<=n
    
      p=p+1
    
      loop
    
      a(p)—a(n)元素向后顺移一个位置以空出a(p)元素放入x,可由以下语句实现:
    
      for i=n to p  step-1
    
        a(i+1)=a(i)
    
      next i
    
      a(p)=x
    
      将其写成一插入函数
    
       Private Sub Instert(a() As Single, x As Single)
    
                Dim p%, n%, i%
    
                n = UBound(a)
    
                ReDim Preserve a(n + 1)
    
                p = 0
    
                Do While x > a(p) And p < =n    ' 确定x应插入的位置
    
                      p = p + 1
    
    
    
    Loop
    
                For i = n To p Step -1
    
                  a(i + 1) = a(i)
    
                Next i
    
                a(p) = x
    
         End Sub
    
    
    
      
    
    八、矩阵(二维数组)运算
    
       (1)矩阵的加、减运算
    
               C(i,j)=a(i,j)+b(i,j)           加法
    
               C(i,j)=a(i,j)-b(i,j)            减法
    
      
    
       (2)矩阵相乘
    
      (矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。矩阵C中任一元素   (i=1,2,…,m;   j=1,2,…,n)
    
    For i = 0 To m                             
    
    For j = 0 To n                              
    
          c(i, j) = 0                              
    
           For k = 0 To l                           
    
            c(i, j) = c(i, j) + a(i, k) * b(k, j)            
    
          Next k                                 
    
      Next j                                
    
     Next i              
    
    
    
    (3)矩阵传置
    
    例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:
    
    For i=1 to 5                  (2) For i=2 to 5
    
    For j=i+1 to 5                  For j=1 to i
    
      t=a(i,j)                       t=a(i,j)
    
      a(i,j)= a(j,i)                         a(i,j)= a(j,i)
    
      a(j,i)=t                             a(j,i)=t
    
    Next j                     Next j
    
    Next i                       Next i
    
    
    
     (4)求二维数组中最小元素及其所在的行和列                                                                                                          
    
    基本思路同一维数组,可用下面程序段实现(以二维数组a(2,3)为例):
    
    ‘变量max中存放最大值,row,column存放最大值所在行列号
    
    Max = a(1, 1): row = 1: Column = 1
    
    For i = 1 To 2
    
        For j = 1 To 3
    
            If a(i, j) > a(row, Column) Then
    
                Max = a(i, j)
    
                row = i
    
                Column = j
    
            End If
    
        Next j
    
    Next i
    
    Print "最大元素是"; Max
    
    Print "在第" & row & "行,"; "第" & Column & "列"
    
    九、迭代法
    
       算法思想:
    
    
    
    对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解。
    
    例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为:
    
    Private Function Fsqrt( a As single ) AS single
    
    Dim x0 As Single, x1 As Single
    
         x0 =a/2          '迭代初值
    
         x1 = 0.5*(x0 + a/x0)
    
         Do
    
                x0 = x1   '为下一次迭代作准备
    
                x1 = 0.5*(x0 + a/x0)
    
        Loop While Abs(x1 - x0) > 0.00001
    
        Fsqrt=x1
    
    End Function
    
    十、数制转换
    
         将一个十进制整数m转换成 →r(2-16)进制字符串。
    
      方法:将m不断除 r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
    
     Private Function TrDec(idec As Integer, ibase As Integer) As String
    
         Dim strDecR$, iDecR%
    
         strDecR = ""
    
         Do While idec <> 0
    
              iDecR = idec Mod ibase
    
              If iDecR >= 10 Then
    
                 strDecR = Chr$(65 + iDecR - 10) & strDecR
    
              Else
    
                 strDecR = iDecR & strDecR
    
              End If
    
              idec = idec  ibase
    
        Loop
    
       TrDec = strDecR
    
     End Function
    
    十一、字符串的一般处理
    
    1.简单加密和解密
    
     
    
    加密的思想是:
    
      将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式: c=chr(Asc(c)+k)
    
        例如序数k为5,这时 "A"→ "F", "a"→?"f","B"→?"G"…
    
        当加序数后的字母超过"Z"或"z"则 c=Chr(Asc(c)+k -26)
    
             例如:You  are  good→ Dtz   fwj  ltti
    
      
    
       解密为加密的逆过程
    
        将每个字母C减(或加)一序数K,即 c=chr(Asc(c)-k),
    
        例如序数k为5,这时 "Z"→"U", "z"→"u","Y"→"T"…
    
    
    
    
    
    当加序数后的字母小于"A"或"a"则 c=Chr(Asc(c)-k +26)
    
    下段程序是加密处理:
    
    i = 1:   strp = ""
    
    nL = Len(RTrim(strI))
    
    Do While (i <= nL)
    
           strT = Mid$(strI, i, 1)     '取第i个字符
    
           If (strT >= "A" And strT <= "Z") Then
    
                 iA = Asc(strT) + 5
    
                 If iA > Asc("Z") Then iA = iA - 26
    
                 strp = strp + Chr$(iA)
    
           ElseIf (strT >= "a" And strT <= "z") Then
    
                  iA = Asc(strT) + 5
    
                  If iA > Asc("z") Then iA = iA - 26
    
                  strp = strp + Chr$(iA)
    
                Else
    
            strp = strp + strT
    
            End If
    
            i = i + 1
    
        Loop
    
    Print strp
    
    
    
    2.统计文本单词的个数
    
      
    
    算法思路:
    
     (1)从文本(字符串)的左边开始,取出一个字符;设逻辑量WT表示所取字符是否是单词内的字符,初值设为False
    
     (2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True则表是新单词的开始,让单词数Nw=Nw+1,让WT=True;
    
     (3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符, 则表示字符不是单词内字符,让WT=False;
    
    (4) 再依次取下一个字符,重得(2)(3)直到文本结束。
    
    下面程序段是字符串strI中包含的单词数
    
    Nw = 0: Wt = False
    
    nL = Len(RTrim(strI))
    
    For i = 1 To nL
    
          strT = Mid$(strI, i, 1)     '取第i个字符
    
          Select Case strT
    
                Case " ", ",", ";", "!"
    
                      Wt = False
    
                Case Else
    
                      If Not Wt Then
    
                           Nw = Nw + 1
    
    
    
    Wt = True
    
                      End If
    
           End Select
    
    Next i
    
    Print "单词数为:", Nw
    
    
    
    十二、穷举法
    
      穷举法(又称“枚举法”)的基本思想是:一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
    
      例: 将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
    
    Dim i%, j%, k%
    
    Print "5元             1元          0.5元"
    
    For i = 1 To 20
    
            For j = 1 To 100 - i
    
                   k = 100 - i - j
    
                   If 5.0 * i + 1.0 * j + 0.5 * k = 100 Then
    
                       Print i, j, k
    
                   End If
    
             Next j
    
       Next i
    
    
    
    十三、递归算法
    
      用自身的结构来描述自身,称递归
    
      VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
    
         递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。
    
      例:编fac(n)=n! 的递归函数
    
          Function fac(n As Integer) As Integer
    
              If n = 1 Then 
    
             fac = 1
    
              Else
    
          fac = n * fac(n - 1)
    
              End If
    
           End Function  
    
    
    
    
    展开全文
  • 算法描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图...

    算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
    一、计数、求和、求阶乘等简单算法
      此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
      例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
      本题使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
      将程序编写在一个GetTJput过程中,代码如下:
       Public Sub GetTJput()   
          Dim a(1 To 100) As Integer
          Dim x(1 To 10) As Integer
          Dim i As Integer, p As Integer
          '产生100个[0,99]范围内的随机整数,每行10个打印出来
          For i = 1 To 100
              a(i) = Int(Rnd * 100)
              If a(i) < 10 Then
                  Form1.Print Space(2); a(i);
              Else
                  Form1.Print Space(1); a(i);
              End If
              If i Mod 10 = 0 Then Form1.Print
          Next i
          '统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来
          For i = 1 To 100
              p = a(i)  Mod  10    ' 求个位上的数字
              If p = 0 Then p = 10
              x(p) = x(p) + 1
          Next i
          Form1.Print "统计结果"
          For i = 1 To 10
              p = i
              If i = 10 Then p = 0
              Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"
          Next i
      End Sub
      
    二、求两个整数的最大公约数、最小公倍数

    分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
           (1) 对于已知两数m,n,使得m>n;
           (2)  m除以n得余数r;
           (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
           (4) m←n,n←r,再重复执行(2)。
         例如: 求 m=14 ,n=6 的最大公约数.        m      n        r
                                            14      6       2
                                                 6       2       0
      m=inputBox("m=")
      n=inputBox("n=")
      nm=n*m
      If m < n Then t = m: m = n: n = t
        r=m mod n
        Do While (r <> 0)                               
             m=n
             n=r
             r= m mod n
        Loop
        Print "最大公约数=", n
      Print "最小公倍数=", nm/n
    三、判断素数
      只能被1或本身整除的数称为素数  基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
         m =val( InputBox("请输入一个数"))
              For i=2 To int(sqr(m))
                   If m Mod i = 0 Then    Exit  For
               Next i
              If i > int(sqr(m)) Then
                  Print "该数是素数"
              Else

    Print "该数不是素数"
              End If
       将其写成一函数,若为素数返回True,不是则返回False
          Private Function Prime( m as Integer)  As  Boolean
                      Dim  i%          
                      Prime=True
                      For i=2 To int(sqr(m))
                          If m Mod i = 0 Then   Prime=False:  Exit  For
                      Next i
                 End Function

       

    四、验证哥德巴赫猜想
      (任意一个大于等于6的偶数都可以分解为两个素数之和)
       基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2   再检验n1、n2是否素数,… 直到n1=n/2为止。
       利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
      Dim  n%,n1%,n2%
           n=Val(InputBox("输入大于6的正整数"))
           For n1=3 to n step 2
              n2=n-n1
              If  prime(n1)   Then
                   If  prime(n2) then 
                        Print n & "=" & n1 & "+" & n2
                        Exit For                                '结束循环
                   End if
               End if

    Next  n1

    五、排序问题
      1.选择法排序(升序)
      基本思想:
       1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
       2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
       3)依次类推,选择了n-1次后,这个数列已按升序排列。
                 
      程序代码如下:
      For i = 1 To n - 1
            imin = i
            For j = i + 1 To n
                If a(imin) > a(j) Then imin = j
            Next j
            temp = a(i)
            a(i) = a(imin)
            a(imin) = temp
      Next I
      
      2.冒泡法排序(升序)
        基本思想:(将相邻两个数比较,小的调到前头)
       1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
       2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
       3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
       程序段如下
    For i = 1 To n - 1
       For j = 1 To n-i
            If a(j) > a(j+1) Then
               temp=a(j): a(j)=a(j+1): a(j+1)=temp
            End if
       Next j
    Next i

      
      3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)
      基本思想:
       1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
       2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
       3)将另一个数组剩余元素抄入C数组,合并排序完成。
    程序段如下:
       Do While ia <= UBound(A) And ib <= UBound(B)   '当A和B数组均未比较完
              If A(ia) < B(ib) Then
                    C(ic) = A(ia):  ia = ia + 1
              Else
                    C(ic) = B(ib):  ib = ib + 1
              End If
              ic = ic + 1

    Loop
        Do While ia <= UBound(A)    'A数组中的剩余元素抄入C数组
              C(ic) = A(ia)
              ia = ia + 1:   ic = ic + 1
        Loop
        Do While ib <= UBound(B)   'B数组中的剩余元素抄入C数组
               C(ic) = B(ib)
                ib = ib + 1:  ic = ic + 1
        Loop


    六、查找问题
      1.①顺序查找法(在一列数中查找某数x)
        基本思想:一列数放在数组a(1)---a(n)中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a(p),则使p=p+1,不断重复这个过程;一旦x等于a(p)则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)
          p = 1
          Do While x <> a(p) And p < =n
              p = p + 1
          Loop
    下面写一查找函数Find,若找到则返回下标值,找不到返回0
    Option Base 1
    Private Function Find( a( ) As Single,x As Single)  As Integer
          Dim n%,p%
          n=Ubound( a )
       p = 1
      Do While x <> a(p) And p < =n
             p = p + 1
      Loop
          If  p>n then  p=0
           Find=p
     End Function   

    ②基本思想:一列数放在数组a(1)---a(n)中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)
    Public Sub Search(a() As Variant, key As Variant, index%)
      Dim i%
      For i = LBound(a) To UBound(a)
        If key = a(i) Then
          index = i
          Exit Sub
        End If
      Next i
        index = -1
    End Sub

    2.折半查找法(只能对有序数列进行查找)
    基本思想:设n个有序数(从小到大)存放在数组a(1)----a(n)中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
    (1)x=a(mid),则已找到退出循环,否则进行下面的判断;
    (2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
    (3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
    (4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。

    将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回-1。
      Function search(a() As Integer, x As Integer) As Integer
          Dim bot%, top%, mid%
          Dim find As Boolean   '代表是否找到
          bot = LBound(a)
          top = UBound(a)
          find = False          '判断是否找到的逻辑变量,初值为False
          Do While bot <= top And Not find
               mid = (top + bot)  2
              If x = a(mid) Then
                  find = True
                  Exit Do
                ElseIf x < a(mid) Then
                    top = mid - 1
                  Else
                    bot = mid + 1
                  End If
              Loop
          If find Then
             search = mid
           Else
             search = -1
          End If
    End Function

      
    七、插入法
      把一个数插到有序数列中,插入后数列仍然有序
      基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。首先确定x插在数组中的位置P;(可由以下语句实现)
      p=1
      do while x>a(p) and p<=n
      p=p+1
      loop
      a(p)—a(n)元素向后顺移一个位置以空出a(p)元素放入x,可由以下语句实现:
      for i=n to p  step-1
        a(i+1)=a(i)
      next i
      a(p)=x
      将其写成一插入函数
       Private Sub Instert(a() As Single, x As Single)
                Dim p%, n%, i%
                n = UBound(a)
                ReDim Preserve a(n + 1)
                p = 0
                Do While x > a(p) And p < =n    ' 确定x应插入的位置
                      p = p + 1

    Loop
                For i = n To p Step -1
                  a(i + 1) = a(i)
                Next i
                a(p) = x
         End Sub

      
    八、矩阵(二维数组)运算
       (1)矩阵的加、减运算
               C(i,j)=a(i,j)+b(i,j)           加法
               C(i,j)=a(i,j)-b(i,j)            减法
      
       (2)矩阵相乘
      (矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。矩阵C中任一元素   (i=1,2,…,m;   j=1,2,…,n)
    For i = 0 To m                            
    For j = 0 To n                             
          c(i, j) = 0                             
           For k = 0 To l                          
            c(i, j) = c(i, j) + a(i, k) * b(k, j)           
          Next k                                
      Next j                               
     Next i             

    (3)矩阵传置
    例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:
    For i=1 to 5                  (2) For i=2 to 5
    For j=i+1 to 5                  For j=1 to i
      t=a(i,j)                       t=a(i,j)
      a(i,j)= a(j,i)                         a(i,j)= a(j,i)
      a(j,i)=t                             a(j,i)=t
    Next j                     Next j
    Next i                       Next i

     (4)求二维数组中最小元素及其所在的行和列                                                                                                         
    基本思路同一维数组,可用下面程序段实现(以二维数组a(2,3)为例):
    ‘变量max中存放最大值,row,column存放最大值所在行列号
    Max = a(1, 1): row = 1: Column = 1
    For i = 1 To 2
        For j = 1 To 3
            If a(i, j) > a(row, Column) Then
                Max = a(i, j)
                row = i
                Column = j
            End If
        Next j
    Next i
    Print "最大元素是"; Max
    Print "在第" & row & "行,"; "第" & Column & "列"
    九、迭代法
       算法思想:

    对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解。
    例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为:
    Private Function Fsqrt( a As single ) AS single
    Dim x0 As Single, x1 As Single
         x0 =a/2          '迭代初值
         x1 = 0.5*(x0 + a/x0)
         Do
                x0 = x1   '为下一次迭代作准备
                x1 = 0.5*(x0 + a/x0)
        Loop While Abs(x1 - x0) > 0.00001
        Fsqrt=x1
    End Function
    十、数制转换
         将一个十进制整数m转换成 →r(2-16)进制字符串。
      方法:将m不断除 r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
     Private Function TrDec(idec As Integer, ibase As Integer) As String
         Dim strDecR$, iDecR%
         strDecR = ""
         Do While idec <> 0
              iDecR = idec Mod ibase
              If iDecR >= 10 Then
                 strDecR = Chr$(65 + iDecR - 10) & strDecR
              Else
                 strDecR = iDecR & strDecR
              End If
              idec = idec  ibase
        Loop
       TrDec = strDecR
     End Function
    十一、字符串的一般处理
    1.简单加密和解密
     
    加密的思想是:
      将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式: c=chr(Asc(c)+k)
        例如序数k为5,这时 "A"→ "F", "a"→?"f","B"→?"G"…
        当加序数后的字母超过"Z"或"z"则 c=Chr(Asc(c)+k -26)
             例如:You  are  good→ Dtz   fwj  ltti
     
       解密为加密的逆过程
        将每个字母C减(或加)一序数K,即 c=chr(Asc(c)-k),
        例如序数k为5,这时 "Z"→"U", "z"→"u","Y"→"T"…

    当加序数后的字母小于"A"或"a"则 c=Chr(Asc(c)-k +26)
    下段程序是加密处理:
    i = 1:   strp = ""
    nL = Len(RTrim(strI))
    Do While (i <= nL)
           strT = Mid$(strI, i, 1)     '取第i个字符
           If (strT >= "A" And strT <= "Z") Then
                 iA = Asc(strT) + 5
                 If iA > Asc("Z") Then iA = iA - 26
                 strp = strp + Chr$(iA)
           ElseIf (strT >= "a" And strT <= "z") Then
                  iA = Asc(strT) + 5
                  If iA > Asc("z") Then iA = iA - 26
                  strp = strp + Chr$(iA)
                Else
            strp = strp + strT
            End If
            i = i + 1
        Loop
    Print strp

    2.统计文本单词的个数
     
    算法思路:
     (1)从文本(字符串)的左边开始,取出一个字符;设逻辑量WT表示所取字符是否是单词内的字符,初值设为False
     (2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True则表是新单词的开始,让单词数Nw=Nw+1,让WT=True;
     (3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符, 则表示字符不是单词内字符,让WT=False;
    (4) 再依次取下一个字符,重得(2)(3)直到文本结束。
    下面程序段是字符串strI中包含的单词数
    Nw = 0: Wt = False
    nL = Len(RTrim(strI))
    For i = 1 To nL
          strT = Mid$(strI, i, 1)     '取第i个字符
          Select Case strT
                Case " ", ",", ";", "!"
                      Wt = False
                Case Else
                      If Not Wt Then
                           Nw = Nw + 1

    Wt = True
                      End If
           End Select
    Next i
    Print "单词数为:", Nw

    十二、穷举法
      穷举法(又称“枚举法”)的基本思想是:一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
      例: 将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
    Dim i%, j%, k%
    Print "5元             1元          0.5元"
    For i = 1 To 20
            For j = 1 To 100 - i
                   k = 100 - i - j
                   If 5.0 * i + 1.0 * j + 0.5 * k = 100 Then
                       Print i, j, k
                   End If
             Next j
       Next i

    十三、递归算法
      用自身的结构来描述自身,称递归
      VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
         递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。
      例:编fac(n)=n! 的递归函数
          Function fac(n As Integer) As Integer
              If n = 1 Then
             fac = 1
              Else
          fac = n * fac(n - 1)
              End If
           End Function 

    转载于:https://www.cnblogs.com/redfox241/archive/2008/04/15/1154841.html

    展开全文
  • 看实例学VB6.0

    千次阅读 2005-02-13 20:35:00
    一、熟悉VB 6.0的编程环境 二、掌握VB常用控件的使用方法 三、试着开发简单的VB应用程序--看实例学VB 6.0--认识一下VB 6.0的编程环境-- VB6.0采用可视化的编程环境,它好学易用,运行VB6.0后,会出现如下图所示的...

      一、熟悉VB 6.0的编程环境
      二、掌握VB常用控件的使用方法
      三、试着开发简单的VB应用程序


    --看实例学VB 6.0--认识一下VB 6.0的编程环境--

      VB6.0采用可视化的编程环境,它好学易用,运行VB6.0后,会出现如下图所示的窗口,呵呵,看起来蛮复杂的,好多的按钮、菜单、小窗口,别担心,待会儿我们会一起学习这些东东都是干什么用的。

      先来解决一个小问题,怎么新建一个VB的工程呢?方法是这样的,在程序启动时出现的“新建工程”对话框中选择“标准EXE”并点击确定,就能直接新建一个工程,如果你跳过了这个对话框则也可从“文件”菜单中选择“新建工程”重新调出此对话框。

      下面来看看VB的编程环境,虽然看起来复杂,但可以把它分为几个部分,每个部分都有自己特定的功能,这样就清楚多了。其实VB这是通过这样一个界面把相近或同类的功能组合在一起的,它使我们在设计程序时能方便的控制程序的方方面面。

    vbfull.gif

      窗体的最上层是“VB 6.0的菜单”和“便捷工具按钮”,菜单中包含了所有的VB提供的功能的选项,而其中一些常用的功能或操作选项则被提取出来放在了“便捷工具按钮”中,通过点击这些快捷按钮可以加快程序开发的速度,下图标出了常见的工具按钮的作用,记着使用它们哦。

    toolbar.gif

      接着看看“VB的组件面板”和“窗体设计区域”,VB提供了方便的窗体设计区域,它位于整个编程窗口的中间。我们可以在这个区域中搭建出美观实用的程序界面,试着从“VB的组件面板”中找到“按钮CommandButton”,点击选中后,再到“窗体设计区域”的窗体上点一下,这时,窗体上会出现一个按钮,这样我们就把按钮添加到我们程序的界面中了。嘻嘻,忘了告诉你哪里是“VB的组件面板”了,就是最左边的那一条包含许多看起来眼熟的小东西的区域,它是VB提供给我们的标准的编程组件(控件),它把程序设计中常常用到的诸如按钮、图片框、列表框等等东西作好了放在那里,我们如果要使用只须添加到窗体中即可。

      屏幕的右边有三个从上到下排列的小窗口,它们分别是:

    proman.gif  “VB工程管理器”:用来管理开发一个VB程序所需要的各种类型的窗体和模块,如左图是一个工程所包含的东西,窗体是一个程序表现在外面的界面、模块是程序内部使用的代码。

      当我们点击“添加窗体”便捷工具按钮后,左图的“VB工程管理器”中就会显示出新添加的窗体,这也就是“VB工程管理器”的功能,它使我们从总体上把握程序开发的各个部分。

    property.gif

     

      “组件属性窗口”:用来显示组件的属性,并允许我们修改,设定这些属性的值,我们在窗体设计区域的窗体上选中一个组件,以按钮为例,则在“属性窗口”中会列出它的属性,我们可以看到常用的“Name”、“Capition”、“Font”等等属性,试着把“Capition”属性改为“这是一个按钮”,然后看看“窗体设计区域”的按钮上显示的文字是不是改变了。

     

    arrange.gif


      “窗体布局窗口”:调整程序运行时,程序窗体在屏幕中的初始位置,把鼠标移到左图屏幕中的窗体上,这时鼠标会变成移动形状,拖动窗体,就设置好了运行时此窗体的位置。

      好了说了这么多,还差一个区域没讲,那就是“代码编辑区域”,当我们在“窗体设计区域”双击鼠标,就能弹出这个区域,可以看到一行行的VB程序显示在其中,我们可以修改,写入程序代码,来让程序实现一定的功能,它是整个程序设计的关键,如果你对VB语言的语法还不是十分了解,可以继续下一节专门对“VB语法”的讲解,别着急,慢慢来,很快就能入门的。


    --看实例学VB 6.0--VB的简单语法学习--

      VB语言的语法和QBASIC基本一致,可以说如果你能读懂QBASIC程序,那你读VB的程序是没有问题的,这一节中我们只是简单的讲一讲VB的语法,因为在今后的各个实例中我们会不断接触到新的语法知识,这也是一个积累的过程。

      如果你还记得上节中的内容,我们提到过如果在“窗体设计区域”的某个组件(控件)上双击鼠标,会出现“代码编辑窗口”,也就是如下图的窗口,我们可以在其中输入或是修改程序的代码。在我们双击控件到写入代码的这个过程中,我们涉及到了一个很重要的概念,这是VB与QBASIC的主要差别之一,大家知道在QBASIC包括Tubro C,TubroPascal等语言中程序从一开始就需要我们一点点的写代码来实现所有的功能,比如程序运行的界面,输入输出,键盘控制等,它们在程序中体现为一个个的过程或者是函数及子程序,它们都是完全面向过程的编程语言;但是现在的VB、VC、DELPHI等编程语言,都提供了可视化的编程环境,备有一整套常见的组件(控件)供我们使用,这些控件可以看作是对象(VB严格的说不是完全面向对象的编程语言),我们写程序时会直接与这些对象打交道,而不象原来。所以在VB中大部分的代码是与这些相关的,例如下图所示的一段代码,它是我们在一个按钮(Command)上双击鼠标而由VB自动产生的一个子过程,Private Sub Command1_Click()是子过程的开始,End Sub表示子过程的结束。然后我们可以在子过程中添加程序代码,也就是由我们自己来写当按钮被点击时,程序所做出的响应。

    代码

      下面我们便来分析一下这段代码。

      VB中声明一个变量使用“Dim 变量名 As 变量类型”的方法,一般在程序中使用的到的变量都应该有变量声明,如上例中的a、b、i分别被定义为整型和字符串型变量,VB中的变量类型有以下几种:

       数据类型  说明
       Byte    二进制数
       Boolean   真假值
       Integer   整数
       Long    长整型
       Single   实数
       Double   双精度型
       Currency  货币
       Date    日期和时间
       Object   对象
       String   字符串
       Variant  可变类型

      控制结构和循环结构是程序设计中常见的两种结构。

      计算机在运行程序的时候,执行语句的顺序是从上向下的。 有些简单程序可以只用单向流程来编写,但稍微复杂的程序就要靠控制语句来控制程序执行的流程。控制结构主要有两种,分支结构和循环结构。

      分支结构:分支结构事实上是一种选择,在不同的条件下选择执行不同的程序段。实现分支结构的语句有很多,最常用的是if……then……else……。例如:

       ……
       if 条件 then
       {程序段一}
       else
       {程序段二}
       end if
       ……

      如果条件满足了,电脑将执行程序段一中的语句,然后跳过程序段二,执行下面的语句。如果条件不满足,电脑将跳过程序段一种的语句,执行程序段二,然后继续执行下面的语句。

      循环结构:循环结构就是让电脑反复的执行某一程序段落干次。 用Do……Loop可以循环重复执行一语句块,且重复次数不定。 在已知循环次数的条件下,用For……next可以反复执行统一语句块。

      以上两种结构你可以参照图中所示的代码,仔细体会一下,今天就讲这么多了,下节我们就要进入实例式的控件学习。


    --看实例学VB6.0--简单的文本框TEXTBOX的例子--

      文本框控件(TextBox)是VB中最常用的控件。它是显示和输入文本的容器,相当于一个文字编辑器,提供了所有基本的文字处理功能,例如文本的编辑等。在下面这个小程序中,我们能看到文本框控件(TextBox)的最基本的属性。

      为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:

    <TEXTAREA οnmοuseοver=this.focus() οnfοcus=this.select() name=textfield rows=7 readOnly cols=80>Option Explicit '-------------------------------------- ' TextBox的常用属性的例子 '-------------------------------------- ' 洪恩在线 求知无限 '-------------------------------------- '------名称-------------作用------------ ' CmdClear 清除文本框内容按钮 ' TextAll 文本框 ' CmdOK 给窗体FormBack的TextAll文本框赋值 ' FormTextBox 主窗体 '-------------------------------------- '-------------------------------------- '————文本框名称————属性设置——— ' ' TextPassWord PassWordChar为 * ' TextResume Multiline为Ture, ScrollBars为2 -Vertical ' TextAll Multiline为Ture, ScrollBars为2 -Vertical ' Appearance为0 - Flat '-------------------------------------- Private Sub CmdClear_Click() '清除所有文本框中的内容 TextID.Text = "" TextPassWord.Text = "" TextName.Text = "" TextMail.Text = "" TextResume.Text = "" End Sub Private Sub CmdOK_Click() '把FormTextBox文本框的Text及标签的Caption赋给 '窗体FormBack中TextAll文本框的Text属性 FormBack.TextAll.Text = LblID.Caption & " " & TextID.Text _ & vbNewLine & _ LblPassWord.Caption & " " & TextPassWord.Text _ & vbNewLine & _ LblName.Caption & " " & TextName.Text _ & vbNewLine & _ LblMail.Caption & " " & TextMail.Text _ & vbNewLine & _ LblResume.Caption & " " _ <P align=center> & vbNewLine & TextResume.Text</P> '其中vbNewline是使TextAll.Text换行显示 Load FormBack '载入窗体Formback FormBack.Show '显示窗体Formback FormTxtBox.Visible = False '设置窗体FormtextBox不可见 End Sub </TEXTAREA>



      这个例子的两个窗体界面如下:

    窗体1 窗体2

    主窗体(FormTxtBox)

    窗体(FormBack)


      我们首先新建一个标准的EXE工程。添加两个窗体,并把TextBox、Button、Label控件放置在窗体上。各文本框的名称如下表:

    文本框名称

    名称属性

    文本框名称

    名称属性

    会员编号文本框

    TextID

    电子邮件文本框

    TextMail

    密码文本框

    TextPassWord

    个人介绍文本框

    TextResume

    姓名文本框

    TextName

    会员信息文本框

    TextAll


      在属性窗口中将TextPassWord的PassWordChar属性设为*;
    TextResume的Multiline属性设为Ture,ScrollBars属性设为2 -Vertical;TextAll文本框的Multiline属性设为为Ture, ScrollBars属性设为2 -Vertical,Appearance属性设为为0 - Flat。

      下一步我们为FormTxtBox窗体中“确定”(CmdOK)和“清除”(CmdClear)按钮的Click事件中添加相应的程序。

      其中:

      TextID.Text = "" 是把会员编号文本框中的内容清空,其它语句与此类似。

      FormBack.TextAll.Text = LblID.Caption & " " & TextID.Text _ & vbNewLine &

      该语句设置FormBack窗体中TextAll文本框的文本。vbNewLine是换行显示标志。“ _”是续行标志,当语句一行写不下时使用此标志,但要注意:前面要加空格。

      代码写好之后,我们就可以保存工程,然后按“Ctrl+F5”键,测试检验一下我们的程序了。


    --看实例学VB6.0--简单的列表框ListBox的例子--

      列表框(ListBox)控件表示一个选项清单,用户可能用鼠标选择其中一个或者几个选项。

      列表框的特点是:列表框中的项目是通过程序插入到其中的,用户无法向清单中输入数据,当选择其中的项目,并在用户单击一个按钮或者执行某个操作时,由应用程序完成对指定项目的具体操作。下面这个例子充分说明了列表框的这个特点,并介绍了列表框(ListBox)的常用属性。

      为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:

    <TEXTAREA οnmοuseοver=this.focus() οnfοcus=this.select() name=textfield rows=7 readOnly cols=80>Option Explicit '-------------------------------------- ' 简单的列表框ListBox的例子 '-------------------------------------- ' 洪恩在线 求知无限 '-------------------------------------- '------名称-------------作用------------ ' List1、List2 列表框 ' LefttoRightCmd 移动所选项目到另一个列表框(左到右) ' RighttoLeftCmd 移动所选项目到另一个列表框(右到左) ' List1MoveCmd 删除列表框List1中所选项目 ' List2MoveCmd 删除列表框List2中所选项目 ' List1AddCmd 给列表框List1增加新项目 ' List2AddCmd 给列表框List2增加新项目 ' List1ClearCmd 清空列表框List1 ' List2ClearCmd 清空列表框List2 '-------------------------------------- '-------------------------------------- '————名称————属性设置——— ' ' List1列表框 Sorted属性设为“False” ' List2列表框 Sorted属性设为“True” ' MultiSelect属性设置为2 ' 即List2控件中的项目总是排序的 '-------------------------------------- Private Sub Form_Load() '装载窗体时,给列表中的元素赋值 List1.AddItem "China" List1.AddItem "America" List1.AddItem "Japan" List2.AddItem "Soccer" List2.AddItem "Tennis" List2.AddItem "Basketball" End Sub Private Sub LefttoRightCmd_Click() '将左边列表中所选元素移动到右边列表中 If List1.ListIndex >= 0 Then '在右边列表中增加新元素 List2.AddItem List1.Text '删除左边列表中的所选元素 List1.RemoveItem List1.ListIndex End If End Sub Private Sub List1AddCmd_Click() Dim ListItem As String ' ListItem = InputBox("在列表中输入新项目") '向列表中加入新项目 If Trim(ListItem) <> "" Then 'Trim()作用是清除ListItem字符串内的空格 List1.AddItem ListItem End If End Sub Private Sub List1ClearCmd_Click() '清空列表 List1.Clear End Sub Private Sub List1MoveCmd_Click() Dim i As Integer '判断列表框是否只有一个项目被选中 If List1.SelCount = 1 Then List1.RemoveItem List1.ListIndex ElseIf List1.ListCount > 1 Then '删除列表框中的所选中的多个项目 For i = List1.ListCount - 1 To 0 Step -1 'ListCount返回列表框中的项目总数 'ListCount-1是列表框中最后一个项目的索引号 '判断该项目是否被选中,Selected()返回布尔值 If List1.Selected(i) Then '删除索引号为i的项目 List1.RemoveItem i End If Next End If End Sub Private Sub List2AddCmd_Click() '定义变量,以接收输入的字符串 Dim ListItem As String ListItem = InputBox("在列表中输入新项目") If Trim(ListItem) <> "" Then '将字符串增加到列表中 List2.AddItem ListItem End If End Sub Private Sub List2ClearCmd_Click() '清空列表 List2.Clear End Sub Private Sub List2MoveCmd_Click() Dim i As Integer '判断所选 元素是否只有一个 If List2.SelCount = 1 Then List2.RemoveItem List2.ListIndex '如果所选 元素大于1,则按下列操作进行 ElseIf List2.ListCount > 1 Then For i = List2.ListCount - 1 To 0 Step -1 If List2.Selected(i) Then List2.RemoveItem i End If Next i End If End Sub Private Sub RighttoLeftCmd_Click() Dim i As Integer '判断选中的元素有几个 If List2.SelCount = 1 Then List1.AddItem List2.Text List2.RemoveItem List2.ListIndex '当选中的元素大于一个时 ElseIf List2.SelCount > 1 Then For i = List2.ListCount - 1 To 0 Step -1 '如果该元素被选中,则将其从右边移至左边 If List2.Selected(i) Then List1.AddItem List2.List(i) List2.RemoveItem i End If Next i End If End Sub </TEXTAREA>


      这个例子包含一个窗体,窗体中有两个列表框(List1、List2)和八个按钮,界面如下:
    列表框应用程序

    窗体(FormListBox)


      我们首先新建一个标准的EXE工程,添加一个窗体,并把列表框和按钮控件添加到窗体上。各按钮控件的名称如下表:

    按钮名称

    名称属性

    按钮名称

    名称属性

    删除所选项目(左)

    List1movecmd

    删除所选项目(右)

    List2movecmd

    增加新项目(左)

    List1addcmd

    增加新项目(右)

    List2addcmd

    清除弄表(左)

    List1clearcmd

    清除列表(右)

    List2clearcmd

    右箭头 lefttorightcmd 左箭头 Righttoleftcmd


    ' List1列表框 Sorted属性设为“False” ' List2列表框 Sorted属性设为“True” ' MultiSelect属性设置为2 ' 即List2控件中的项目总是排序的

      在属性窗口中,将List1列表框 Sorted属性设为“False”;List2列表框 Sorted属性设为“True”,MultiSelect属性设置为2,即List2控件中的项目总是排序的。

      下一步我们为各控件添加相应的程序。

      其中:

      List1.AddItem "China" 是将“China”添加到列表框中。

      List1.ListIndex 返回的是列表框List1中当前选择项目的索引号码。

      List1.ListCount 返回的是列表框List1中项目总数。

      List1.ListCount - 1 返回列表框List1中最后一个项目的索引号。

      List1.Selected() 返回的是一个项目的选择状态,返回的是布尔值。

      代码写好之后,我们就可以保存工程,然后按“Ctrl+F5”键,测试检验一下我们的程序了。在这个小程序中,包含了列表框中的一般常用属性和方法。

      CommonDialog控件是常用的一个控件,它为我们提供了打开、另存为、字体、颜色、打印、帮助等几种类型的标准对话框,本例演示了所有这些类型的对话框的使用方法。

      为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:

    <TEXTAREA οnmοuseοver=this.focus() οnfοcus=this.select() name=textfield rows=7 readOnly cols=80>'------------------------------------------- ' 通用对话框使用方法全解 '------------------------------------------- ' 洪恩在线 求知无限 '------------------------------------------- '------名称-----------------作用------------- ' CdlTest 通用对话框 ' CmdOpen “打开”对话框按钮 ' CmdSave “另存为”对话框按钮 ' CmdFont “字体”对话框按钮 ' CmdColor “颜色”对话框按钮 ' CmdPrint “打印”对话框按钮 ' CmdHelp “帮助”对话框按钮 '------------------------------------------- '当“颜色”对话框按钮被按下时 Private Sub CmdColor_Click() On Error Resume Next CdlTest.CancelError = True CdlTest.Flags = cdlCCRGBInit CdlTest.ShowColor If Err = cdlCancel Then Exit Sub TextBoxColor.ForeColor = CdlTest.Color End Sub '当“字体”对话框按钮被按下时 Private Sub CmdFont_Click() On Error Resume Next '当用户按下“取消”按钮,返回一个错误信息,这样使我们可以对其进行控制 CdlTest.CancelError = True '此句必须要 CdlTest.Flags = cdlCFBoth + cdlCFEffects '显示“字体”对话框 CdlTest.ShowFont '出现“取消”错误时,跳出 If Err = cdlCancel Then Exit Sub Else '将TextBox的字体属性根据“字体”对话框的变化作相应设置 '如果用户选择了字体才将字体改变,避免字体为空的错误 If CdlTest.FontName <> "" Then TextBoxFont.FontName = CdlTest.FontName End If TextBoxFont.FontSize = CdlTest.FontSize TextBoxFont.FontBold = CdlTest.FontBold TextBoxFont.FontItalic = CdlTest.FontItalic TextBoxFont.FontStrikethru = CdlTest.FontStrikethru TextBoxFont.FontUnderline = CdlTest.FontUnderline End If End Sub '当“帮助”对话框按钮被按下时 Private Sub CmdHelp_Click() On Error Resume Next '设置 HelpCommand 属性,显示 Visual Basic 帮助目录主题 CdlTest.HelpCommand = cdlHelpForceFile '指定帮助文件 Dim fullpath As String If Right(App.Path, 1) = "/" Then ' 若 App.Path 为根目录 fullpath = App.Path + "test.hlp" Else fullpath = App.Path + "/" + "test.hlp" End If '上面是得到应用程序所在路径的小技巧 CdlTest.HelpFile = fullpath '显示“帮助”对话框 CdlTest.ShowHelp End Sub '当“打开”对话框按钮被按下时 Private Sub CmdOpen_Click() '出现错误时跳到下一语句 On Error Resume Next CdlTest.CancelError = True '属性DialogTitle是要弹出的对话框的标题 CdlTest.DialogTitle = "打开文件" '缺省的文件名为空 CdlTest.FileName = "" '属性Filter是文件滤器,返回或设置在对话框的类型列表框中所显示的过滤器。 '语法object.Filter [= 文件类型描述1 |filter1 |文件类型描述2 |filter2...] CdlTest.Filter = "文本文件(.txt)|*.txt" 'Flags属性的用法依据不同的对话框而变,详细使用需要查找联机帮助手册 CdlTest.Flags = cdlOFNCreatePrompt + cdlOFNHideReadOnly CdlTest.ShowOpen If Err = cdlCancel Then Exit Sub TextBoxOPen.Text = CdlTest.FileName End Sub '当“打印”对话框按钮被按下时 Private Sub CmdPrint_Click() On Error Resume Next CdlTest.CancelError = True '显示“打印”对话框 CdlTest.ShowPrinter If Err = cdlCancel Then Exit Sub End Sub '当“保存”对话框按钮被按下时 Private Sub CmdSave_Click() On Error Resume Next CdlTest.CancelError = True CdlTest.DialogTitle = "保存文件" CdlTest.FileName = "" '解释见上面 CdlTest.Filter = "文本文件(*.txt)|*.txt" CdlTest.Flags = cdlOFNCreatePrompt + cdlOFNHideReadOnly CdlTest.ShowSave If Err = cdlCancel Then Exit Sub TextBoxSave.Text = CdlTest.FileName End Sub </TEXTAREA>


      如果控件面板中没有CommonDialog控件的小图标,必须先从“添加控件对话框”中添加,下面我们来看看怎样调用不同类型的对话框。


    --看实例学VB6.0--CommomDialog使用的例子--

      CommonDialog控件有一系列的Show方法,例如:ShowOpen、ShowSave、ShowFont、ShowColor、ShowPrinter、ShowHelp等,这些方法的使用语法是类似的,如下所示:

      object.ShowOpen,我们只须在程序中写入这个语句,就能调出“打开”对话框,同样也能调用其它类型的对话框。

      而CommonDialog控件的属性是和不同的对话框类型紧密相关的,有些属性只适用于某一类对话框,有些属性在不同的对话框中的属性是有差别的,所以下面分类列出了和不同对话框相关联的属性的用法。

      与ShowOpen、ShowSave方法相关的属性:
      FileName属性:返回或设置所选文件的路径和文件名,如果在使用Show方法以前使用FileName属性,则设定了对话框的默认文件名;如果是在以后使用则返回选择的文件名。
      使用语法是: CommonDialog.Filename[=pathname]
      Filter属性:返回或设置在对话框的类型列表框中所显示的过滤器(也就是限定打开或保存为的文件类型),它的使用语法是:
      object.Filter [= 描述文字1 |过滤标示1 |描述文字2 |过滤标示2]
      其中描述文字为任意文字,而 过滤标示则采用*.文件后缀(例如:*.bmp)的格式,描述文字和过滤标示之间用“|”隔开。
      DefaultExt属性:为该对话框返回或设置缺省的文件扩展名,也就是当我们没有指定打开或保存的文件类型时,按DefaultExt属性所设置的扩展名为默认值。

      与ShowFont方法相关的属性:
      Color选定的颜色。为使用此属性,必须先将Flags属性设置为cdlCFEffects。
      FontBold 是否选定“粗体”。
      FontItalic 是否选定“斜体”。
      FontStrikethru 是否选定删除线。
      FontUnderline 是否选定下划线。
      FontName 选定的字体名称。
      FontSize 选定的字体大小。
      使用的语法是直接引用,比如我们要根据“字体对话框”返回的值设置文本框的字体,则直接采用语句:Text.Font=CommonDialog.FontnName

      与ShowColor方法相关的属性:
      Color选定的颜色。为使用此属性,必须先将Flags属性设置为cdlCFEffects。

      与ShowHelp方法相关的属性:
      HelpCommand属性 返回或设置需要的联机帮助的类型
      HelpFile属性 确定帮助文件的路径和文件名
      语法是: object.HelpFile[ = filename]

      下面看看CancelError属性,它设置当选取“取消”按钮时是否认为出错,使用的语法是:CommonDialog.CancelError[= boolean] (boolean指布尔型变量)
      如果我们把它设为True,则当使用者选取了“取消”按钮时程序会返回一个cdlCancel错误,通过捕捉这个错误并加以处理,我们就能避免程序的出错。具体的使用可在源码中看到实例。


    --看实例学VB6.0--在状态栏中显示帮助信息--

      状态栏是VB中的一个很有用的控件,但是默认状态下它不在控件面板中,在我们使用它之前必须先添加,方法是按下Ctrl+T快捷键,在弹出的“Components”对话框中选中MS Windows Common Controls。这时在控件面板中会出现状态栏的小图标状态栏图标,双击此图标就能把它添加到窗体中。

    属性编辑框

      接下来我们根据自己的需要来编辑状态栏,选中窗体上的状态栏,在鼠标右键菜单中选择“属性Properties”,这时会弹出如上图所示的对话框,我们选择“Panels窗格”。其中“Insert Panel”按钮用来添加状态栏中的窗格数目,当我们添加一个窗格后“Index”的值也会自动加一,在程序中我们通过窗格的索引值来引用窗格。下面的一些项目都是窗格的属性,我们可以在此设置也可在程序中控制它。比较常用的属性有:
      “Text”--在各个窗格中显示的文字;
      “Alignment”--窗格中文本的对齐方式;
      “Style”窗格的样式(选择0-sbrText为显示文本,选择6-sbrDate为显示日期等等);
      “Bevel”--窗格的凹凸状态。
      另外我们还可以在窗格中加入图片,方法是点击“Browse”然后选中图片文件。

      在本程序中我们在第一个窗格中动态显示帮助信息,在第二、三个窗格中分别显示日期和时间。那么怎样在程序中控制状态栏中显示的文本呢?

      例如我们希望鼠标移动到不同的按钮上时状态栏的第一个窗格中显示不同的帮助,则我们在按钮的OnMouseOver事件中加入如下语句即可:
     Private Sub CmdNew_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       staSample.Panels(1).Text = ""
       staSample.Panels(1).Text = "清空文本框"
     End Sub

      同样的我们能为其它按钮等控件添加帮助信息。

      为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:


    <TEXTAREA οnmοuseοver=this.focus() οnfοcus=this.select() name=textfield rows=7 readOnly cols=80>'-------------------------------------- ' 一个使用StatusBar的例子 '-------------------------------------- ' 洪恩在线 求知无限 '-------------------------------------- '------名称-------------作用------------ ' CmdItalic “斜体”按钮 ' CmdBold “粗体”按钮 ' CmdExit “退出”按钮 ' CmdNew “重写”按钮 ' Text1 文本框 ' frmStatusBar 主窗体 ' staSample 状态栏 '-------------------------------------- Option Explicit '当“斜体”按钮按下时 Private Sub CmdItalic_Click() '将文本框中的字体设为斜体 Text1.FontItalic = True End Sub '当鼠标移动到“斜体”按钮上时 Private Sub CmdItalic_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '把状态栏的第一个Panels中的Text属性设为"转化为斜体"的帮助信息 staSample.Panels(1).Text = "" staSample.Panels(1).Text = "转化为斜体" End Sub '当“粗体”按钮按下时 Private Sub CmdBold_Click() '将文本框中的字体设为粗体 Text1.FontBold = True End Sub '当鼠标移动到“粗体”按钮上时 Private Sub CmdBold_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '把状态栏的第一个Panels中的Text属性设为"转化为粗体"的帮助信息 staSample.Panels(1).Text = "" staSample.Panels(1).Text = "转化为粗体" End Sub '当“退出”按钮按下时 Private Sub CmdExit_Click() '退出程序 Unload Me End Sub '当鼠标移动到“退出”按钮上时 Private Sub CmdExit_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '把状态栏的第一个Panels中的Text属性设为"退出程序"的帮助信息 staSample.Panels(1).Text = "" staSample.Panels(1).Text = "退出程序" End Sub '当“重写”按钮按下时 Private Sub CmdNew_Click() '将文本框中的文本清空 Text1.Text = "" Text1.FontBold = False Text1.FontItalic = False End Sub '当鼠标移动到“重写”按钮上时 Private Sub CmdNew_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '把状态栏的第一个Panels中的Text属性设为"清空文本框"的帮助信息 staSample.Panels(1).Text = "" staSample.Panels(1).Text = "清空文本框" End Sub Private Sub edit_Click() frmProperties.Show vbModal End Sub '当鼠标移动到文本框上时 Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '把状态栏的第一个Panels中的Text属性设为"输入文字"的帮助信息 staSample.Panels(1).Text = "" staSample.Panels(1).Text = "输入文字" End Sub </TEXTAREA>

    这样状态栏中就能动态显示帮助信息了。


    --看实例学VB6.0--使用右键菜单的例子--

      右键菜单能让软件的使用者快捷的完成操作,那么如何把右键菜单用在自己写的程序中呢?在这个小程序中我们能看到编辑并使用右键菜单的方法。

      为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:

    <TEXTAREA οnmοuseοver=this.focus() οnfοcus=this.select() name=textfield rows=7 readOnly cols=80>'-------------------------------------- ' 弹出鼠标右键菜单 '-------------------------------------- ' 洪恩在线 求知无限 '-------------------------------------- '------名称-------------作用------------ ' CmdCancel 退出按钮 ' mnublue “兰色”菜单项 ' mnured “红色”菜单项 ' RichTextBox1 文本框 ' PopupFrm 主窗体 ' mnufile 右键菜单的名字 '-------------------------------------- Private Sub CmdCancel_Click() Unload Me End Sub '当弹出式菜单的“红色”项被点击时 Private Sub mnured_Click() '把RichTextBox框中的背景色设置为红色 RichTextBox1.BackColor = vbRed End Sub '当弹出式菜单的“兰色”项被点击时 Private Sub mnublue_Click() '把RichTextBox框中的背景色设置为兰色 RichTextBox1.BackColor = vbBlue End Sub '当文本框上出现鼠标按下的事件时 Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 'MouseDown事件各种语法包含下列部分: 'button 返回一个整数,用来标识该事件的产生是按下哪个按钮 '其中 左按钮(位 0),右按钮(位 2),以及中间按钮(位 4) 'shift 返回一个整数,标示是否同时有Shift,Ctrl,Alt键按下 'x, y 返回一个指定鼠标指针当前位置的数 'Button = 2 表示右键按下 If Button = 2 Then 'PopupMenu方法用来弹出一个菜单 '语法是 object.PopupMenu menuname, flags, X, Y 'mnufile是我们在菜单编辑器中设计好的菜单 'X,Y是弹出菜单的位置,可以为数字,如果直接写为X,Y则是在当前鼠标位置弹出菜单 PopupFrm.PopupMenu mnufile, 0, X, Y End If End Sub </TEXTAREA>


      我们先打开菜单编辑器(在工具菜单中),然后添加一个一级菜单Popmenu,将它的Visible属性设为“False”,这代表菜单在程序运行时是看不到的,由于一级菜单是二级菜单的上级菜单,所以二级菜单也是看不到的。然后我们来添加几个二级菜单,注意每个菜单都有Caption属性和Name属性,这两个属性是必须写的,Caption属性是显示在菜单项上的内容,而Name属性则是我们要在程序中引用菜单项的代号,类似与其它控件的Name属性。而菜单中分隔线是通过把Caption属性设为“-”来实现的。

    编辑菜单

      菜单编辑好后,就能在程序中引用并控制它,在本例中我们希望在文本框上点击鼠标右键时弹出这个右键菜单,则需要在文本框的MouseDown事件中加入控制语句:

     Private Sub RichTextBox1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
     If Button = 2 Then          '如果是鼠标右键按下时
      Form1.PopupMenu mnufile, 0, X, Y  '弹出右键菜单
     End If
     End Sub

      其中MouseDown事件各个参数意义如下:

     button返回一个整数,用来标识该事件的产生是按下哪个按键,其中左键为0,右键为2,中间键为4
     shift 返回一个整数,标示是否同时有Shift,Ctrl,Alt键按下
     x, y 返回一个指定鼠标指针当前位置的数

      Popupmenu是一个方法:

     PopupMenu方法用来弹出一个菜单,语法是:object.PopupMenu menuname, flags, X, Y
     mnufile是我们在菜单编辑器中设计好的菜单的名称
     X,Y是弹出菜单的位置,可以为数字,如果直接写为X,Y则是在当前鼠标位置弹出菜单

      这样就能调出右键菜单,然后我们根据自己的需要,为每个菜单项的Click事件编写代码,完成一些特定的操作,右键菜单就可以使用了。最后效果如下图所示:

    效果演示



    展开全文
  • VB超强扑克牌电脑魔术——读懂你心源代码,一个小小把戏,主要想演示QCARD32.DLL绘制扑克牌的方法。感兴趣朋友试一下。... 程序窗体特效也是可以借鉴采用渐入渐出方式,窗体编程的朋友可以参考。
  • vbVC++开发(2)--COM异常与safecall

    千次阅读 2008-07-24 13:43:00
    在COM编程中正确处理COM异常,是增强程序鲁棒性基础。在delphi中有safecall概念,在vb中虽然没有提及此概念,但仍然在使用。... safecall首先是一个stdcall,也就是说COM组件暴露所有接口方法采用与w

        在COM编程中正确的处理COM异常,是增强程序鲁棒性的基础。在delphi中有safecall的概念,在vb中虽然没有提及此概念,但仍然在使用。在vc中,需要手工支持。那什么是safecall,与COM异常又有什么关系呢?

        safecall其实是约定了COM组件的提供者与调用者之间调用的方式。 safecall首先是一个stdcall,也就是说COM组件暴露的所有接口方法采用与windows API一致的stdcall调用约定。其次,safecall还要求接口方法均返回HRESULT错误代码,不能引发COM异常;调用者在调用接口方法后,均要检查HRESULT,对错误进行相应的处理。也就是说,safecall保证在方法内部封装了所有COM异常,调用者不必处理异常。

        

        例如:IProvider提供一个方法Echo,我们看不同语言不同范式的区别。

     

    vb

    'provider
    'vb封装了COM异常和HRESULT错误代码
    function Echo(sMessage as String) as String
        Echo=sMessage
    end function
    
    
    'caller
    'vb封装了对HRESULT错误代码的处理,如有错误引发COM异常
    on error resume next
    MsgBox Echo("Hello World!")
    
     

     

    vc++ -- 一般方式

    //provider
    //需要手工用try catch封装异常,保证所有错误均通过HRESULT返回
    HRESULT Echo(BSTR bstrMessage,BSTR* pbstrValue)
    {
        try
        {
             *pbstrValue=::SysAllocString(L"Hello World!");
         }
         catch(_com_error& e)
         {
              return e.Error();
         }
         return S_OK;
    }
    
    //caller
    
    //一般方式
    _bstr_t bstrValue;
    HRESULT hr=pProvider->Echo(_bstr_t(L"Hello World!"),bstrValue.GetAddress());
    if(FAILED(hr))
    {
        //这里有两种处理方式,
        //第一种,直接返回错误
        return hr;
    
        //第二种,返回异常,就像vb的方式一样
        _com_util::CheckError(hr);
    }
    
    //如果provider组件是通过#import导入的,可有如下的方式调用
    try
    {
        _bstr_t bstrValue=pProvider->Echo(L"Hello World!");
    }
    catch(_com_error& e)
    {
        return e.Error();
    }
    
    

     

    vb般的vc++

    //provider
    //采用自定义宏封装
    HRESULT Echo(BSTR bstrMessage,BSTR* pbstrValue)
    {
    __SAFECALL_BEGIN;
        *pbstrValue=::SysAllocString(L"Hello World!");
    __SAFECALL_END;
    }
    
    //caller
    //通过#import导入
    //如果是内部调用的方法,不必再检测com异常;
    //因为向外暴露的方法均通过safecall对com异常进行了封装
    _bstr_t bstrValue=pProvider->Echo(L"Hello World!");
    
    

     

    自定义宏

    #define __SAFECALL_BEGIN /
     try{/
      
    
    #define __SAFECALL_END /
      /
     }/
     catch(_com_error& e){/
      return e.Error();/
     }/
     catch(...){/
      return E_FAIL;/
     }/
     return S_OK
    
    
    

     

     

    展开全文
  • 编程的观点来看该方法什么用处,开发ActiveX 控件目的是为了资源共享,为了被其他开发人员利用,所以要提供必要事件接口, 显然利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender...
  • VB控件属性使用大全

    2011-12-15 12:02:34
    VisualBasic提供可视化设计工具,编程人员可利用VisualBasic提供的控件轻松的“画”出应用程序的友好界面,因此容易入门,入门以后就有能力进一步学习难度更大的编程语言。VisualBasic作为编程人员的首选程序设计...
  • 指令显然用汇编语言写成程序比机器语言好学也好记所以单片机指令普遍采用汇编指令来编写 用汇编语言写成程序我们就叫它源程序或源代码可是计算机不能识别和执行用汇编语言写成程 序啊怎么办当然有办法我们...
  • ASP.NET精品课程+源代码

    千次下载 热门讨论 2009-01-05 20:15:51
    在完成基本系统之后,还可在此基础上进行扩充,如ASP.NET中的网络的编程和多媒体的编程以及多线程技术等。 (3).案例的实施 在案例实施前,要对ASP.NET语言的基础知识、基本理论、基本特征、语法基础、程序编译作一下...
  • 简便统一的编程方法,对由菜单、按钮、提示框等组成的传统人机交互方式产生了很大影响, 在多媒体创作、Web应用、教育软件、软件帮助系统和辅助工具制作等方面,具有广阔的应用前景。 一、 Microsoft Agent技术...
  • VC实现炫眩qq界面模拟(附源码)

    千次下载 热门讨论 2008-03-10 15:24:28
    跟这个功能相类似是,我们聊天对话框有好几个按钮,它们拥有不一样外观,按理也应该绑定指定需要外观皮肤资源,于是,我们可以采用以下函数接口实现: BindRes2CtrlbyID(106,IDC_BUTTON_TALK_SERACH); 以上...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    18.2 在 C #代码中调用 C++和 VB 编写组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • C#微软培训资料

    2014-01-22 14:10:17
    18.2 在 C #代码中调用 C++和 VB 编写组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • Caché提供了比关系型技术更加高效的性能,更大的扩展性,更快速的编程能力和更加便捷的使用性能。 Caché不仅仅是一种纯的数据库技术。Caché包括一个应用服务器,这个服务器提供高级对象编程,并且可以很容易地与...
  • Caché技术手册

    2011-10-29 11:11:18
    Caché提供了比关系型技术更加高效的性能,更大的扩展性,更快速的编程能力和更加便捷的使用性能。 Caché不仅仅是一种纯的数据库技术。Caché包括一个应用服务器,这个服务器提供高级对象编程,并且可以很容易地与...
  • asp.net知识库

    2015-06-18 08:45:45
    采用XHTML和CSS设计可重用可换肤WEB站点 asp.net网址重定向方法的比较:面向搜索引擎友好 也谈 ASP.NET 1.1 中 QueryString 安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面...
  • 本书延续了Ivor Horton讲解编程语言独特方法,从中读者可以学习Visual C++ 2005基础知识,并全面掌握在MFC和Windows Forms中访问数据源技术。此外,本书各章后面习题将有助于读者温故而知新,并尽快成为C++...
  • c#学习笔记.txt

    2008-12-15 14:01:21
    看完了前面几段,我的朋友提出了不同的意见:C#不是Java的Clone,它只是长得有些像Java而已,其实面向对象、中间语言什么的也不是什么新玩意儿,非Sun独创,有文为证:华山论剑:C#对Java。另外他对我上一集中说...
  • 加密锁的驱动光盘中提供VC\VB\VFP\Delph\PB\CB等各种言的编程接口及详细的示例供客户参考。如果您有什么特殊要求可与我们联系。 外壳式 外壳加密是一种直接对可执行文件(.exe\.com\.dll)加密的加密方法。这种...
  • 1.2.4 有纪律严肃编程 1.3 真实世界中Ajax富客户端 1.3.1 现状 1.3.2 Google Maps 1.4 Ajax替代方案 1.4.1基于Macromedia Flash方案 1.4.2 Java Web Start及其相关技术 1.5 小结 1.6 资源 第2章 Ajax新手...
  • GSMMODE及二次开发空间

    2011-04-25 10:41:50
    也是为什么现在市场上有很多公司在出售短信猫,很多客户反映短信猫开发出来软件有问题,短信收发不稳定,很多销售公司只提供指令,并不包括提供实际编程开发语言和案例. 1,短信猫质量方面 市场上存在两种主流...
  • Java development with ant

    2008-03-28 12:34:36
    目前它已成为所有主要开源Java项目采用的独立工具,并已成了事实上标准.  本书作者是被SAM RUBY先生誉为“两个最了解ANT人”。他们将以最佳方式给你讲授Ant,从一个简单构建定义开始,然后展示加入你...
  • arcgis工具

    2012-10-22 22:37:31
    一般GPS系统采用的坐标系统为WGS_1984。 方法二.直接用TOOL工具下ADD XY 可以单个加点 17. 用任意多边形剪切栅格数据(矢量数据转换为栅格数据) 在ArcCatalog下新建一个要素类(要素类型为:多边形),命名为:...
  • 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版飞鸽传书软件,但是Java版确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能提升很有...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版飞鸽传书软件,但是Java版确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能提升很有帮助。 Java聊天程序,包括服务端和...
  • 本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去主机要采用正版杀毒软件,升过级才可以 49 四.识别常见病毒,病毒一般是以隐藏形式藏匿在计算机文件中,要把文件隐藏属性打开...
  • SQLServer2008查询性能优化 2/2

    热门讨论 2012-03-02 16:26:55
    通过阅读《SQL Server 2008查询性能优化》,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。 目录 第1章 SQL查询性能调整 1 1.1 性能调整...
  • 李锟 2006年4月4日于上海 <br/>目录 <br/>第一部分 重新思考Web应用 第1章 一种新Web设计方法 1.1 为什么需要Ajax富客户端? 1.1.1 比较用户体验 1.1.2 网络延迟 1.1.3...
  • 通过阅读《SQL Server 2008查询性能优化》,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。 目录 第1章 SQL查询性能调整 1 1.1 性能调整...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

vb采用什么的编程方法