当更改活动表单(Delphi)时,RichEdit需要单击两次以更改光标(插入符号)位置
以下是设置(我使用的是Delphi 7,不确定在以后/早期版本中是否会发生这种情况): 使用两个表单创建一个新项目。 在第一个表单上放置一个当更改活动表单(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/代码> -焦点将变回窗体,光标(插入
TMemo
、一个TRichEdit
和一个TButton
。
将TMemo
和TRichEdit
的行
属性设置为123456
。
在TButton
的OnClick
事件处理程序putForm2.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-看看我的答案。太棒了!这个解决方案非常有效,正是我想要的。非常感谢。