Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当更改活动表单(Delphi)时,RichEdit需要单击两次以更改光标(插入符号)位置_Delphi_Cursor_Caret_Richedit - Fatal编程技术网

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

当更改活动表单(Delphi)时,RichEdit需要单击两次以更改光标(插入符号)位置,delphi,cursor,caret,richedit,Delphi,Cursor,Caret,Richedit,以下是设置(我使用的是Delphi 7,不确定在以后/早期版本中是否会发生这种情况): 使用两个表单创建一个新项目。 在第一个表单上放置一个TMemo、一个TRichEdit和一个TButton。 将TMemo和TRichEdit的行属性设置为123456。 在TButton的OnClick事件处理程序putForm2.Show中 运行应用程序,单击按钮,空的Form2将显示并获得焦点。 现在点击“代码123456”中的“TMemo < > Frime1/代码> -焦点将变回窗体,光标(插入

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

使用两个表单创建一个新项目。 在第一个表单上放置一个
TMemo
、一个
TRichEdit
和一个
TButton
。 将
TMemo
TRichEdit
属性设置为
123456
。 在
TButton
OnClick
事件处理程序put
Form2.Show中

运行应用程序,单击按钮,空的
Form2
将显示并获得焦点。 现在点击“代码123456”中的“TMemo < <代码> > <代码> Frime1/代码> -焦点将变回<代码>窗体<代码>,光标(插入符号)将位于文本“123456”的中间。 再次单击
Form2
,再次对其进行聚焦。 现在点击“代码123456”中的文本“TrHeDIT <代码> >代码> Frime1/代码> -焦点将变回<代码> Frime,但是光标(插入符号)不会在点击的文本“123456”的中间,而是在<代码>的第二个空行> RichEdit < /代码>(或它以前的任何地方)。 如果在“代码123456”文本“TrHeDID</代码>”的中间位置单击第二次,则光标(插入符号)将按预期移动到该位置。

因此
TRichEdit
控件获得焦点,但光标(插入符号)没有按预期移动

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

我的问题是:在这方面,如何避免在
TRichEdit
中进行第二次单击,并使控件的行为类似于
TMemo


提前谢谢

您可以派生一个新控件,或以任何方式将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;
类型
TRichEdit=类(comctrls.TRichEdit)
受保护的
过程WMMouseActivate(var消息:TWMMouseActivate);
消息WM_MOUSEACTIVATE;
结束;
过程TRichEdit.WMMouseActivate(变量消息:TWMMouseActivate);
开始
如果(getfocushandle)和(Message.MouseMsg=WM_LBUTTONDOWN),则
设置焦点;
继承;
结束;

这很可能与Delphi无关,只是这些Windows控件的标准行为。从另一个应用程序切换焦点时也会发生这种情况。@DavidHeffernan是的,我也是这么想的,因为RichEdit控件是Windows控件,而不是Delphi控件。这仍然是一个有问题的混乱行为,毫无意义,需要解决。为什么需要解决呢?@jedi-看看我的答案。太棒了!这个解决方案非常有效,正是我想要的。非常感谢。