TRichEdit含3行及以上文本时如何判断内容是否全部选中?
问题原因
这不是TRichEdit控件的BUG,是两个属性的底层统计逻辑不一致导致的:
GetTextLen底层调用Win32 APIGetWindowTextLengthW,统计文本长度时会将每行末尾的CRLF(#13#10)按照2个字符计算SelLength由RichEdit原生的EM_EXGETSEL消息返回,换行符的统计逻辑和前者不同,内容行数越多,两者的差值越明显,就会出现SelLength小于GetTextLen的误判情况
可靠解决方案
使用RichEdit原生消息获取和SelLength统计逻辑一致的总文本长度,同时增加选中起始位置的判断让逻辑更严谨:
uses Winapi.Messages, Vcl.ComCtrls; function IsRichEditAllSelected(ARichEdit: TRichEdit): Boolean; var NativeTextLen: Integer; begin // EM_GETTEXTLENGTHEX返回的长度和SelLength的统计规则完全匹配 NativeTextLen := SendMessage(ARichEdit.Handle, EM_GETTEXTLENGTHEX, 0, 0); // 同时判断选中起始位置为0,避免极端场景误判 Result := (ARichEdit.SelStart = 0) and (ARichEdit.SelLength = NativeTextLen); end;
调用示例:
var AllSelected: Boolean; // ... AllSelected := IsRichEditAllSelected(MyRichEdit);
该方法在Delphi 10.4环境下完全兼容,可支持任意行数的纯格式RTF内容判断。
内容的提问来源于stack exchange,提问作者AlexV
相关产品推荐
相关产品推荐

