| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1912 人关注过本帖, 1 人收藏
标题:VFP学习、开发漫谈 (15)
只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
结帖率:96.88%
收藏(1)
已结贴  问题点数:20 回复次数:18 
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 编辑 ]
搜索更多相关主题的帖子: 解决方案 文本框 开发 标签 
2014-04-08 12:33
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:7 
实践出真知,经典,收藏了。

坚守VFP最后的阵地
2014-04-08 14:15
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:7 
认真学习
2014-04-08 20:47
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:7 
细节需要重视

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-04-08 21:52
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
收藏
得分:0 
回复 楼主 liuxingang28
NODEFAULT             && 内容非空时(修改状态)不设置插入点
DODEFAULT()
原理是什么?
先禁止再执行好象不能起什么作用吧
2014-04-11 18:47
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
以下是引用antony521在2014-4-11 18:47:18的发言:

NODEFAULT             && 内容非空时(修改状态)不设置插入点
DODEFAULT()
原理是什么?
先禁止再执行好象不能起什么作用吧
NODEFAULT 的作用是取消对象对当前事件或方法的处理,对于本例的 GotFocus 事件来说,即:取消对象获得焦点;对于本例的 KeyPress 事件来说,即:取消用户的按键。
DODEFAULT()函数的作用是执行对象的默认事件或方法,对于本例的 GotFocus 事件来说,即:使对象重新得到焦点。该函数是支持参数的,比如在 KeyPress 事件中,若要执行对事件的默认处理,可输入 DODEFAULT(nKeyCode, nShiftAltCtrl)。
在本例中,执行 NODEFAULT 之后再执行 DODEAULT()看似不起什么作用,实际上,NODEFAULT 不但阻止了文本框对获得焦点(GotFocus)或按键(KeyPress)的处理,还进一步阻止了文本框对光标的定位等操作,而这正是我们所期望的结果。
本例中的全部代码都是经过实践检验的,你实际操作一下便知道其中的奥妙了。


[ 本帖最后由 liuxingang28 于 2014-4-12 09:01 编辑 ]

泉城飞狐
2014-04-12 08:54
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
收藏
得分:0 
回复 6楼 liuxingang28
真长知识啊!
2014-04-12 12:45
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
收藏
得分:0 
回复 楼主 liuxingang28
光标到达文本框最后会回跳一格,这时输入的会覆盖最后一个字符,这个用不用完善一下?

[ 本帖最后由 antony521 于 2014-4-12 13:54 编辑 ]
2014-04-12 13:36
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
光标到达文本框最后会回跳一格,这时输入的会覆盖最后一个字符,这个用不用完善一下?

怎样改变被选字符的背景蓝,就是高亮显示的那个被选张三的背景?
对于第一个问题,我觉得影响不大,毕竟只是新字符替换了最后一个字符而已。
对于第二个问题,要改变选定字符的背景色,可修改文本框的 SelectedBackColor 属性。



泉城飞狐
2014-04-12 14:07
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
回复 6楼 liuxingang28
这很有道理
2014-04-13 11:19
快速回复:VFP学习、开发漫谈 (15)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041698 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved