You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TRichEdit含3行及以上文本时如何判断内容是否全部选中?

问题原因

这不是TRichEdit控件的BUG,是两个属性的底层统计逻辑不一致导致的:

  • GetTextLen 底层调用Win32 API GetWindowTextLengthW,统计文本长度时会将每行末尾的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:48:02