这是设置(我使用的是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
。
提前致谢!
您可以派生一个新的控件,或者以任何您喜欢的方式对 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;