| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 419 人关注过本帖
标题:如何获得edit框的行数问题
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10833
专家分:43448
注 册:2014-5-20
收藏
得分:0 
回复 10楼 sam_jiang
逐行字符计算加硬换行,只要不超出右边界限,可以试试。
5 天前 15:53
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1054
专家分:1581
注 册:2021-10-13
收藏
得分:0 
回复 9楼 wcx_cc
一语惊醒梦中人,豁然开朗,确实模拟人工数行数是最为可行的方法!
5 天前 16:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10833
专家分:43448
注 册:2014-5-20
收藏
得分:0 
以下是引用sam_jiang在2025-11-7 16:02:40的发言:

一语惊醒梦中人,豁然开朗,确实模拟人工数行数是最为可行的方法!

是找一行删一行吧,这做法算总行数。
如果只算编辑框内的行数还要准确计算每行的高。
5 天前 17:14
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1054
专家分:1581
注 册:2021-10-13
收藏
得分:0 
回复 13楼 吹水佬
不要找一行删一行,我数行数是用下箭头键来数的,用home和end键快速定位行首和行尾,这样就简单了,我们只需用selstart属性就可以确定每次敲击下箭头后是否位置已变换,那么有效敲击的次数就是行数!同样利用Home和end键可以确定每行的字数!
5 天前 20:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10833
专家分:43448
注 册:2014-5-20
收藏
得分:0 
回复 14楼 sam_jiang
这方法省去了字符串处理环节,效率较高。但原理都差不多,能准确计算总行数,要算编辑框内行数要适应不同字体和大小还有些细节问题。
4 天前 07:33
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:822
专家分:3264
注 册:2018-3-13
收藏
得分:0 
以下是引用wcx_cc在2025-11-6 18:26:32的发言:

模拟手工数行数,几乎解决全部问题,不妨试试看。

很不错的方案,点赞!

这家伙很懒,啥也没留下
4 天前 10:47
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1054
专家分:1581
注 册:2021-10-13
收藏
得分:0 
回复 15楼 吹水佬
昨晚试了一下,碰到一个疑难问题。

在编辑框里键盘输入时,selstart的值会变化,用keyboard模拟输入某个键时,它的值居然没有变化!!这是什么原理?
4 天前 13:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10833
专家分:43448
注 册:2014-5-20
收藏
得分:0 
模拟键盘消息可能是异步消息,可以试试跟着加个延时中断或等待检测,得到结果再往下执行。
4 天前 17:11
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1054
专家分:1581
注 册:2021-10-13
收藏
得分:0 
回复 18楼 吹水佬
单次点击command4,可以看到selstart属性的值变化,
当在command3中打算多次模拟downarrow键时,selstart属性却不再变化了。。。
deepseek 也解释不了。。。

程序代码:
**************************************************
*-- Form:         form1 (d:\documents\visual foxpro 项目\edittest.scx)
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   11/08/25 11:32:10 PM
*
DEFINE CLASS form1 AS form


    Top = 0
    Left = 0
    Height = 559
    Width = 712
    DoCreate = .T.
    Caption = "Form1"
    *-- 记录edit控件的文字行数
    lines = 0
    Name = "Form1"


    ADD OBJECT edit1 AS editbox WITH ;
        Height = 552, ;
        Left = 0, ;
        Top = 0, ;
        Width = 421, ;
        Name = "Edit1"


    ADD OBJECT text1 AS textbox WITH ;
        Height = 20, ;
        Left = 509, ;
        Top = 12, ;
        Width = 100, ;
        Name = "Text1"


    ADD OBJECT text2 AS textbox WITH ;
        Height = 20, ;
        Left = 509, ;
        Top = 48, ;
        Width = 100, ;
        Name = "Text2"


    ADD OBJECT command1 AS commandbutton WITH ;
        AutoSize = .T., ;
        Top = 96, ;
        Left = 552, ;
        Height = 25, ;
        Width = 84, ;
        Caption = "计算字数与行", ;
        Name = "Command1"


    ADD OBJECT label1 AS label WITH ;
        AutoSize = .T., ;
        Caption = "每行字数:", ;
        Height = 16, ;
        Left = 432, ;
        Top = 16, ;
        Width = 62, ;
        Name = "Label1"


    ADD OBJECT label2 AS label WITH ;
        Caption = "行数:", ;
        Height = 16, ;
        Left = 434, ;
        Top = 50, ;
        Width = 38, ;
        Name = "Label2"


    ADD OBJECT command2 AS commandbutton WITH ;
        AutoSize = .T., ;
        Top = 144, ;
        Left = 480, ;
        Height = 25, ;
        Width = 156, ;
        Caption = "生成一串随机字符再次测试", ;
        Name = "Command2"


    ADD OBJECT command3 AS commandbutton WITH ;
        AutoSize = .T., ;
        Top = 216, ;
        Left = 504, ;
        Height = 25, ;
        Width = 132, ;
        Caption = "模拟键盘操作获取行数", ;
        Name = "Command3"


    ADD OBJECT command4 AS commandbutton WITH ;
        Top = 252, ;
        Left = 504, ;
        Height = 25, ;
        Width = 60, ;
        Caption = "DNarrow", ;
        Name = "Command4"


    PROCEDURE Init
        this.edit1.Value="SHA-1(Secure Hash Algorithm 1)是一种广泛使用的密码散列函数"+;
                        ",由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)"+;
                        "发布为联邦信息处理标准(FIPS PUB 180-1)。它能够将任意长度的"+;
                        "数据(消息)映射为固定长度(160位/20字节)的哈希值,通常用于数据"+;
                        "完整性校验、数字签名和密码存储等领域。"
    ENDPROC


    PROCEDURE edit1.Click
        NODEFAULT 
        npos=thisform.lines
        KEYBOARD '{DNARROW}'
        INKEY(0.1)
        MESSAGEBOX(trans(thisform.lines))
        DODEFAULT()
    ENDPROC


    PROCEDURE edit1.KeyPress
        LPARAMETERS nKeyCode, nShiftAltCtrl
        IF nkeycode=24
            npos=this.SelStart
            INKEY(0.1)
            *MESSAGEBOX("npos= "+TRANSFORM(npos)+CHR(13)+"totallength= "+TRANSFORM(len(this.value)))
            IF npos#LEN(this.Value)
                thisform.Lines=thisform.lines+1
                *SET MESSAGE TO TRANSFORM(thisform.lines)
                MESSAGEBOX(TRANSFORM(thisform.lines))
            ENDIF
        ENDIF 
    ENDPROC


    PROCEDURE text1.KeyPress
        LPARAMETERS nKeyCode, nShiftAltCtrl
        IF TYPE("npos")="U"
            PUBLIC npos
        ENDIF 
        npos=this.selstart
        SET MESSAGE TO TRANSFORM(npos)
    ENDPROC


    PROCEDURE command1.Click
        nhead=4 && 首字符距编辑框的距离
        *ntail=6 && fontname="宋体",fontsize=9的情况下 尾字符距滚动条的距离
        ntail=2 && fontname="雅黑",fontsize=20的情况下 尾字符距滚动条的距离
        nscollbar=21 &&滚动条的宽度
        *!*上面3个数据可能根据编辑框的不同字体会有不同结果
        *!*我的编辑框是宋体,9号字体,普通字体

        *!* 设置不同的字体和大小看看
        thisform.edit1.FontName=("微软雅黑")
        thisform.edit1.FontSize=20
        *!* 
        nwidth=0
        i=0
        cchar=""
        cstr=""
        nevenwidth=FONTMETRIC(6,thisform.edit1.FontName,thisform.edit1.FontSize,"N")
        ctemp=thisform.edit1.Value
        PUBLIC lines
        DIMENSION lines[1]
        nindex=0
        DO WHILE .t. 
            i=i+1
            IF i>LEN(ctemp)
                nindex=nindex+1
                DIMENSION lines[nindex]
                lines[nindex]=ctemp
                EXIT
            ENDIF 
            cchar=SUBSTR(ctemp,i,1)
            IF ASC(cchar)>128
                i=i+1
            ENDIF 
            cstr=SUBSTR(ctemp,1,i)
            nstrwidth=TXTWIDTH(cstr,thisform.edit1.FontName,thisform.edit1.FontSize,"N")
            nwidth=nhead+ntail+nscollbar+nstrwidth*nevenwidth
            IF nwidth>thisform.edit1.Width
        *!*            i=i-1
                IF ASC(cchar)>128
                    i=i-2 &&判断该行最后一个字符为汉字
                ELSE 
                    i=i-1 &&英文字母
                ENDIF
                nindex=nindex+1
                DIMENSION lines[nindex]
                lines[nindex]=SUBSTR(ctemp,1,i)
                ctemp=STRTRAN(ctemp,lines[nindex],"")
                IF EMPTY(ctemp)
                    EXIT
                ELSE 
                    i=0
                    LOOP
                ENDIF          
            ELSE 
                LOOP
            ENDIF 
        ENDDO 
        thisform.text1.Value=LEN(lines[1])
        thisform.text2.Value=ALEN(lines)
    ENDPROC


    PROCEDURE command2.Click
        tnlength=256
        Rand(-1)
        lctext = ''
        i = 0
        Do While i < tnlength
            kb = 48 + Rand() * 80
            If kb <= 57 And kb >= 48 Or kb <= 122 And kb >= 97 Or kb <= 90 And kb >= 65
                i = i + 1
                lctext = lctext + Chr(kb)
            Endif
        Enddo

        thisform.edit1.value=lctext
    ENDPROC


    PROCEDURE command3.Click
        nlines=thisform.lines
        thisform.edit1.SetFocus()

        DO WHILE .t. 

            KEYBOARD '{DNARROW}'
            *thisform.edit1.KeyPress(24)
            MESSAGEBOX(TRANSFORM(thisform.lines))
            IF thisform.lines=nlines
                thisform.text1.Value=thisform.lines
                thisform.lines=0
                EXIT 
            ELSE 
                nlines=thisform.lines
                INKEY(0.2)
                thisform.edit1.SetFocus()
                loop
            ENDIF 
        ENDDO 
    ENDPROC


    PROCEDURE command4.Click
        thisform.edit1.SetFocus()
        KEYBOARD '{DNARROW}'
    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************
4 天前 23:56
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:391
专家分:955
注 册:2021-11-24
收藏
得分:0 
感谢老师们的分享
前天 09:28
快速回复:如何获得edit框的行数问题
数据加载中...
 
   



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

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