| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 295 人关注过本帖
标题:如何获得edit框的行数问题
只看楼主 加入收藏
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1043
专家分:1576
注 册:2021-10-13
结帖率:97.73%
收藏
 问题点数:20 回复次数:13 
如何获得edit框的行数问题
前一段时间有人提问如何获得编辑框里文字的行数,今天就试着写了一段代码,好像还能正确运行,特分享给大家。

运行效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


10/5 晚更新代码,符合微软雅黑20号字体。
源代码:
程序代码:
**************************************************
*-- Form:         form1 (d:\documents\visual foxpro 项目\edittest.scx)
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   11/05/25 09:38:11 PM
*
DEFINE CLASS form1 AS form


    Top = 0
    Left = 0
    Height = 559
    Width = 712
    DoCreate = .T.
    Caption = "Form1"
    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"


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


ENDDEFINE
*
*-- EndDefine: form1
**************************************************



[此贴子已经被作者于2025-11-5 21:51编辑过]

搜索更多相关主题的帖子: thisform Top lines Name Left 
3 天前 15:52
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1043
专家分:1576
注 册:2021-10-13
收藏
得分:0 
没有考虑到编辑框里可能存在换行符的情况,但是处理方式相同,可以以此类推。
3 天前 15:55
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:819
专家分:3249
注 册:2018-3-13
收藏
得分:0 
假如这么简单,就不会有人提这问题了。
改成这样试试
...
    ADD OBJECT edit1 AS editbox WITH ;
        Height = 409, ;
        Left = 0, ;
        Top = 0, ;
        Width = 421, ;
        FontName = '微软雅黑', ;
        FontSize = 16, ;
        Name = "Edit1"
...
如果把 FontSize 改成 20,自动换行的位置更能叫人抓狂

[此贴子已经被作者于2025-11-5 19:17编辑过]


这家伙很懒,啥也没留下
3 天前 18:53
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1043
专家分:1576
注 册:2021-10-13
收藏
得分:0 
回复 2楼 sam_jiang
不同的字体及size,会有不同的结果,雅黑就是个另类,大写小写的字符宽度都不一样的
3 天前 19:49
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:819
专家分:3249
注 册:2018-3-13
收藏
得分:0 
不是雅黑另类,字体本就分两类,一种等宽字体,一种比例字体;常见字体中绝大部分都是比例字体
等宽字体除了用于编辑源代码,极少用到;其他像广告、印刷、办公 等等等等都会使用比例字体


这家伙很懒,啥也没留下
3 天前 19:56
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1043
专家分:1576
注 册:2021-10-13
收藏
得分:0 
根据@csyx的反馈,更新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)



不知道中文中混有英文单词时的换行规则,仍有bug,但已经接近真相了。。。



[此贴子已经被作者于2025-11-5 21:55编辑过]

3 天前 21:42
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2307
专家分:4810
注 册:2012-2-29
收藏
得分:0 
前天 06:33
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10831
专家分:43438
注 册:2014-5-20
收藏
得分:0 
以下是引用sam_jiang在2025-11-5 19:49:36的发言:

不同的字体及size,会有不同的结果,雅黑就是个另类,大写小写的字符宽度都不一样的

只是字符串不同,其他都不变,都有不少问题。
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册



前天 15:34
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:448
专家分:1412
注 册:2015-10-2
收藏
得分:0 
模拟手工数行数,几乎解决全部问题,不妨试试看。
前天 18:26
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1043
专家分:1576
注 册:2021-10-13
收藏
得分:0 
回复 8楼 吹水佬
我猜想当编辑框中字符出现空格时,系统触发英文单词判定,并把单词列入判定换行的依据,以防止英文单词被分割,这个判定延续至双字节系统!有了这个猜想,解决它就不是一个问题了!我这两天完善这个算法试试看
昨天 15:32
快速回复:如何获得edit框的行数问题
数据加载中...
 
   



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

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