| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 339 人关注过本帖
标题:实用的一个文本框类,只能输入ip地址
只看楼主 加入收藏
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1013
专家分:1535
注 册:2021-10-13
结帖率:97.7%
收藏
已结贴  问题点数:20 回复次数:15 
实用的一个文本框类,只能输入ip地址
如题。欢迎暴力测试,找出bug!

10/12再次更新代码如下:
解决selstart值不正确的问题
弃用inputmask,它限制了输入格式


程序代码:
**************************************************
*-- 类:           txt_ip (d:\documents\visual foxpro 项目\myclass.vcx)
*-- 父类:  textbox
*-- 基类:    textbox
*-- 时间戳:   10/12/25 04:33:07 PM
*
DEFINE CLASS txt_ip AS textbox


    Value = 0.0.0.0
    Height = 20
    Left = 12
    Top = 48
    Width = 110
    Name = "txt_ip"


    PROCEDURE KeyPress
        LPARAMETERS nKeyCode, nShiftAltCtrl
        ndotpos1=AT(".",this.Value,1)
        ndotpos2=AT(".",this.Value,2)
        ndotpos3=AT(".",this.Value,3)
        ncursor=this.SelStart
        *SET MESSAGE TO TRANSFORM(ncursor)
        IF ("." $ this.SelText)
            NODEFAULT && 当选择的字符里有“.”号时,不允许键盘操作
        ELSE 
            DO CASE 
                CASE nkeycode=127
                    IF SUBSTR(this.Value,ncursor,1)="."
                        NODEFAULT 
                    ENDIF 
                CASE nkeycode=7
                    IF SUBSTR(this.Value,ncursor+1,1)="."
                        NODEFAULT 
                    ENDIF 

                CASE nkeycode=9 OR nkeycode=46 OR nkeycode=13
                    IF ncursor<ndotpos3 &&在前三个ip段,改变tab,“.”,回车的默认行为为向后移一个ip段,并全选该段
                        NODEFAULT
                        DO CASE
                            CASE BETWEEN(ncursor,ndotpos2,ndotpos3)

                                this.SelStart=ndotpos3
                                this.SelLength=LEN(this.Value)-ndotpos3-1
                            CASE BETWEEN(ncursor,ndotpos1,ndotpos2)

                                this.SelStart=ndotpos2
                                this.SelLength=ndotpos3-ndotpos2-1
                            CASE BETWEEN(ncursor,0,ndotpos1)

                                this.SelStart=ndotpos1
                                this.SelLength=ndotpos2-ndotpos1-1

                            OTHERWISE

                        ENDCASE
                    ELSE
                        IF nkeycode=46
                            NODEFAULT 
                            KEYBOARD "{tab}" && 在第四个ip段屏蔽“.”以tab键代替
                        ENDIF 
                    ENDIF 

                CASE !(BETWEEN(nkeycode,48,57) OR INLIST(nkeycode,4,7,9,13,19,46,127))
                    NODEFAULT &&只允许数字键和控制键

                OTHERWISE 

            ENDCASE 
        ENDIF      
    ENDPROC


    PROCEDURE GotFocus
        this.SelStart=0
        ndotpos1=AT(".",this.Value)
        this.SelLength=ndotpos1-1

    ENDPROC


    PROCEDURE Valid
        ndots=OCCURS(".",this.Value)
        nsections=ALINES(atemp,this.Value,5,".")
        IF nsections<>4 &&说明有某个段没有输入数字,定位到没有数字的ip段
            this.Selstart=AT("..",this.Value)
            RETURN .f.
        ELSE 
            FOR i=1 TO 4
                IF !BETWEEN(EVALUATE(atemp(i)),0,255) &&ip值有效检查,定位到错误的ip段
                    this.Selstart=IIF(i=1,0,AT(".",this.Value,i-1))
                    this.SelLength=LEN(atemp(i))
                    RETURN .f.
                ENDIF
            ENDFOR 
        ENDIF 


    ENDPROC


ENDDEFINE
*
*-- EndDefine: txt_ip
**************************************************



[此贴子已经被作者于2025-10-12 17:02编辑过]

搜索更多相关主题的帖子: this CASE IF ip Value 
2025-10-06 00:50
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2278
专家分:4768
注 册:2012-2-29
收藏
得分:5 
2025-10-06 05:39
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1013
专家分:1535
注 册:2021-10-13
收藏
得分:0 
改天再发表一个电话号码类,只能输入电话号码,感觉挺实用的
2025-10-06 07:15
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1117
专家分:2757
注 册:2015-12-30
收藏
得分:5 
2025-10-06 07:15
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1013
专家分:1535
注 册:2021-10-13
收藏
得分:0 
10/6 更新代码,valid的判断更加完美,指出哪个值无效;
解决了每个地址端输入3个数字后的块选择问题,定位到错的地址段。

更新后的代码放到一楼了。。。
2025-10-06 21:25
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10775
专家分:43354
注 册:2014-5-20
收藏
得分:5 
windows也有个IP地址控件
简单示例
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
DECLARE long InitCommonControlsEx IN comctl32 string@
DECLARE long CreateWindowExA IN user32 long,string,string,long,long,long,long,long,long,long,long,long

of=CREATEOBJECT("form1")
of.show(1)
CLEAR ALL
RETURN

DEFINE CLASS form1 as Form
    PROCEDURE load
        icex = BINTOC(8,"4rs")+BINTOC(0x0800,"4rs")
        InitCommonControlsEx(@icex)
        CreateWindowExA(0,"SysIPAddress32","",0x50000000,10,10,150,22,this.hWnd,0,0,0)
    ENDPROC
ENDDEFINE
2025-10-07 23:19
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2278
专家分:4768
注 册:2012-2-29
收藏
得分:0 
2025-10-08 06:28
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1013
专家分:1535
注 册:2021-10-13
收藏
得分:0 
这么简洁?!
居然还有这个控件?可以可视化调用吗?

在keypress中读取或设置selstart属性容易出现不可知的错误,所以代码量比较大且复杂,DS建议不要放在keypress里,那时selstart还没设置,建议放在InteractiveChange方法中,改天试试

[此贴子已经被作者于2025-10-8 07:28编辑过]

2025-10-08 07:09
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10775
专家分:43354
注 册:2014-5-20
收藏
得分:0 
以下是引用sam_jiang在2025-10-8 07:09:57的发言:

这么简洁?!
居然还有这个控件?可以可视化调用吗?

这个是windows的标准控件,实际应用中还有一些细节问题要处理,如编辑焦点和插入光标的处理。
MS参考文档:https://learn.

2025-10-08 07:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10775
专家分:43354
注 册:2014-5-20
收藏
得分:0 
简单的话用vfp的textbox写个IP解析就可以,如:
程序代码:
of=CREATEOBJECT("form1")
of.show(1)

DEFINE CLASS form1 as Form
    ADD OBJECT text1 as text_ip WITH left=10,top=10,width=100,height=20
ENDDEFINE

DEFINE CLASS text_ip as TextBox 
    InputMask = "999.999.999.999"
    PROCEDURE valid
        ALINES(arr,this.Value,".")
        IF BETWEEN(VAL(arr[1]),0,255) AND ;
           BETWEEN(VAL(arr[2]),0,255) AND ;
           BETWEEN(VAL(arr[3]),0,255) AND ;
           BETWEEN(VAL(arr[4]),0,255)
           RETURN .t.
        ENDIF
        ERROR "IP地址输入无效"
        RETURN .f.
    ENDPROC
ENDDEFINE


2025-10-08 08:03
快速回复:实用的一个文本框类,只能输入ip地址
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018600 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved