你的位置:创意公社- ideaer >> >> 程序开发 >> 详细内容 在线投稿

VB编程基础教程14–控制结构

排行榜 打印 发给朋友 举报 发布者:sv8837
热度471票  浏览114次 【共0条评论】【我要评论 时间:2010年6月05日 09:28

^J*yYLhe1控制结构概述
:wp D b"~y!e1有了控制结构就可控制程序执行的流程。如果未复选控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。创意公社- ideaerI.H1r"MxX
创意公社- ideaer&wkvl}]-VHI
创意公社- ideaer"a\(G iy,K b\

c Fk9_Z#B4E*A1判定结构
@?c-A UZIq1visual basic 过程能够测试条件式,然后根据测试结果执行不同的操作。visual basic 支持的判定结构有:
PaE'Y&?%`X._ }1if…then
x?)N)v"dU1
3N&jDZQ SO1if…then…else创意公社- ideaer&~L R.X:^5ELj
创意公社- ideaer]5R+q;P#Gh
select case
;B\ A c/_O4Ht1if…then创意公社- ideaer+p ao&@2au}x)`
用 if…then 结构有条件地执行一个或多个语句。单行语法和多行块语法都可以使用:
&xmCU6IY7Y-q1if condition then statement创意公社- ideaer}[,\? \^!U@\`
if condition then创意公社- ideaers&b4c^9PoS/d
statements
4~(G3Da5b:G:U0W-G"U1end if创意公社- ideaer-M:IF*TWx
condition 通常是比较式,但它可以是任何计算数值的表达式。visual basic 将这个值解释为 true 或 false:一个为零的数值为 false,而任何非零数值都被看作 true。若 condition 为 true,则 visual basic 执行 then 关键字后面的所有 statements。可以使用单行或多行语法有条件地执行一个语句(下面两个例子等价):
:m:r nG;^4RB7@1if anydate < now then anydate = now
pat(|_%al q1if anydate < now then创意公社- ideaerZV5t,FNde)M0Tv9S
   anydate = now创意公社- ideaerW%@0rI4U+t4z7a%h
end if创意公社- ideaerb5W*w.GH V#yWZ-Y_
注意:if…then 的单行格式不用 end if 语句。如果 condition 为 true 时要执行多行代码,则必须使用多行块 if…then…end if 语法。创意公社- ideaersD Eh(wQ9U!i-^z;|
if anydate < now then
(?]u'~mn0qA1   anydate = now创意公社- ideaerC.I]W#F#eu
   timer1.enabled = false         ‘定时器控制失效。创意公社- ideaer5Hzg0}aX
end if
+V-M_*j,w [1if…then…else创意公社- ideaer!R:{9g3L*N|HHW
用 if…then…else 块定义几个语句块,执行其中一个语句:
2T|`@,T.iNT1if condition1 then
|$E3C(M @1[statementblock-1]创意公社- ideaer{AVYtC$r
[elseif condition2 then创意公社- ideaer0W*k-xHY_.HN
[statementblock-2]] …创意公社- ideaer@!]n)Spe]
[else
lr0b(At3R m \/q1[statementblock-n]]
/tu D i:vi1end if创意公社- ideaer#IzbzIHXR }
visual basic 首先测试 condition1。如果它为 false,visual basic就测试 condition2,依次类推,直到找到一个为 true 的条件。当它找到一个为 true 的条件时,visual basic就会执行相应的语句块,然后执行 end if 后面的代码。作为一个选择,可以包含 else 语句块,如果条件都不是 true,则 visual basic 执行 else 语句块。
oC j^Y!j1if…then…elseif 只是 if…then…else 的一个特例。注意,可以使用任意数量的 elseif 子句,或者一个也不用。可以有一个 else 子句,而不管有没有 elseif 子句。创意公社- ideaerXi%u4D#Y j P~,K
例如,应用程序可以根据菜单控件数组中哪个控件被单击而采取相应的动作:创意公社- ideaer^Sv6z;Y0\?&[
private sub mnucut_click (index as integer)
WmY5\-d s,t1   if index = 0 then            ’“剪切”命令。
O1Hm*q$T0G,n1      copyactivecontrol         ‘调用通用过程。创意公社- ideaer8F-r9c Gb A^'U i7z
      clearactivecontrol创意公社- ideaernIj|5D/G;v
   elseif index = 1 then      ’“复制”命令。
7J |Ck p:yldp5uea1      copyactivecontrol创意公社- ideaerUy,g4Tn
   elseif index = 2 then      ‘“清除”命令。创意公社- ideaerk:^X)s1hhY&x
      clearactivecontrol
:KqDM#w)Af)B1   else                        ’“粘贴”命令。创意公社- ideaerRi&|lq$h+f
      pasteactivecontrol创意公社- ideaer)IG\ |-p4S
   end if
[,^/|n4xU@1end sub
N-@ X w d6hp+L1注意,总是可以添加更多的 elseif 块到 if…then 结构中去。但是,当每个 elseif 都将相同的表达式比作不同的数值时,这个结构编写起来很乏味。在这种情况下可以使用 select case 判定结构。
(PchD:?#T)_~[1详细信息 请参阅语言参考中的“if…then…else 语句”。创意公社- ideaer&ItbB"rd
select case
?;A.F{Z1visual basic 提供 select case 结构替代 if…then…else,从而可在多个语句块中有选择地执行其中一个。select case 语句的能力与 if…then…else 语句类似,但对多重选择的情况,select case 语句使代码更加易读。
oUHby1select case 在结构的上方处理一个测试表达式并只计算一次。然后,visual basic 将表达式的值与结构中的每个 case 的值进行比较。如果相等,就执行与该 case 相关联的语句块。创意公社- ideaerj:S,Wt/M_h8S9}
select case testexpression
#?7U"O*~v/@h2o1[case expressionlist1
1}9`0\8Iw;Z h1[statementblock-1]]创意公社- ideaer/I0o#mQjK
[case expressionlist2
4O8n_w7{:l1[statementblock-2]]创意公社- ideaerY/B^1@ vG9d
.
.\%YW s?L:k(GC1.
)Y7o[}${s-C1.创意公社- ideaeroHF2Jo0Y1yg"vj
[case else创意公社- ideaerB8Nm1u ? M
[statementblock-n]]创意公社- ideaerkv2Hn&ZL8X{YM1v
end select
8C/K*E.q3K`c1每一个 expressionlist 是一个或几个值的列表。如果在一个列表中有多个值,就用逗号把值隔开。每一个 statementblock 中含有零个或多个语句。如果不止一个 case与测试表达式相匹配,则只对第一个匹配的 case 执行与之相关联的语句块。如果在表达式列表中没有一个值与测试表达式相匹配,则 visual basic 执行 case else 子句(此项是可选的)中的语句。
2[;o JB.x5A;dN1例如,假定在 if…then…else 的例子中要向“编辑”菜单添加命令。为此可以另加一个 elseif 子句,或用 select case 来写函数:
"p_0GY%Q1private sub mnucut_click (index as integer)
7Z2G~!O5FAuVq1   select case index
`{ mX9T)r)T1      case 0                  ‘“剪切”命令。
"l!C5q xt6q1      copyactivecontrol         ’调用通用过程。创意公社- ideaer_+mg(xws6|EK.W
         clearactivecontrol
tN7~ Ja Qf6{1      case 1                  ‘“复制”命令。
*R)H/@'r~NY1         copyactivecontrol
9v/AU(@Z m1      case 2                  ’“清除”命令。创意公社- ideaerdFe#e)B7TK`1`z
         clearactivecontrol创意公社- ideaeryp/X,r!`?
      case 3                  ‘“粘贴”命令。创意公社- ideaer'^2f+yI$|i+Q] ~
         pasteactivecontrol
gX8D)q5Fz1      case else创意公社- ideaery2bZMK i"bh
         frmfind.show            ’显示找到的对话框。
NB{@2n#R pr1   end select
wm*y"L'{hW }1end sub
`,^ hh0\1注意 select case 结构每次都要在开始处计算表达式的值。而 if…then…else 结构为每个 elseif 语句计算不同的表达式。只有在 if 语句和每一个 elseif 语句计算相同表达式时,才能用 select case 结构替换 if…then…else 结构。
$JR1BD q ` J+K&E1
7p*em+H[ Xw-m r$u1
4fF"i'~!^G#M1
'O(VR ] v;r2a)xY1循环结构
5~ B`0p z&m2i1循环结构允许重复执行一行或数行代码。visual basic 支持的循环结构有:
6Jb$O&vbz~tMp8Mm1do…loop
J$iT;CHlj|6u1创意公社- ideaerH)r*xkh;Z s
for…next
9nQfv;W&Z1|bZ1
+ZjOy1^ a ]3Z1for each…next 创意公社- ideaer8XCs ~8@Zr9mS
do…loop创意公社- ideaer(C$u z(}M%tF;WI
用 do 循环重复执行一语句块,且重复次数不定。do…loop 语句有几种演变形式,但每种都计算数值条件以决定是否继续执行。如同 if…then condition 必须是一个数值或者值为 true(非零)或 false(零)的表达式。创意公社- ideaerv+Q,S,O ~sp
在下面的 do…loop 循环中,只要 condition 为 true 就执行 statements。创意公社- ideaer'j2s;cA-l
do while condition创意公社- ideaer5B-d NQ@8tN8Q
statements创意公社- ideaerb9|E&NKw r.?
loop创意公社- ideaer"`:F;P*c)P
当 visual basic 执行这个 do 循环时会首先测试 condition。如果 condition 为 false(零),则跳过所有语句。如果 condition 为 true(非零),则 visual basic 执行语句,然后退回到 do while 语句再测试条件。创意公社- ideaer,?j m2eF:s#i
因此,只要 condition 为 true 或非零,循环可以随意执行多少次。如果 condition 一开始便为 false,则不会执行语句。例如,以下过程将计算某一目标字符串在另一字符串中出现的次数,只要发现目标串就执行循环:创意公社- ideaerNR z*tWN6^
function countstrings (longstring, target)创意公社- ideaer2d.N/TZ6i-a9K L
   dim position, count
Y~5e@+yVgG1   position = 1创意公社- ideaer!rFQ} O8Z
   do while instr (position, longstring, target)
1W/q7[d9Qs1      position = instr(position, longstring, target)_
I#\[ X'`3d8D1FnA t1       + 1创意公社- ideaer7p-j W_~y*j"z
      count = count + 1创意公社- ideaer,Sr9sKk6tD a\
   loop创意公社- ideaer"s6H?.T|t9W*j0mcf
   countstrings = count
k0x+F@g;C2R,@S S1end function
4k4{\2dNc9Q@1如果目标字符串未出现在另一个字符串中,则 instr 返回 0,而且不再执行循环。
@/c5{ b3P&A.Wi+~ p1do…loop 语句的另一种演变形式是先执行语句,然后在每次执行后测试 condition。这种形式保证 statements 至少执行一次:创意公社- ideaer-UOQ7|D!u"O
do创意公社- ideaery@\-mM B
statements创意公社- ideaerE*kc"d(^hUr2`
loop while condition
1CkE,}8R8_1x1其它两种演变形式类似于前两个,所不同的是,只要 condition 为 false 而不是 true,它们就执行循环。创意公社- ideaerP&eO9CA8AmOm
循环零次或多次 至少循环一次 创意公社- ideaerY gS,Iv ?
do until condition
UX[z.m$Ata'N~%S-AY5N1statements
S$t a!^;zoi1loop do创意公社- ideaer {7Z?.L-T(J3L |
statements创意公社- ideaerz:nLQ/c W
loop until condition 创意公社- ideaer0|4m$tBV'D%R?
创意公社- ideaer-KK2A&p,r`:A
.创意公社- ideaer_&i H;?)i4OQ?
for…next创意公社- ideaer^L'Lr3s+~,Q~5^2y
在不知道循环内需要执行多少次语句时,宜用 do 循环。但是,在知道要执行多少次时,则最好使用 for…next 循环。与 do 循环不同, for 循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。for 循环的语法如下:
wby ?5OuP#bP1for counter = start to end [step increment]创意公社- ideaer9D(JzDC ZU1z
statements
2z,f [x.S6{#?9P x1next [counter]
"a*b:h9O.q1参数 counter、start、end 和 increment 都是数值型的。
5I{4c(A Q{1注意   increment 参数可正可负。如果 increment 为正,则 start 必须小于等于 end,否则不能执行循环内的语句。如果 increment 为负,则 start 必须大于等于 end,这样才能执行循环体。如果没有设置 step,则 increment 缺省值为 1。创意公社- ideaer5K2Pa+Mh \j @ u
在执行 for 循环时,visual basic 创意公社- ideaer}|B]\&Q+[
设置 counter 等于 start。创意公社- ideaer,[%bFM&T`9V LB

3D~#[%JK*X[iP1测试 counter 是否大于 end。若是的话,则 visual basic 退出循环。 创意公社- ideaerj"}9pa+?}Gc-e1F
(若 increment 为负,则 visual basic 测试 counter 是否小于 end。)
7i ?,E9we DF6\1执行语句。
Mt n,S5PkV/c1
GTy g1Tv/f9DF]1counter 增加一,或者增加 increment(如果已指定的话)。创意公社- ideaer/Q;rZT)B/v Y2j

i1ij:YT1重复步骤 2 到步骤 4。
#C%t/sWu)J5m'V&UN[1以下代码打印出所有有效的屏幕字体名:
ys~BRW$t1private sub form_click ()创意公社- ideaer+I%^.H/O/E/Z6C
   dim i as integer
4@C[*q NB&@5b1   for i = 0 to screen.fontcount
N9uu rg)p&{1      print screen.fonts (i)
H X J%\pG1   next
u9i9j a1U*f1end sub创意公社- ideaer;}+p;Nv@!q,S-Pp
在 vcr 示例应用程序中,highlightbutton 过程使用 for…next 循环,一步步经过 vcr 窗体的控件集合,并显示适当的 shape 控件:创意公社- ideaerq)w\(h@"P9e:z.y
sub highlightbutton (mycontrol as variant)创意公社- ideaer1v(Uut @6ug G;{
   dim i as integer
S;}3q&Y6l3^O6s6R b;r1   for i = 0 to frmvcr.controls.count – 1创意公社- ideaer8]X;O]QP
      if typeof frmvcr.controls (i) is shape then
$^ R'GD3}Lx1         if frmvcr.controls (i).name = mycontrol then
#OwT;zUil B l1TOr1            frmvcr.controls (i).visible = true创意公社- ideaer:Y}$k3`\!m^TE
         else创意公社- ideaer9AO8H~6cAoN
            frmvcr.controls (i).visible = false
2@4r,m iy{I1G;v1         end if创意公社- ideaer!\?!D%h|F,z9@x[y
      end if创意公社- ideaer[Cd1kT cZe
   next
e7b)N!hG1end sub创意公社- ideaer~;x~ LK$g
for each…next
3]]+Fh#|1for each…next 循环与 for…next 循环类似,但它对数组或对象集合中的每一个元素重复一组语句,而不是重复语句一定的次数。如果不知道一个集合有多少元素, for each…next 循环非常有用。创意公社- ideaer)iRJp,dBv1v
for each…next 循环的语法如下:创意公社- ideaertgWJBG
for each element in group
*`/mz0gL1statements创意公社- ideaer$n3n tj!K g
next elementt创意公社- ideaeri}@(CA[
例如,下面的子过程打开 biblio.mdb,把每一个表的名字加到列表框中。
;t~"SE8i;p8J1sub listtabledefs ()创意公社- ideaer7A5b3H#t d
   dim objdb as database
8{]!Y\w l~x1      dim mytabledef as tabledef创意公社- ideaerQ~3_nY7~$B f#A
set objdb = opendatabase(“c:\vb\biblio.mdb”, _创意公社- ideaer3B/Z$T&lO]/j u {!g
   true, false)
nd$o:rb1   for each mytabledef in objdb.tabledefs ()
s_ tL iv-w[1      list1.additem mytabledef.name
W @y2[8J%m_:s1   next  mytabledef
$K)e&a)DXg1end sub创意公社- ideaer&Z5|qc-[Q
请记住使用 for each…next 时的几点限制: 创意公社- ideaer!CqcdO8t
对集合,element 只能是 variant 变量,或一般的 object 变量,或“对象浏览器”中列出的对象。创意公社- ideaerd5ZF+jrq

6p~1GV\AC1对数组,element 只能是 variant 变量。创意公社- ideaer/Z!fY|:j

1_$ld#B-e1for each…next 不能与用户自定义类型的数组一起使用,因为 variant 不可能包含用户自定义类型。
/}P&FC*oTlu1
N/z$qvq*x1
6qc;B4fq X f1
/v Y]|7E'py1创意公社- ideaer AA-x;st3j6g8Bz$r
使用控制结构
2v8C_H{!@7q-MD1嵌套控制结构创意公社- ideaer;C2H3n{:P3U@g
可以把控制结构放入另一个控制结构之内(例如在 for…next 循环中的 if…then 块)。一个控制结构内部包含另一个控制结构叫做 nest(嵌套)。创意公社- ideaer:^g`fy4C
在 visual basic 中,控制结构的嵌套层数没有限制。按一般习惯,为了使判定结构和循环结构更具可读性,总是用缩排方式书写判定结构或循环的正文部分。
+UVe8B{}9u@N+f9a1例如,下面的过程要把打印机和屏幕共有的字体名全部打印出来:
:W!V9y'b0j$e_1private sub form_click ()
8n2R*V#k_:p/l/Q1   dim sfont, pfont创意公社- ideaer"G.@w/p9i!`r
   for each sfont in screen.fonts ()创意公社- ideaery$`~ug\ d2B
      for each pfont in printer.fonts ()
:R/zuahcF"eT1         if sfont = pfont then创意公社- ideaer;C0O*IO8u
            print sfont
!KOk$Qd1         end if
K#f}S F&X$p4`1      next pfont
4v8qM_\7O&W1   next sfont
e"R0kw2igA3B+B1end sub
7N2c/^G/K O3a-wA;R9t"K `1注意,第一个 next 关闭了内层的 for 循环,而最后一个 for 关闭了外层的 for 循环。同样,在嵌套的 if 语句中,end if 语句自动与最靠近的前一个 if 语句配对。嵌套的 do…loop 结构的工作方式也是一样的,最内圈的 loop 语句与最内圈的 do 语句匹配。
7?6^uG'f_"Pm5s1退出控制结构创意公社- ideaeruH(G$h @5E@ r d
用 exit 语句可以直接退出 for 循环、do 循环、子过程或函数过程。exit 语句的语法很简单:exit for 在 for 循环中出现的次数没有限制,exit do 在 do 循环中出现的次数也没有限制。
D@ ^:g6fE2L1for counter = start to end [step increment]
6SX&A2TR6}&]d;{q&S%b1[statementblock]创意公社- ideaerLv-M"@ s.}&sZ
[exit for]
;k+kWF[)U!w.FL!u1[statementblock]创意公社- ideaerin[-A+U
next [counter[, counter] [,...]]
` o&RWR4qoAZ4]yf8v1do [{while | until} condition]
v7fr W?1[statementblock]创意公社- ideaerIy)|c2Gm U3U
[exit do]
n;Sj-I4gS+G1[statementblock]创意公社- ideaerhy1K5|$JG`(m$^
loop创意公社- ideaer Qi5hJ?t*x hQC*?V)]
exit do 语句可以在 do 循环语法的所有版本中使用。
]Au}l^R b1exit for 和 exit do 非常有用,因为它有时适于立即退出循环,而且不再执行循环中的任何进一步迭代或者语句。例如,在前面的打印屏幕和打印机共有字体的例子中,程序不断将打印机字体和给定的屏幕字体作比较,甚至在已经找到了一个相符的打字机字体后还在继续寻找。对这个函数有一个效率更高的改进版,在此,只要找到相匹配的字体后就立即退出循环:
y%J[3~Sz3t&BU+D1private sub form_click ()创意公社- ideaer0EY ^ h-A
   dim sfont, pfont创意公社- ideaer ~ e\v B J
   for each sfont in screen.fonts ()
&M f*W#lbJ"A1      for each pfont in printer.fonts ()
;rLq"U$BGT1         if sfont = pfont then创意公社- ideaerBxd1j"T0E4x(`g Y
            print sfont创意公社- ideaer8sW Nwo/v!F8bh
            exit for            ‘退出内圈循环。创意公社- ideaer'a8@%J8av0Cz il
         end if创意公社- ideaerYq?P1iS
      next pfont创意公社- ideaerB8Iv\B
   next sfont创意公社- ideaer_4].xxp'Wu.`2D J
end sub
P7~TEx9A.X4i O1}1正如此例所表明的, exit 语句几乎总是出现在 if 语句或 select case 语句内部,而 if 语句或 select case 语句在循环内嵌套。
P dVw%C:~}1用 exit 语句中断循环时,计数器变量的值会因退出循环的方式而不同:
!E B1Y-S)m Hx9kEq1在完成循环时,计数器的值等于上限值加上步进值。
xT-W_4p1
-NO \!b9C1}"t ^S"mv1在提前退出循环时,计数器变量保持其值,并遵从有关取值范围的一般规则。创意公社- ideaer%i l:n-lG}x

"a9{8`j5x n!W1在集合之外叠代时,如果计数器变量为 object 类型,则其值为 nothing;如果计数器变量为 variant 类型,则其值为 empty。 创意公社- ideaer(q4orPM3N
退出子过程或函数过程创意公社- ideaer)A4xLN+BCp U
也可从控制结构内部退出过程。exit sub 和 exit function 的语法,和上一节“退出控制结构”中的 exit for 和 exit do 相似。exit sub 可以出现在子过程主体内的任何地方,出现的次数随需要而定。
'X[*GO`'`t(T1当过程已完成每个任务并可直接返回时,exit sub 和 exit function 是非常有用的。例如,如果想改动前面的例子,使得对查找到的打印机和屏幕的共有字体,只打印其中的第一个,则可用 exit sub :
jf|+j5?l[ _&c W~ d1private sub form_click ()
bL+G^)Z3g,x;y1   dim sfont, pfont
o5l;B `+YT~{1   for each sfont in screen.fonts ()创意公社- ideaer'r.p.bhWs+KR
      for each pfont in printer.fonts ()创意公社- ideaer H'l"F.iT
         if sfont = pfont then
a#h T*F0y&C1            print sfont
n(^$u`g1            exit sub            ’退出过程。
G9X3e3rt5_Y/g1         end if创意公社- ideaer3s h/o*O [2X
      next pfont
P~5t2Q:?1   next sfont
~&A@SWLVSZq]1end sub创意公社- ideaer$wy1~z1Vxq+?Taci

顶:14 踩:52
对本文中的事件或人物打分:
当前平均分:-1.16 (154次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.52 (90次打分)
【已经有161人表态】
50票
感动
15票
路过
16票
高兴
16票
难过
15票
搞笑
14票
愤怒
16票
无聊
19票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】