注册 登录
编程论坛 VFP论坛

如何获取编辑框内容有多少行

easyppt 发布于 2025-10-17 10:23, 466 次点击
编辑框会自动换行显示,这样的话,如何知道这个 Editbox 显示的内容总共有多少行?
目的:宽度固定,想动态调整 Editbox 的高度,让内容都能看得到(不要滚动条)。

谢谢!
13 回复
#2
easyppt2025-10-17 15:29
我的需求和这个帖子 类似,估计也只能API能搞定了。
这个帖子是改变字号大小:https://bbs.

能否 通过  csyx 老师 9楼的示例 在这个帖子里 的代码改进一下,获取显示内容的高度,然后再设置VFP的 editbox 的高度




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

#3
吹水佬2025-10-31 19:14
既然可以调整editbox的高度,那就将editbox的高度固定在最大的限制高度。
#4
吹水佬2025-10-31 22:41
回复 2楼 easyppt
这里也有个比较类同的贴
https://bbs.
#5
sam_jiang2025-11-02 21:40
用fontmetric()获得字体的平均宽度,再用editbox的宽度/这个平均宽度,是不是就得到每行的字数?总共多少个字符除以每行的字数,不就知道多少行了?

FONTMETRIC(6 [, cFontName, nFontSize [, cFontStyle]])
#6
csyx2025-11-09 07:30
此方案源于 wcx_cc 提出的模拟手工数行数,验证了用此方案取总行数、每行字符内容、行高的可行性
因主要目的是验证方案可行性,所以代码中的变量名随便取的,极不规范,另外,也无理特殊情形(如只有一行。。。等等)的处理
有了总行数和行高,调整字号做到满屏就简单了
只有本站会员才能查看附件,请 登录


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

#7
sam_jiang2025-11-09 10:32
回复 6楼 csyx
,解决了我的困扰

运行了一下,不是很稳定,虽然有几次能得到正确结果

[此贴子已经被作者于2025-11-9 13:28编辑过]

#8
schtg2025-11-09 13:10
回复 6楼 csyx
#9
csyx2025-11-09 18:12
以下是引用sam_jiang在2025-11-9 10:32:08的发言:
运行了一下,不是很稳定,虽然有几次能得到正确结果

我仅在自己的本本(win10、vfp9sp2.5815)上验证过,不稳定的因素有哪些不得而知
可以试试加些影响UI的语句,例如

程序代码:

*-- 表单 ttt1 方法
。。。
Do while .t.
*--
*-- wait window nowait '...'
*-- 或者
?? space(0)
*--
    Keyboard '{END}'
    Doevents
    end = ed.SelStart
    ed.SelStart = beg
。。。




[此贴子已经被作者于2025-11-9 20:04编辑过]

#10
sam_jiang2025-11-09 22:18
回复 9楼 csyx
第一次不正确
只有本站会员才能查看附件,请 登录

第二次不正确
只有本站会员才能查看附件,请 登录

第三次不正确
只有本站会员才能查看附件,请 登录

...
第7-8次才正确
只有本站会员才能查看附件,请 登录


暂时不知道原因,因为无法调试,会影响焦点移动,估计是do while循环中,模拟键盘操作没有被执行,do while 循环太快了。。。
#11
easyppt2025-11-10 09:27
感谢版主及各位老师们一直在持续关注和分享研究成果,我的水平实在太菜,没法和你们互动,惭愧!


#12
sam_jiang2025-11-11 10:52
已经搞清楚产生那些莫名其妙的错误的原因,问题就在于循环的速度太快,导致我们在循环中模拟的键盘输入没有被执行(被丢弃了)。
另外代码中有一句 keyboard “HOME DNARROW”,这句两个键的模拟键入时间间隔太短,导致系统无法识别!我把它们分开了。
最后是把lockscreen代码删除,那语句会影响光标的移动,
我在程序里加入了sleep函数,以便让模拟键盘输入能够有足够的时间去运行,从100毫秒到1000毫秒一一试验,发现小于600毫秒就出错。

试运行了一下,完美解决。。。
只有本站会员才能查看附件,请 登录

附上修改后的代码ttt1
程序代码:

Lparameters aRows
DECLARE integer Sleep IN WIN32API integer
External array aRows

Local beg, end, tmp, rows, pt, ii
Local ed as EditBox

*Thisform.LockScreen = .t.
ed = This.edit1
ed.SetFocus()

Keyboard '{CTRL+HOME}'
DOEVENTS
sleep(600)
beg = ed.SelStart
rows = 1

Do while .t.
    Keyboard '{END}'
    DOEVENTS
    sleep(600)
    end = ed.SelStart
    ed.SelStart = beg
    ed.SelLength = Max(0, end - beg)
    Dimension aRows[rows]
    aRows[rows] = ed.SelText
   
    Keyboard '{HOME}'
    DOEVENTS
    sleep(600)
    Keyboard '{DNARROW}'
    DOEVENTS
    sleep(600)   
    tmp = ed.SelStart
    If beg = tmp
        Exit
    Else
        beg = tmp
        rows = rows + 1
    EndIf
EndDo
Keyboard '{CTRL+HOME}'
sleep(600)
*Thisform.LockScreen = .f.

rows = Max(1, Alen(aRows)-1)
Dimension aRows[rows]

#13
sam_jiang2025-11-11 11:01
上面这个方法有个弊端,一旦这个编辑框里有很多行数,用程序数,可能要好长时间。。。
#14
schtg2025-11-12 09:34
1