VFP学习、开发漫谈 (15)
在前期的开发漫谈中,我曾提到:VFP中最常用的表单控件是标签(Label)和文本框(Textbox)。下面,就谈一谈我在设计文本框时遇到的一些问题和解决方案供大伙儿参考。先设计一个简单的表单,如下所示:
为了测试需要,我们将表单的 DataSession 设为“2 - Private Data Session”,这样可保证大部分系统状态保持默认值。文本框 txtName 的 MaxLength 设为 10,SelectOnEntry 设为 .t.,Value 设为“张三”。文本框txtSalary 的 InputMask 设为 999999.99,Value 设为 0.00。
运行表单,我们发现如下不足:
1. 在“姓名”文本框中键入“01234567891”,我们发现:最后一个“1”跑到了“工资”文本框中。这在快速盲打时,容易出错。
2. 在“工资”文本框中,按 BackSpace 删除光标左边的字符时,若左边已没有字符,再按下 BackSpace 键时,光标会跑到“姓名”文本框。同样,这也不利用键盘操作。
3. 通过按键盘上TAB、光标或回车键使“姓名”文本框获得焦点时,文本框的内容被选定,但是当用鼠标单击文本框时文本框的内容并没有被选定。
4. 工资文本框的默认值为 0.00,当我们在 0.00 之前单击时,并不能保证光标被定位到文本框的起始位置,此时若键入 123456.78 时,只能输入前面的一部分。
5. 各文本框都是白底黑字,不容易分辨出当前文本框。
针对以上问题,我是这样解决的:
对于第一个问题,可在表单的 Load 事件中添加 Set Confirm On,使输入每个控件内容时都需要人工确认,而不自动跳转焦点。设置系统状态应该越早越好。若表单不存在数据环境,我习惯在表单的 Load 事件中设置系统状态;若表单存在数据环境,我习惯在数据环境的 BeforeOpenTables 设置系统状态。
针对第二个问题,可在文本框 的 KeyPress 事件中,输入以下代码:
程序代码:
* 当按下 BackSpace 且光标位于起始位置时 IF nKeyCode = 127 AND THIS.SelStart = 0 NODEFAULT && 取消按键操作 IF THIS.SelLength > 0 && 若选定了文本框内容,则清除选定内容 KEYBOARD '{DEL}' ENDIF ENDIF
针对第三和第四个问题,可在文本框的 GotFocus 事件中输入以下代码:
程序代码:
IF THIS.SelectOnEntry && 选定控件内容 NODEFAULT DODEFAULT() ELSE IF EMPTY(THIS.Value) && 内容为空时(输入状态)设置插入点 NODEFAULT && 内容非空时(修改状态)不设置插入点 DODEFAULT() THIS.SelStart = 0 ENDIF ENDIF
针对第五个问题,可在文本框的 GotFocus 事件中输入:
程序代码:
* 保存原前景色和背景色,用于失去焦点时恢复 THIS.Tag = STR(THIS.ForeColor) + STR(THIS.BackColor) * 设置前景色为蓝色 THIS.ForeColor = RGB(0,0,255) * 设置背景色为青色 THIS.BackColor = RGB(0,255,255)
在文本框的 LostFocus 事件中输入:
程序代码:
* 恢复前景色(黑色) THIS.ForeColor = VAL(LEFT(THIS.Tag,10)) * 恢复背景色(白色) THIS.BackColor = VAL(RIGHT(THIS.Tag,10))
这种突出活动控件前景色和背景色的思路,参考了一款叫“管家婆”的财务软件。大约是在2005年,我在为一家化妆品经销商开发进销存及财务系统,他们应用的财务软件正是管家婆。
可将文本框保存为自定义类,以后均使用类来新建文本框。先将类加入项目管理器,然后可将类直接拖放到表单。
文本框除了 Value 属性外,还有一个 Text 属性。前者保存的是文本框中的实际值,后者保存的是文本框的显示值。这类似于组合框的 Value 属性和 DisplayValue 属性。
实际应用中注意 2 点:
1. Text 属性永远是字符型的。
2. 在文本框的 InteractiveChange 事件中不要引用自身的 Value 属性,但可以引用其 Text 属性。在前期讲座中,设计“数量、单价、金额”联动时用到了该属性。
在设计模式下为文本框指定 Value 属性时,若指定的属性为表达式,必须在表达式前加等号(=),如:=Date(),=SPACE(10)。若指定的属性为字符串常数,不要添加字符串定界符,若添加了字符串定界符,一定要在前面加等号,如:='济南'+SPACE(1)+'老刘'。
[ 本帖最后由 liuxingang28 于 2014-4-8 16:09 编辑 ]