更改活动表单时,RichEdit需要两次单击才能更改光标(插入符号)位置(Delphi)

时间:2013-11-24 19:57:43

标签: delphi cursor caret richedit

这是设置(我使用的是Delphi 7,不确定这是否会在以后的版本中发生):

使用两个表单创建一个新项目。 在第一个表单上放置TMemoTRichEditTButton。 将LinesTMemo的{​​{1}}属性设置为TRichEdit。 在123456的{​​{1}}事件处理程序中添加TButton

运行应用程序,单击按钮,空OnClick将显示并获得焦点。 现在单击Form2.Show;Form2的文本“123456”的中间 - 焦点将变回TMemo,光标(插入符号)将位于文本的中间您按预期点击的“123456”。 再次点击Form1,再次重点关注。 现在点击Form1Form2的文本“123456”的中间 - 焦点将变回TRichEdit,但光标(插入符号)不会位于中间单击的文本“123456”,但在Form1的第二个空行(或以前的任何位置)。 如果您在Form1的文本“123456”中间的同一位置再次单击,则光标(插入符号)将按预期移动到那里。

因此RichEdit控件获得焦点,但光标(插入符号)未按预期移动。

注意:仅在将焦点从一种形式更改为另一种形式时才会发生这种情况。将焦点从一个控件更改为相同形式的TRichEdit控件不会出现这种有问题的行为。

我的问题:如何避免在TRichEdit内进行第二次点击,并使控件在这方面的行为与TRichEdit相似。

提前致谢!

1 个答案:

答案 0 :(得分:3)

您可以以任何您喜欢的方式派生新控件或子类化richedit,以干预激活机制。下面的示例插入器类将焦点设置到控件之前,如果控件尚未聚焦,当鼠标左键按下时,它将被发布:

type
  TRichEdit = class(comctrls.TRichEdit)
  protected
    procedure WMMouseActivate(var Message: TWMMouseActivate);
      message WM_MOUSEACTIVATE;
  end;

procedure TRichEdit.WMMouseActivate(var Message: TWMMouseActivate);
begin
  if (GetFocus <> Handle) and (Message.MouseMsg = WM_LBUTTONDOWN) then
    SetFocus;
  inherited;
end;