这是设置(我使用的是Delphi 7,不确定这是否会在以后的版本中发生):
使用两个表单创建一个新项目。
在第一个表单上放置TMemo
,TRichEdit
和TButton
。
将Lines
和TMemo
的{{1}}属性设置为TRichEdit
。
在123456
的{{1}}事件处理程序中添加TButton
运行应用程序,单击按钮,空OnClick
将显示并获得焦点。
现在单击Form2.Show;
中Form2
的文本“123456”的中间 - 焦点将变回TMemo
,光标(插入符号)将位于文本的中间您按预期点击的“123456”。
再次点击Form1
,再次重点关注。
现在点击Form1
中Form2
的文本“123456”的中间 - 焦点将变回TRichEdit
,但光标(插入符号)不会位于中间单击的文本“123456”,但在Form1
的第二个空行(或以前的任何位置)。
如果您在Form1
的文本“123456”中间的同一位置再次单击,则光标(插入符号)将按预期移动到那里。
因此RichEdit
控件获得焦点,但光标(插入符号)未按预期移动。
注意:仅在将焦点从一种形式更改为另一种形式时才会发生这种情况。将焦点从一个控件更改为相同形式的TRichEdit控件不会出现这种有问题的行为。
我的问题:如何避免在TRichEdit
内进行第二次点击,并使控件在这方面的行为与TRichEdit
相似。
提前致谢!
答案 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;