| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1356 人关注过本帖
标题:请教:edit 内提取每行的文字信息问题
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:0 
意思应该是EditBox编辑框内所见即所得,不管有无硬回车换行。
按这种情况来分行,就要找到软回车换行的地方,才能确定一行字符串的起止字符位置。
EditBox的Width决定一行的字符数,但Width是以像素为单位,可以试试换算成字符数。
VFP的相关函数有:
SYSMETRIC()
FONTMETRIC()

还有一个笨想法:能否模拟手动操作<Shift+End>选定一行,再取出选定的一行。
相关属性:
SelStart
SelLength
SelText
2015-05-21 21:14
hepingfly
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:195
专家分:657
注 册:2015-5-21
收藏
得分:0 
谢谢:吹水佬版主!这些函数都试过,sysmetric,fontmetric 能最大限度的达到近似,但是难保证是精确无误,里面的空格干扰太大。selstart,sellength,seltext,能通过鼠标或模拟操作,将字段抹黑后起作用。但是,困难的是,掌握和控制焦点,正好自动落在每行的最前端有困难。特别是,不管当前焦点在哪里,我想任意取出某一行时,不好做到。期望再想想办法!!非常感谢!


星际花草
2015-05-21 21:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:0 
选一行取一行消一行,selstart保持为0。
2015-05-21 21:49
hepingfly
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:195
专家分:657
注 册:2015-5-21
收藏
得分:0 
在版主的启发下,问题向前进展了一大步!离解决还有一步之遥:那就是,控制焦点自动落在某一行的最前端。或干脆让焦点从任何位置,自动落入第一行的最前端(不采用重新打开的方法)。再次谢谢!


[ 本帖最后由 hepingfly 于 2015-5-21 22:31 编辑 ]

星际花草
2015-05-21 22:09
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:0 
示例:测试发现模拟动作响应不是那么灵敏,真的有点笨。
程序代码:
of = CREATEOBJECT("_Form")
of.Show(1)
RETURN

DEFINE CLASS _Form AS Form
    ADD OBJECT Cmd1 AS CommandButton WITH Top=10,Left=10,Height=25,Caption="开始"
    ADD OBJECT Edit1 AS EditBox WITH Top=50,Left=10,Height=100,HideSelection=.F.
    ADD OBJECT Edit2 AS EditBox WITH Top=155,Left=10,Height=100,Width=200
    
    PROCEDURE Edit1.Init
        this.Value = "12345678901234567890123456789012345678901234567890"
        this.SelStart = 0
    ENDPROC
            
    PROCEDURE Cmd1.Click
        thisform.edit1.SetFocus
        DO WHILE !EMPTY(thisform.Edit1.Value)
            thisform.Edit1.SelStart = 0
            KEYBOARD "{SHIFT+END}" CLEAR
            DOEVENTS
            ss = thisform.Edit1.SelText
            thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, LEN(ss)+1)
            IF !EMPTY(ss)
                thisform.Edit2.SelText = ss + 0h0D0A
            ENDIF
        ENDDO
    ENDPROC
ENDDEFINE
2015-05-21 22:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9832
专家分:27165
注 册:2012-2-5
收藏
得分:0 
以下是引用hepingfly在2015-5-21 20:14:44的发言:

谢谢 sdta 版主的指点。我说的‘行’,是页面上真实观察到的‘行’。而不是用回车键或换行符,来做界定的‘行’。例如:下面有3行写在了 edit 内,只能生成3个参数。
   
       为认真贯彻《中华人民共和国传染病防治法》、《医疗废物管理条例》、&& 第1行,末尾无回车键,无换行键
《消毒管理办法》、  《医疗机构消毒技术规范》、《医院空气净化管理规范》、&& 第2行,末尾只有回车键
《医院感染管理办法》等法律法规,加强医疗卫生机构的传染病防治。。。。&& 第3行,末尾有2个回车键

   
   

看样子楼主应该是在医院工作吧

坚守VFP最后的阵地
2015-05-21 23:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9832
专家分:27165
注 册:2012-2-5
收藏
得分:0 
按字体、字号的默认设置(宋体,9号),一个汉字的宽度大约为12.34像素,编辑框垂直滚动条的宽度为17像素,根据这些条件可以算出一行有多少个汉字。

坚守VFP最后的阵地
2015-05-22 00:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:10 
回复 15楼 吹水佬
楼主的要求还要考虑有硬回车换行的问题。
添加处理前后硬回车换行

程序代码:
of = CREATEOBJECT("_Form")
of.Show(1)
RETURN

DEFINE CLASS _Form AS Form
    ADD OBJECT Cmd1 AS CommandButton WITH Top=10,Left=10,Height=25,Caption="开始"
    ADD OBJECT Edit1 AS EditBox WITH Top=50,Left=10,Height=100,HideSelection=.F.
    ADD OBJECT Edit2 AS EditBox WITH Top=155,Left=10,Height=100,Width=200
    
    PROCEDURE Edit1.Init
        this.Value = "12345678901"+0h0D0A+"23456789012345"+0h0A+"6789012345678"+0h0D+"901234567890"
    ENDPROC
    PROCEDURE Cmd1.RightClick
        thisform.Edit1.Value = "12345678901"+0h0D0A+"23456789012345"+0h0A+"6789012345678"+0h0D+"901234567890"
        thisform.Edit2.Value = ""
    ENDPROC
            
    PROCEDURE Cmd1.Click
        thisform.edit1.SetFocus
        DO WHILE !EMPTY(thisform.Edit1.Value)
            IF (SUBSTR(thisform.Edit1.Value, 1, 2) == 0h0D0A)
                thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, 3)
                thisform.Edit2.SelText = 0h0D0A
                LOOP
            ENDIF
            IF INLIST(SUBSTR(thisform.Edit1.Value, 1, 1), 0h0D, 0h0A)
                thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, 2)
                thisform.Edit2.SelText = 0h0D0A
                LOOP
            ENDIF
            thisform.Edit1.SelStart = 0
            KEYBOARD "{SHIFT+END}" CLEAR
            DO WHILE thisform.Edit1.SelLength < 1
                DOEVENTS
            ENDDO
            ss = thisform.Edit1.SelText
            IF !EMPTY(ss)
                thisform.Edit2.SelText = ss + 0h0D0A
            ENDIF
            thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, LEN(ss)+1)
            IF (SUBSTR(thisform.Edit1.Value, 1, 2) == 0h0D0A)
                thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, 3)
            ENDIF
            IF INLIST(SUBSTR(thisform.Edit1.Value, 1, 1), 0h0D, 0h0A)
                thisform.Edit1.Value = SUBSTR(thisform.Edit1.Value, 2)
            ENDIF
        ENDDO
    ENDPROC
ENDDEFINE
2015-05-22 08:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:0 
这里发现VFP的消息处理很多时是用异步消息,命令执行后并非立即返回结果,难怪很多时见到要用延时语句,如INKEY(),才继续执行,这里用DOEVENTS命令直到模拟键盘消息结果返回。
2015-05-22 08:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10590
专家分:43152
注 册:2014-5-20
收藏
得分:0 
以下是引用sdta在2015-5-22 00:40:48的发言:

按字体、字号的默认设置(宋体,9号),一个汉字的宽度大约为12.34像素,编辑框垂直滚动条的宽度为17像素,根据这些条件可以算出一行有多少个汉字。

VFP的EditBox对于“中文+数字+字母”混合的字串有点不好控制,有时会不规则自动换行显示,有无相关属性设置可以调整这种情况?如果字符、字体、大小相对固定,或者可以逐个字符取出计算一行的字符数。
2015-05-22 10:51
快速回复:请教:edit 内提取每行的文字信息问题
数据加载中...
 
   



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

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