VB网格中输入数据 山东 周庆斌 |
VISUAL BASIC提供的网格控制(Grid)主要是用来直观地输出数据,但不能输入数据,使用起来很不方便。能不能向网格中输入数据呢?笔者提出了两种解决方法,供大家参考: 方法一: 改写网格的KeyPress事件,在每次有合法字符输入时,把Grid的Text项和输入字符连接。这种方法缺点是:一代码较复杂,需要处理各种ASCII字符信息;二是通过编程只能实现很少的编辑功能,如用退格键删除前一字符,用Del键删除所有字符;三是这种方法不能输入汉字,使用起来受到很大的限制。 方法二: 利用一文本框作为缓冲,实现编辑功能。当网格改变行列时,把网格当前行列的内容传递给文本框;当网格中有ASCII字符产生时,把输入焦点设置为文本框,并把输入的ASCII字符送给文本框;当编辑完文本框的内容时,按Enter键或TAB键,把文本框的内容送给网格的当前行列,并把输入焦点设置为网格。如下程序所示(其中Textl为文本框,Labell为标签,Gridl为网格): Option Explicit Const EnterAsc=13 Const TabAsc=9 Private Sub Form-Load() Labell.Caption=”请输入” End Sub Private Sub Gridl-KeyPress(KeyAscii As Integer) Text1.StFocus Textl.SelStart=0 If KeyAscii <> EnterAsc And KeyAscii <> TabAsc Then SendKeys Chr (KeyAscii) End IF End Sub Private Sub Gridl-RowColChange() Textl.Text=Grid1.Text End Sub Private Sub Text1-KeyPress(KeyAscii As Integer) If KeyAscii=EnterAsc Then Grid1.SetFocus KeyAscii=0 End If End Sub Private Sub Text1-LostFocus() Grid1.Text=Text1.Text End Sub
|
Visual Basic 中文本框处理技巧集萃 刘强 |
在Visual Basic中,文本框(TextBox)是最常用的控件,熟练运用文本框是开发出高质量的应用程序的基础。笔者在从事应用程序开发中,摸索出有关文本框的应用技巧,写出来与VB爱好者共享。 1、设置只读文本框。 有些时候在窗口显示一段信息,但又不希望用户去改变它,怎样实现文本的只读呢?首先,我们可以利用标签框( label )的只读属性,以标签来代替文本框以实现只读属性,但也可以用小程序实现真正的文本框的只读。 Sub Text1_KeyPress (keyascii As Integer) keyascii = 0 End Sub 或者也可以用sendkey方法使文本框失去焦点,如以下程序: Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) SendKeys "{tab}" End Sub 2、限定文本框的输入内容和格式。 以下程序可以实现限定文本框只能输入数字: Sub Text1_KeyPress (keyascii As Integer) If keyascii <48 Or keyascii> 57 Then Beep Beep johny@nease.net keyascii = 0 End If End Sub 若想限定文本框输入格式,可以使用VB的FORMAT函数,也可以使用专业版的屏蔽控件(Masked Edit),通过设定屏蔽控件的Mask属性可以对文本框的输入格式作精确控制。 3、为TextBox 创建快捷键。 VB规定,添加在窗体上的控件均在其Tabindex 属性中记载其加载顺序,程序运行时焦点按Tabindex 属性规定的顺序在控件间跳转。而为了简化操作,可VB中为任何具有 caption的属性的控制创建快捷键,这通过caption 属性中在想作为快捷键的字母前加&号实现。但有一个问题值得注意,而类似文本框这样的控件无 caption 这样的属性,这时可将标签与文本框同时使用。为 lable创建快捷键,标签 Tabindex 属性设置比文本框小1,又因为label 不能接收按点,焦点会自动跳至文本框。这相当于为文本框创建了快捷键。具体步骤如下: (1) 首先绘制标签,再绘制文本框。或随意绘制各种控制,将标签 Tabindex 属性设置比文本框小1 (2) 在标签的caption 属性中使用“&”号设定快捷键 这样就相当于为文本框设定了快捷键,当你按下标签框的快捷键时,焦点就会跳至文本框上。 4、在设计时实现文本框换行。 对于文本框,在设计时properties 窗口不能输入换行符,但可以再程序执行时用代码来换行,即使用 ASCII字符的13和10,如下列小程序就可将两行文本放入文本框: Sub form_load( ) NL=chr(13)+chr(10) text1.text=“my name is ”& NL & “ liu qiang” End sub 5、创建口令文本框。 创建口令文本框可用设置属性的方法,也可以通过调用WINDOWS的API应用函数接口来实现。首先,文本框的属性 Passwordchar和maxlength 可用来设置口令框。其中 Passwordchar 指定文本框显示的字符,如指定“*”,则在文本框内显示“*”,Maxlength确定文本框中能输入几个字符。超过Maxlength以后,文本框发出警告声,不能接收更多的字符。若使用WINDOWS应用函数接口,可用GetWindowLong、SetWindowsLong和SendMessage等接口函数来实现,有兴趣的读者可查阅Windows API函数手册或VB的联机帮助文件,这里就不一一赘述了。
|
防止文本控件中的部分滚动 谭 翁 |
Windows API的SendMessage函数可以用来向VisualBasic控件中发送消息,例如向文本框控件上发送消息。本文介绍如何利用该函数防止文本框控件中的部分文本滚动,即该控件中不能滚动的部分不能被用户看见。 发送消息到文本框控件 Visual Basic中的文本框控件就是一个最小化的字处理程序。当该文本控件的MultiLine属性被设置为True的时候,则文本可以自动换行;当在文本框控件中键入了许多文本时,控件中的文本会向上滚动。这时文本就变得看不到了,但这些文本实际上仍然在控件中——它们并没有被删除。 Windows API的SendMessage函数可以用来防止文本框控件中的文本滚动因而超出我们的视线。当创建该文本框控件时,它的客户区域格式化为一个矩形(该区域就是键入文本的地方),可以给该控件发送EM_SETRECTNP消息,对该矩形区域进行限制,以在文本框的客户区域中指定一个特定区域。 在下面的样例程序中,我们希望文本控件的后一半原封不动地保持完整,即不希望文本滚动而超出视线。可以从文本框控件的Height属性中提取出它的高度,并将该值除以2,得到该文本框控件后一半的坐标。然后将该结果传递给SendMessage函数,告诉EM_SETRECTNP防止该矩形区域滚动。 有些程序员可能会希望使用EM_SETRECT消息代替EM_SETRECTNP消息。但是,使用EM_SETRECT消息会停止Windows对该格式化矩形区域中的文本的重新绘制,导致文本框控件中的文本会看不到。 样例程序 该程序显示了如何临时冻结一个文本框控件中的特定部分,该部分包含的文本不能滚动,因而不会超出视线之外。 1.在VisualBasic中开始一个新的工程,采用缺省的方法建立Form1。 2.将如下常量和声明语句添加到Form1的通用声明部分中(注意该声明语句需要书写在一行内): Private Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long Const WM_USER = &H400 Const EM_SETRECTNP = WM_USER + 4 Const EM_SETRECT = WM_USER + 3 对于32位环境下使用Visual Basic5.0的用户,需要将如下声明语句添加到Form1的通用声明部分中: Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Const EM_SETRECTNP = &HB4 Const EM_SETRECT = &HB3 3.将如下代码添加到Form1的Form_Load事件中: Private Sub Form_Load() Text1.Text = " 这 是 我 们 希 望 显 示 出 来 的 第 一 段" Text1.Text = Text1.Text & " 它 位 于 文 本 框 控 件 中" Text1.Text = Text1.Text & Chr$(13) & Chr$(10) & " 这 是 第 二 段, 我 们" Text1.Text = Text1.Text & " 希 望 将 之 冻 结 以 使 文 本 不 能 滚 动 " End Sub 4. 将如下代码添加到Form1的Click事件中: Private Sub Form_Click() Dim R As RECT Dim X As Long ScaleMode = 3 R.Left = 0 R.Top = 0 R.Right = Text1.Width R.Bottom = Text1.Height / 2 X = SendMessage(Text1.hWnd, EM_SETRECTNP, 0, R) End Sub 5.创建一个新的模块。采用缺省的方法建立Module1.Bas。 6.将如下TYPE结构添加到Module1.Bas中: Type RECT Left As Integer Top As Integer Right As Integer Bottom As Integer End Type 对于32位环境下使用Visual Basic 5.0的用户,需要将如下TYPE结构添加到Module1.Bas中: Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type 7.在Form1上添加一个文本框控件,采用缺省的方法建立Text1,将其MultiLine属性设置为True。 按下F5来执行该程序,我们可以看到文本框显示在Form1上。在窗体上单击一次鼠标,将新的文本键入到该文本框控件中。这时我们可以注意到,当我们在文本框控件的开头处键入新的文本时,在文本框控件下半部分的文本不会滚动。 如果我们将EM_SETRECT消息替代EM_SETRECTNP消息发送给文本框,再次运行该程序,这时我们会发现,文本框的下半部分显示不出来,尽管实际上文本仍然是存储在控件中的。
|
防止用户编辑文本框控件中的内容 谭 翁 |
Visual Basic中的文本框控件允许用户在其中键入文本,以便在程序中使用。相反,程序员可能会希望显示一些文本但不希望用户编辑该文本。本文介绍了如何创建只读的文本框控件的内容。 使一个文本框控件只读 在Visual Basic中,如果文本框控件的MultiLine属性设置为True,文本将会自动地换行到下一行。另外,如果文本框控件的ScrollBars属性设置为3-Both(或者1-Vertical,或者2-Horizontal),用户还能够滚动控件中的内容。 程序员要想实现文本框控件中的文本不可编辑,可将文本框控件中的内容设置为只读状态,这可以通过使用Microsoft Windows 应用程序编程接口(API)的SendMessage函数来实现。SendMessage函数可以用来发送一个EM_SETREADONLY消息到文本框控件中,这将使文本框控件变为只读。 要在程序中使用该SendMessage函数,需要将如下的声明语句包含在项目的通用声明部分中(注意该声明语句需要书写在一行内): Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long 该SendMessage 函数需要4个参数,如下所示: hwnd一个长整数值,它包含文本框控件的句柄。 wMsg一个长整数值,它包含被发送的消息,在这个例子里,是EM_SETREADONLY。 wParam一个整数值,如果它为True,则控件被设置只读标记,如果它为False,则删除控件的只读标记。 lParam一个长整数值,它应该被设置为0(EM_SETREADONLY不使用它)。 在程序运行了此SendMessage函数之后,将返回一个长整数值,指明调用成功(返回值非0)或是失败(返回值为0)。 样例程序 该程序显示了如何防止用户编辑一个文本框控件中的内容。 1.在Visual Basic 中开始一个新的工程,采用缺省的方法建立Form1。 2.将如下的常量和声明语句添加到Form1的通用声明部分中(注意该声明语句需要书写在一行内): Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long Const WM_USER = &H400 Const EM_SETREADONLY = (WM_USER + 31) 3.在Form1上添加一个文本框控件,采用缺省的方法建立Text1。将其MultiLine属性设置为True,并且将它的ScrollBars属性设置为3-Both。 4.在Form1上添加一个命令按钮控件,采用缺省的方法建立Command1。 5.将如下的代码添加到Command1的单击事件中: Private Sub Command1_Click() Dim RetVal As Long RetVal = SendMessage(Text1.hwnd, EM_SETREADONLY, True, ByVal 0&) End Sub 通过按下F5键来执行样例程序。在文本框控件中键入一些文本,可以使用水平和垂直滚动条来滚动文本,还可以改变文本的内容。单击命令按钮,用户仍然可以使用滚动条或是光标键来查看文本框控件的内容,但是不能编辑它。
|
巧用Visual Basic的TIMER控件 青岛 郑海波 |
Visual Basic提供一个Timer控件,其本质上是一个具有间隔时间设置所触发的时间程序,使我们可以将其隐藏在系统中,以某一时间间隔触发相关程序。灵活地运用它可以取得很巧妙的效果。 下面,我们举一个例子。 我们可以在界面设计中设计出这样一种效果:一行文字在窗体中自左向右逐渐滚动,从右边“滚”出窗体的文字,又在左边逐渐出现。如此循环下去。类似电视上的滚动信息。这样可使你设计的软件显得很生动,极易引起用户的兴趣 。其实,使用Visual Basic的Timer控件就可很容易地实现它。 首先,我们在窗体中设置两个Label控件Label1、Label2。这两个控件中除Left属性外,其他属性设置成完全一样。这主要是为了实现循环滚动的效果。它们的Caption属性设置为要滚动显示的文字。另外再调整好其字体、大小和颜色等。在Form-Load过程中设置Label2.Left=-6240(窗体宽度),Label1.Left=0。这样可保证Label1的一部分“滚”出窗体,则Label2的一部分就进入窗体。而形成循环滚动在窗体中设置?/FONT>Timer控件。Timer控件的Interval属性决定滚动的速度,单位是毫秒。例如,我们设置成300,则每隔0.3秒滚动一次。然后,在Timer1-Timer()过程中加入如下程序: Private Sub Timer1-Timer() Label1.Left=Label1.Left+50 Label2.Left=Label2.Left+50 If Label1.Left>=6240 Then Label1.Left=-6240 End If If Label2.Left>=6240 Then Label2.Left=6240 End If End Sub 滚动效果就形成了,感兴趣的读者可以试试看。只要灵活运用Timer控件,我们还可以设计出更有趣的效果。如用Timer控件控制按钮控件的Visible属性,形成闪烁按钮。用Timer控件控制显示不同的图象,形成简单的动画。
|
如何使VB的网格控件具有输入功能 河北 王翠荣 王全海 |
我们在使用Visual Basic for Windows开发时,经常用到网格控件(Grid.vbx),因为此控件可以用来作类似于电子表格形式的输出表,且编程简单,但在此网格控件只有输出功能,而不能直接在网格上输入,这给使用者带来一些不便。如何在执行时向网络控件中输入数据,人们使用了一些方法,但大都使用一文本控件作中间转换,即将欲输入的信息先输入到该文本控件,然后将文本控件的TEXT属性赋给网格的TEXT属性,这种方法尽管解决了向网格输入数据问题,但增加了一文本框,对界面有些不美观,修改部分数字不方便,且影响速度,那么,如何直接向网格输入数据呢? 本文将解决直接向网格输入数据问题,基本思想是:使用网格控件KeyPress事件,从键盘上接收所击键位的KeyAscii值,再由Chr$()或Chr()函数转换成字符,然后读出网格单元的当前Text值与由键盘接收到的字符相加,组成新的字符串,再赋给该单元的Text属性,即Grid.Text=Grid.Text+Chr$(KeyAscii)。程序清单如下: 程序中定义了两个Form级变量WgridCol%和WgridRow%。 Sub Grid-KeyPress(KeyAscii as Integer) Grid.Col=WgridCol% Grid.Row=WgridRow% if KeyAscii=8Then `keyascii=8为退格删除键 if Grid.Text<>””Then Grid.text=Mid$(Grid.text, 1,Len(Grid.text)-1)‘删除最后一个字符 Else Grid.text=Grid.text+Chr$(KeyAscii) End if End Sub Sub Grid-RowColChange() Wgrid.Col%=Grid.Col Wgrid.Row%=Grid.Row End Sub 这样就可以实现对网格的任意输入,可以输入字符、数字等等。由于数字0到9的Ascii值为48到57,小数点Ascii的值为46,所以可以输入任意实数。若您想防止用户输入除数字、小数点以外的任何其他字符,可对来自于键盘的Ascii值进行判断,有条件地接收,就实现了仅输入数值字符。同理也可以限制只输入字母字符。 根据这种思想,也可以对VB中一切不具有输入功能,但具有KeyAscii或者KeyDown事件的控件进行直接输入,如标签Label等。 |