vb6是一个典型的拖控件加代码的编程代表,因此也一直被认为难登大雅之堂,但是,在vb6中可以完全纯粹地使用代码控制这个窗体与窗体的控件。这样生成出来的控件位置摆放精确无比,无须拖好控件之后,再利用工具栏的“格式”菜单慢慢地调整大小。这种方式的确定是声明一个控件要耗费大量的代码,但其实Java中的Swing,HTML+CSS排放控件,比这好不了多少。
当然,比vc6中mfc的代码简单了不少,具体见《【mfc】基本对话框程序——加法器》(点击打开链接)
一、基本目标
利用纯粹代码,不拖控件的方式,完成如下的一个简单的四则运算器:
如果用户输入的两个项都是数,并且选择好相应的运算,点击等于按钮,则显示结果。否则,弹出告警框。
二、基本布局
如上图,此乃一个宽750px高100px的窗体。里面有两个输入文本框,一个下拉菜单,一个等于号,一个标签文本用来显示运算结果。
组件与组件之间有10px的留白。
其中两个输入文本框与下拉菜单,显示结构的标签文本的宽度分别为150px.
vb的标题栏为40px,在高100px的窗体里面,上下留白10px之后,每一个组件的高度为40px,除了已经给vb6设定为只读的下拉菜单,不能调整高度。
另外,等于按钮的高度与宽度皆为40px
三、制作过程
1、首先,由于vb6设定了最大化按钮是不可以用代码去修改的。因此只能一开始在Form1的属性栏的MaxButton属性设置为False,禁用最大化按钮。则按F7唤出代码窗口。
2、一开始,在开头先声明一下自己需要动态生成的组件。这些声明不要写在Form_Load()函数之后。
让所有动态生成的控件作为全局变量,以致于这个组件可以被调用。
由于这些组件并不是拖出来的。vb6根本就不会为你在系统内注册这些组件。
其中输入文本框Text1,Text2,下拉菜单Combo1,标签文本Label1皆没有事件,只是其它事件需要获取其属性,因此普通声明即可。
而Command1由于是有点击事件的,因此必须这样声明,Command1才拥有CommandButton控件的所有事件过程。
Dim Text1 As TextBox Dim Combo1 As ComboBox Dim Text2 As TextBox Dim WithEvents Command1 As CommandButton Dim Label1 As Label3、之后是Form1的初始化函数,这个函数其实就是一直在声明各个组件与各个组件该有的属性,核心就一句Set xx=Controls.Add,把某某组件加入到Form1里面。值得注意的是vb6代码与代码之间的分割是一个回车,而不是;之类的。
Private Sub Form_Load() '设置窗体的标题,尺寸为750px x 100px Form1.Caption = "四则运算" Form1.Width = 7500 Form1.Height = 1000 '初始化输入框1 Set Text1 = Controls.Add("VB.TextBox","Text1",Form1) Text1.Text = "" Text1.Width = 1500 'vb窗体的标题栏长40px,其整个窗体为100px高,那么上下留白10px,再搞个100px高的控件就对了 Text1.Height = 400 Text1.Top = 100 Text1.Left = 100 '动态创建的控件默认都是不显示的,必须有这行 Text1.Visible = True '初始化下拉列表 Set Combo1 = Controls.Add("VB.ComboBox","Combo1",Form1) Combo1.Width = 1500 'ComboBox的高度是固定,不可以设置,因此这里就不进行设置了 Combo1.Top = 100 Combo1.Left = 1700 Combo1.Visible = True Combo1.AddItem "+" Combo1.AddItem "-" Combo1.AddItem "*" Combo1.AddItem "/" Combo1.Text = "+" '初始化输入框2 Set Text2 = Controls.Add("VB.TextBox","Text2",Form1) Text2.Text = "" Text2.Width = 1500 Text2.Height = 400 Text2.Top = 100 Text2.Left = 3300 Text2.Visible = True '初始化按钮 Set Command1 = Controls.Add("VB.CommandButton","Command1",Form1) Command1.Caption = "=" Command1.Width = 400 Command1.Height = 400 Command1.Top = 100 Command1.Left = 4900 Command1.Visible = True '初始化结果标签 Set Label1 = Controls.Add("VB.Label","Label1",Form1) Label1.Width = 1500 Label1.Height = 400 Label1.Top = 100 Label1.Left = 5400 Label1.Visible = False '由于一开始没有结果,因此无须显示Label1 End Sub4、最后是Command1的点击过程。我们还需要写一个vb的过程Command1_Click(),这个过程逻辑很简单,先获取Text1与Text2的控件里面的东西,用IsNumeric()函数判断其是否是数,如果不是,则用MsgBox弹窗给出提示。如果是,则利用Select case的条件结构,给出各项结构。这个条件结构就是C、Java等语言的Switch...case结构,但这里无须加上break;使用val()函数,把组件中的值转换成函数,这里与vbscript的编程也就是asp基本上是一样的。
Private Sub Command1_Click() '先判断用户输入的是否是数 If (IsNumeric(Text1.Text)) And (IsNumeric(Text2.Text)) Then '如果是数,则取下拉列表的值,进行运算 Select Case Combo1.Text Case "+": Label1.Caption = Val(Text1.Text) + Val(Text2.Text) Label1.Visible = True Case "-": Label1.Caption = Val(Text1.Text) - Val(Text2.Text) Label1.Visible = True Case "*": Label1.Caption = Val(Text1.Text) * Val(Text2.Text) Label1.Visible = True Case "/": Label1.Caption = Val(Text1.Text) / Val(Text2.Text) Label1.Visible = True End Select '如果输入的不是数,则弹出提示 Else MsgBox "你输入的,任意一个不是数" End If End Sub
至此,整个vb6利用代码动态生成控件的方式已经说完,这里,阐述了在vb6如果动态生成控件,并为这些动态生成的控件绑定事件的方法。其核心是,注意在开头为这些组件声明全局变量。如果你手工拖控件,vb6则自动为你生成并注册这些控件。如果控件少的情况下,这种生成方式,显然不够拖控件的方式快,但是,如果控件多,要配合循环生成,这是一种解决方案。