注册 登录
编程论坛 VFP论坛

请教各位老师RichText控件如何获取行数,某行的文字?

wxzd123 发布于 4 天前 19:32, 395 次点击
RichText内有多个自然段,想得到一共有多少行,取出某行的文字,谢谢
29 回复
#2
sych4 天前 20:43
Declare long SendMessage in win32api long hwnd , long  wMsg , long wParam , long lParam
LineCount = SendMessage(RichTextBox1.hwnd,0xba, 0, 0)
#3
cssnet4 天前 22:26
sorry, 我弄错啦。我以为问的是自然段,原来你想要的是第几行。

[此贴子已经被作者于2025-8-30 22:31编辑过]

#4
sych3 天前 10:44
对于UTF-8编码的支持

Thisform.AddObject("txtlabel", "OleControl", "Forms.Label.1")
仅支持显示,但支持多行

Thisform.AddObject("txttextbox", "OleControl", "Forms.TextBox.1")
支持显示、编辑,保存

Thisform.AddObject("txtRichtext", "OleControl", "RICHTEXT.RichTEXTCtrl.1")
虽然支持多行显示、编辑,但不能正确保存内容

[此贴子已经被作者于2025-8-31 12:24编辑过]

#5
csyx3 天前 11:46
以下是引用sych在2025-8-31 10:44:40的发言:
Thisform.AddObject("txttextbox", "OleControl", "Forms.TextBox.1")
仅支持单行显示、编辑,但可正确保存内容

误导,设置 MultiLine / EnterFieldBehavior 即 Editbox
#6
sych3 天前 12:23
看到回复,立马打开电脑上手实践,原来世界如此奇妙,版主所言极是,又学一招。
不懂英文又不善于学习,经常闹笑话,我前一阵子的帖子还在找editbox呢

[此贴子已经被作者于2025-8-31 12:34编辑过]

#7
wxzd1233 天前 18:40
回复 2楼 sych
谢谢老师,正确返回行数。
继续请教如何获取某一行的文字,谢谢
#8
sych3 天前 18:51
先获取全部内容,再用mlines
#9
wxzd1233 天前 19:50
回复 8楼 sych
老师没明白,能否给出示例代码,辛苦了,谢谢
#10
sych3 天前 20:12
MESSAGEBOX(mline(thisform.Olecontrol5.text,5))
只有本站会员才能查看附件,请 登录
#11
sych3 天前 20:20
ALINES( ) 不受 SET MEMOWIDTH设定值的影响
#12
吹水佬3 天前 20:43
试试:
总行数 消息 EM_GETLINECOUNT   0x00BA
取一行 消息 EM_GETLINE    0x00C4
    注意:
    1、在存放数据缓冲区(cBuffer)的首字节写入缓冲区最大的字符数值(nBufferSize)
    2、执行 SendMessage 读取数据,返回取得读出的字符串长(nLen)
    3、在读出的字符串尾部添加结束符'\0'

        
#13
wxzd123前天 06:11
回复 10楼 sych
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

老师只有14号字是对的,其他字号不对
#14
wxzd123前天 06:14
回复 12楼 吹水佬
版主好,这些代码不会用,要用到api吗?
#15
sych前天 08:16
MESSAGEBOX(mline(thisform.Olecontrol5.text,5))
这里和字号没有关系
#16
sych前天 08:22
学习是个枯燥的过程,没有捷径,可以从熟悉各个函数、命令做起
#17
sych前天 08:26
ALINES(sun,thisform.Olecontrol5.text)
这个也可以
如果你愿意学习,也可以看看这个,尝试着改写为vfp
快速获得Richtextbox控件指定行文本的方法 - 学剑学诗两不成 - 博客园  
https://
#18
吹水佬前天 10:19
以下是引用wxzd123在2025-9-1 06:14:56的发言:

版主好,这些代码不会用,要用到api吗?

用windows的标准控件EDIT试了一下,注意 SendMessageW 返回的是“字”数,不是“字节”数。
程序代码:

        DECLARE long SendMessageW   IN user32 as SendMessageW2   long,long,long,string@
        DECLARE long SetWindowTextW IN user32 as SetWindowTextW2 long,string
        #define EM_GETLINE    0x00C4
        nBufferSize = 2048    && 要足够大
        cBuffer     = BINTOC(nBufferSize,"4rs")+REPLICATE(0h00,nBufferSize+1)
        hEdit       = thisform.hEdit1    &&编辑框句柄
        nLineNo     = 9                  &&要取的行号(通常是从0行起)
        nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
        SetWindowTextW2(hEdit, cBuffer)   && 显示结果




[此贴子已经被作者于2025-9-1 10:36编辑过]

#19
wxzd123前天 13:00
回复 18楼 吹水佬
版主您好
 nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
这行提示数据类型不匹配
#20
wxzd123前天 13:02
回复 15楼 sych
你好,我发的截图第一个是字号14截图,第二个是字号22截图,第2个图就不是第五行的文字
#21
sych前天 13:06
那就按17楼的方法做
#22
吹水佬前天 20:15
以下是引用wxzd123在2025-9-1 13:00:35的发言:

版主您好
 nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
这行提示数据类型不匹配

 贴相关代码和截图出错提示看看
#23
nbwww前天 20:48
以下是引用wxzd123在2025-9-1 13:00:35的发言:

版主您好
 nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
这行提示数据类型不匹配


修改一下这句
 hEdit       = thisform.oleRTF.Hwnd
#24
sych昨天 08:22
注意:仅在vfp支持的字符集下有效

FUNCTION mGetRTLine(RThwnd As long, LineNum As Long)
#defi GTL_NUMBYTES  16
#defi EM_LINEINDEX 0xBB
#defi EM_GETLINECOUNT 0xBA
#defi EM_LINELENGTH 0xC1
#defi WM_USER  0x400
#DEFINE EM_GETTEXTRANGE  (WM_USER + 75)
Declare INTEGER SendMessage in WIN32API as sendmessage_n INTEGER hwnd , INTEGER wMsg , INTEGER wParam , INTEGER lParam
DECLARE INTEGER SendMessage IN win32api as sendmessage_c INTEGER hWnd, INTEGER wParam, INTEGER lParam,string @
DECLARE INTEGER GlobalAlloc IN KERNEL32.DLL  INTEGER         uFlags,INTEGER         dwBytes
DECLARE INTEGER GlobalLock IN KERNEL32.DLL   INTEGER         hMem
DECLARE INTEGER GlobalUnlock IN KERNEL32.DLL  INTEGER         hMem
DECLARE INTEGER GlobalFree IN KERNEL32.DLL    INTEGER         hMem
If LineNum < 1
    RETURN ""
EndIf
LineCount = SendMessage_n(RThWnd, EM_GETLINECOUNT, 0, 0)
If LineNum > LineCount
    RETURN ""
EndIf
charFrom = SendMessage_n(RThWnd, EM_LINEINDEX, LineNum - 1,  0)
lc = SendMessage_n(RThWnd, EM_LINELENGTH, charFrom,  0)
If lc = 0
    RETURN ""
endif
charEnd = charFrom + lc
trAddress=GetMemPoint(0,2048)
IF trAddress=0
    RETURN ""
endif
tr=BINTOC(charFrom,"4rs")+BINTOC(charEnd,"4rs")+BINTOC(trAddress,"4rs")
j = SendMessage_c(RThWnd, EM_GETTEXTRANGE, 0, @TR)
If j = 0
    RETURN ""
ENDIF
getRTLine = left(SYS(2600,trAddress,2048),j)
DeleteMemPoint(trAddress)
RETURN getRTLine

FUNCTION GetMemPoint()
lPARAMETER uFlags,MemLen,PointAddress
LOCAL MemHandle,PAddress,MemSize
MemHandle = GlobalAlloc(m.uFlags,m.Memlen)
IF m.MemHandle = 0
    RETURN 0
ENDIF
PAddress = GlobalLock(m.MemHandle)
IF m.PAddress = 0
    =GlobalFree(m.PointAddress)
    RETURN 0
ENDIF
RETURN     (m.PAddress)
ENDFUNC

FUNCTION DeleteMemPoint()
LPARAMETER PointAddress
=GlobalUnlock(m.PointAddress)
=GlobalFree(m.PointAddress)
ENDFUNC
#25
sych昨天 08:38
回复 18楼 吹水佬
还是这个方法简单高效
DECLARE long SendMessageW   IN user32 as SendMessageW2   long,long,long,string@
DECLARE long SetWindowTextW IN user32 as SetWindowTextW2 long,string
#define EM_GETLINE    0x00C4
nBufferSize = 2048    && 要足够大
cBuffer     = BINTOC(nBufferSize,"4rs")+REPLICATE(0h00,nBufferSize+1)
hEdit       = thisform.hEdit1    &&编辑框句柄
nLineNo     = 9                  &&要取的行号(通常是从0行起)
nWordCount  = SendMessageW2(hEdit, EM_GETLINE, nLineNo, @cBuffer)
SetWindowTextW2(hEdit, cBuffer)   && 显示结果

[此贴子已经被作者于2025-9-2 08:40编辑过]

#26
wxzd123昨天 11:17
sun这个参数是什么?请教sych老师
#27
sych昨天 11:20
这个是数组名,你要看帮助文档呀,里面很详细的
#28
sych昨天 14:44
回复 18楼 吹水佬
好像文本内容包含如ŋ之类的文字是无法正确获取的

[此贴子已经被作者于2025-9-2 14:50编辑过]

#29
sych昨天 14:59
oform1=NEWOBJECT("form1")
oform1.Show
READ EVENTS
RETURN

DEFINE CLASS form1 AS form

    autocenter = .t.
    Height = 325
    Width = 705

    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 12, ;
        Left = 12, ;
        Height = 27, ;
        Width = 120, ;
        Caption = "装入 文本文件", ;
        Name = "Command1"

    ADD OBJECT mstext AS olecontrol WITH ;
        Top = 50, ;
        Left = 12, ;
        Height = 232, ;
        Width = 684, ;
        oleclass = "Forms.TextBox.1", ;
        Name = "mstext"

    ADD OBJECT command2 AS commandbutton WITH ;
        Top = 12, ;
        Left = 144, ;
        Height = 27, ;
        Width = 120, ;
        Caption = "保存 utf-8 文本", ;
        Name = "Command2"

    PROCEDURE mstext.init
        WITH this
        .MultiLine = .t.
        .EnterkeyBehavior = .t.
        .wordwrap=.f.
        .scrollbars=3
        endwith
    ENDPROC

    PROCEDURE command1.Click
        Thisform.mstext.font.size = 20
        Sys(3101, 65001)
        aa=FileToStr(GetFile('txt'))
        Thisform.mstext.Text = IIF(left(aa,3)=0hefbbbf,SUBSTR(aa,4),IIF(LEFT(aa,2)=0hfffe,STRCONV(SUBSTR(aa,3),10),aa))
        Sys(3101, 0)
    ENDPROC

    PROCEDURE command2.Click
        Sys(3101, 65001)
        STRTOFILE(CHR(0xef)+CHR(0xbb)+CHR(0xbf)+Thisform.mstext.Text,"222.txt")
        Sys(3101, 0)
    ENDPROC

    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC

ENDDEFINE
#30
吹水佬昨天 15:50
以下是引用sych在2025-9-2 14:44:29的发言:

好像文本内容包含如ŋ之类的文字是无法正确获取的

windows标准控件测试正常,NET控件未试过。
1