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

问题描述 投票:0回答:1

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

创建一个具有两种表单的新项目。 在第一个表格上放置一个

TMemo
、一个
TRichEdit
和一个
TButton
。 将
Lines
TMemo
TRichEdit
属性设置为
123456
。 在
TButton
OnClick
事件处理程序中放置
Form2.Show;

运行应用程序,单击按钮,空的

Form2
将显示并获得焦点。 现在单击
TMemo
Form1
的文本“123456”的中间 - 焦点将变回
Form1
,并且光标(插入符号)将位于您单击的文本“123456”的中间正如预期的那样。 再次单击
Form2
使其再次获得焦点。 现在单击
TRichEdit
Form1
的文本“123456”的中间 - 焦点将变回
Form1
,但光标(插入符号)不会位于文本“123456”的中间您单击的位置,但位于
RichEdit
的第二个空行(或之前所在的位置)。 如果您在
TRichEdit
的文本“123456”中间的同一位置第二次单击,光标(插入符号)现在将按预期移动到那里。

因此

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

注意:只有当焦点从一种形式更改为另一种形式时,才会发生这种情况。将焦点从一个控件更改为同一窗体中的 TRichEdit 控件不会表现出这种有问题的行为。

我的问题:如何避免在

TRichEdit
内进行第二次单击,并让控件在这方面表现得像
TMemo

提前致谢!

delphi vcl caret richedit
1个回答
5
投票

您可以派生一个新的控件,或者以任何您喜欢的方式对 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;
© www.soinside.com 2019 - 2024. All rights reserved.