从 Delphi 2006 迁移到 Delphi XE2 后,我们学到的一件事情是 RichEdit 2.0 内部用单个 CR 字符代替了 CRLF 对。这导致基于 VCL 实际文本字符串的所有字符索引计算都会出现偏差。
通过跟踪 VCL 代码,我能够看到以下行为:
1. 发送 WM_GETTEXT 消息(在 TControl.GetTextBuf 中执行)将返回一个包含 CRLF 对的文本缓冲区。 2. 发送 WM_GETTEXTLENGTH 消息(在 TControl.GetTextLen 中执行)将返回一个值,就好像文本仍然包含 CRLF 字符。 3. 相反,发送 EM_SETSELEX 消息(即设置 SelStart)会将输入值视为文本仅包含 CR 字符。
这导致我们应用程序中的很多问题失败(例如语法高亮)。正如您所看到的,对于每个新行,所有内容都会偏差一个字符。
显然,由于这种不一致的行为,我们肯定是遗漏了某些东西或者做错了什么。
有没有其他人经历过从 RichEdit 1.0 到 RichEdit 2.0 控件的迁移,并且他们是如何解决这个问题的?最后,有没有办法强制 RichEdit 2.0 使用像 RichEdit 1.0 一样的 CRLF 对呢?
通过跟踪 VCL 代码,我能够看到以下行为:
1. 发送 WM_GETTEXT 消息(在 TControl.GetTextBuf 中执行)将返回一个包含 CRLF 对的文本缓冲区。 2. 发送 WM_GETTEXTLENGTH 消息(在 TControl.GetTextLen 中执行)将返回一个值,就好像文本仍然包含 CRLF 字符。 3. 相反,发送 EM_SETSELEX 消息(即设置 SelStart)会将输入值视为文本仅包含 CR 字符。
这导致我们应用程序中的很多问题失败(例如语法高亮)。正如您所看到的,对于每个新行,所有内容都会偏差一个字符。
显然,由于这种不一致的行为,我们肯定是遗漏了某些东西或者做错了什么。
有没有其他人经历过从 RichEdit 1.0 到 RichEdit 2.0 控件的迁移,并且他们是如何解决这个问题的?最后,有没有办法强制 RichEdit 2.0 使用像 RichEdit 1.0 一样的 CRLF 对呢?
EM_SETSEL
是常见的编辑控件消息,而不是特定于富文本编辑的消息。 - TLama