一次帮朋友写VB程序引发的深思

今天帮朋友写VB小程序,一回过头,才知道几乎全不记得了.

这个.所以现在贴一点VB的语法上来吧.真无法

VB有2种方法可以一次性的将字符串放入数组中:

方法一:
a=array("abc","abcd","ttt")

方法二:
b="abc,abcd,ttt"
a=split(b,",")

Select Case <变量名>
case <变量值>
进行的事件...

case <变量值>
进行的事件...

case <变量值>
进行的事件...

case <变量值>
进行的事件...

case else
进行的事件...

End Select //过程结束

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

VB 里的 select 语句和 C++ 里的 switch 语句相同
不过 每一个"Case"结束时无需 <break> 切记!!

动态添加控件

示例1

Option Explicit
Dim oCtrl As Object
'使得控件可以响应事件
Dim WithEvents MyBtn As CommandButton
Private Sub Form_Load()
Dim i As Integer
'先在窗体上加载个Label1(0)的标签控件
For i = 1 To 3
Load Me.Label1(i)
Label1(i).Top = Label1(i - 1).Top + 2 * Label1(0).Height
Label1(i).Caption = "Label1(" & i & ")"
Label1(i).Visible = True
Next
'Debug.Print Me.Label1.Count
LoadControl
LoadControlWithEvents
End Sub
Private Sub LoadControl()
Set oCtrl = Controls.Add("VB.CommandButton", "Button1")
With oCtrl
.Caption = "不会响应事件的按钮"
.Width = 2000
.Left = 100
.Top = 200
.Visible = True '控件加载后默认为不可见,故此步骤至关重要!
End With
End Sub
Private Sub LoadControlWithEvents()
Set MyBtn = Controls.Add("VB.CommandButton", "Button2")
With MyBtn
.Caption = "我可以响应事件!"
.Width = 1800
.Left = 100
.Top = 700
.Visible = True
End With
End Sub
Private Sub MyBtn_Click()
MsgBox "我要移除动态加载的控件了!"
Me.Controls.Remove "Button1"
Me.Controls.Remove "Button2"
End Sub

示例2

如果你想动态地增加控件,必须在设计阶段将控件放入Form,但可以将Visible属性设为False,将控件的Index属性设为0(即设置为控件数组)。然后在运行时使用Load方法加入控件。如下面这段代码:
Private Sub btnAdd_Click()
Static n As Integer

If n <>0 Then Load Label1(n)
Label1(n).Move 300, 200 + n *500
Label1(n).Visible = True
n = n + 1
End Sub
这段代码表示,当用户每按一次按钮时添加一个Label控制。
使用Unload可以动态删除控件数组中的控件。
在VB 6.0中,可以实现你的愿望,因为Form.Controls集合包括了Add方法、Remove方法。例如:
Option Explicit
Private WithEvents btnObj As CommandButton

Private Sub btnObj_Click()
MsgBox "这是动态添加的按钮。"
End Sub

Private Sub Form_Load()
Set btnObj = Controls.Add("VB.CommandButton", "btnObj")
With btnObj
.Visible = True
.Width = 2000
.Caption = "Hello"
.Top = 1000
.Left = 1000
End With
End Sub
这里使用WithEvent指定动态添加的控件的事件。

示例3

'添加两个控件: Command1 Command2
'在属性窗口将 Command2 改名为 CmdZu,并设置 Index 属性为 0
Private Sub Command1_Click()
'控件组有多个成员,卸载之
If CmdZu.Count > 1 Then
'卸载控件 CmdZu 1-5,0不能卸载,因为是设计时添加的
For I = 1 To 5
Unload CmdZu(I)
Next
Exit Sub
End If

'装载控件组的成员,1-5号
For I = 1 To 5
Load CmdZu(I)
CmdZu(I).Visible = True
CmdZu(I).Move CmdZu(0).Left, CmdZu(0).Top + CmdZu(0).Height * I * 1.1
CmdZu(I).Caption = "钮" & I
Next
End Sub

问题:

     我有几万条数据,大致类型如下: 

     东风牌DH25090XXbg1G型车厢客可变车 
     嘉陵JH100-12两轮摩托车 
     VOLVO牌B7R670型客车底盘 

     基本上就是这样的...我现在想把每条数据分成三个部分,即前面汉字部分(包括汉字前的英文数字),中间英文数字部分,后面汉字部分

解答:

假设你的数据是存在c盘的1.txt,且每行为1条数据..
新建工程,1个按钮,3个list,
我在代码中使用了3个数组,分别是tmp1,tmp2和tmp3,用来存放提取出来的数据..

在代码前部使用了
ReDim Tmp1(100)
ReDim Tmp2(100)
ReDim Tmp3(100)
这里我给了一个100的初值,你可以根据数据量给定一个初值的,大于你的数据量就行,多了也无所谓..这样做的好处是提高效率,不然后读取每行后,逐行来redim preserve数组的话,效率很低.

后面这个:
ReDim Preserve Tmp1(i - 1)
ReDim Preserve Tmp2(i - 1)
ReDim Preserve Tmp3(i - 1)
就是将数组中多余的无用数组删除..

我后面放了list显示的部分,只是演示提取效果,你在实际运用得到tmp1,tmp2,tmp3以后,可以不需要后面的代码了..



====================全部完整代码===================

ContractedBlock.gif ExpandedBlockStart.gif Code
Const Fgf$ = "VB妮可无敌分隔符" 

Private Sub Command1_Click() 
Dim a$, b, Tmp1$(), Tmp2$(), Tmp3$(), i% 

ReDim Tmp1(100
ReDim Tmp2(100
ReDim Tmp3(100

Open 
"c:\1.txt" For Input As #1 
Do Until EOF(1
Line 
Input #1, a 
If a <> "" Then 
= LoveVb(a) 
= Split(a, Fgf) 
Tmp1(i) 
= b(0
Tmp2(i) 
= b(1
Tmp3(i) 
= b(2
= i + 1 
End If 
Loop 

Close #
1 

ReDim Preserve Tmp1(i - 1
ReDim Preserve Tmp2(i - 1
ReDim Preserve Tmp3(i - 1

List1.Clear 
List2.Clear 
List3.Clear 

For i = 0 To UBound(Tmp1) 
List1.AddItem Tmp1(i) 
List2.AddItem Tmp2(i) 
List3.AddItem Tmp3(i) 
Next 
End Sub 

Private Sub Form_Load() 
Command1.Caption 
= "提取" 
End Sub 

Function LoveVb$(s$) 
Dim i%, j%, m% 
For i = 1 To Len(s) 
= Asc(Mid(s, i, 1)) 
If m < 0 Or m > 255 Then 
= i 
= Asc(Mid(s, j + 11)) 
If m > 0 And m < 255 Then Exit For 
End If 
Next 

= Left(s, j) & Fgf & Right(s, Len(s) - j) 

For i = Len(s) To 1 Step -1 
= Asc(Mid(s, i, 1)) 
If m < 0 Or m > 255 Then 
= i 
= Asc(Mid(s, j - 11)) 
If m > 0 And m < 255 Then Exit For 
End If 
Next 

= j - 1 
LoveVb 
= Left(s, j) & Fgf & Right(s, Len(s) - j) 
End Function 

 

在vb中,return语句并不是用在函数的返回值上,这一点跟C和C++不同。主要用在下面两个语句:
1) GoSub...Return 语句
语法:
GoSub line
...
line:
...
Return
必要的 line 参数可以是任何行标签或行号
说明:
可以在过程中的任何地方使用 GoSub 和 Return,但是 GoSub 和与之相应的 Return 语句必须放在同一个过程中。一个子程序中可以包含一个以上的 Return 语句,但是当碰到第一个 Return 语句时,程序就会返回到紧接在刚刚执行的 GoSub 语句之后的语句继续执行。

注意: 不能使用 GoSub...Return 来进入或退出 Sub 过程。

提示: 创建分开的过程,并使用 GoSub...Return 来调用,可以使程序更具结构化。
示例:
Sub GosubDemo()
Dim Num
' 请求用户输入一个数字。
Num = InputBox("Enter a positive number to be divided by 2.")
' 如果用户输入一个正整型,则使用子程序。
If Num > 0 Then GoSub MyRoutine
Debug.Print Num
Exit Sub ' 使用 Exit 命令来避免错误发生。
MyRoutine:
Num = Num/2 ' 将数除以 2。
Return ' 将控制返回 GoSub 之后的语句。
End Sub

2) On...GoSub + Return 语句
语法:
On expression GoSub destinationlist
expression: 必要参数。数值表达式,其运算结果应该是一个界于 0 到 255 之间的整数,包含 0 和 255。如果 expression 的计算结果不是一个整数,则它会先四舍五入为一个整数。
destinationlist: 必要参数。行号或行标签的列表,之间要以逗号隔开。
说明:
expression 的值会决定转到 destinationlist 中的哪一行。如果 expression 的值小于 1 或大于列表的项目个数,则会产生下面的结果之一:
等于 0: 控制权会转移到 On...GoSub 之后的语句。
大于串的项目个数: 控制权会转移到 On...GoSub 之后的语句。
负数: 会发生错误。
大于 255:会发生错误。
可以在同一个列表中混合使用行号和行标签。在 On...GoSub 中也可随意使用任意个行号和行标签。但是,如果使用了太多的行标签或行号,以至于在一行中放不下,那么就必须在一行后使用续行符来衔接到下一行。
示例:
Sub OnGosubGotoDemo()
Dim Number, MyString
Number = 2 ' 设置变量初值。
' Branch to Sub2.
On Number GoSub Sub1, Sub2 ' 在 On...GoSub 退出后,程序会回到此处来继续完成。
Exit Sub
Sub1:
MyString = "In Sub1" : Return
Sub2:
MyString = "In Sub2" : Return
End Sub


 

 

其他:

1.mshflexgrid控件与msflexgrid控件的异同   
     mshflexgrid控件与adodc控件绑定,msflexgrid控件与data控件绑定。   
     mshflexgrid控件属于ado的范畴,msflexgrid控件属于dao的范畴   
    
2.mshflexgrid控件的应用   
  如果记录集已经在程序中产生,则可以不与adodc控件绑定,直接在mshflexgrid控件中显示数据,并且可以根据需要设置控件中行的颜色   
  工程--->引用--->Microsoft   ActiveX   Data   Object   2.x(版本号)   

 1 Dim    CN        As     New    ADODB.Connection                                  ' 定义数据库的连接   
 2 Dim    Rs        As     New    ADODB.Recordset   
 3     
 4 CN.ConnectionString    =     " Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=D:\NWIND.MDB;Persist   Security   Info=False "    
 5 CN.Open   
 6     
 7 Rs.CursorLocation    =    adUseClient   
 8 Rs.Open    " select   *   from   employees " ,   CN,   adOpenDynamic,   adLockBatchOptimistic   
 9     
10 Set    MSHFlexGrid1.DataSource    =    Rs   
 

转载于:https://www.cnblogs.com/acis_/archive/2008/12/29/1364225.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值