我在表单上添加了组件提示。当组件获得焦点时,我想设置标签组件的标题以显示提示。
我添加了TApplicationEvents对象并将OnShowHint事件设置为
procedure TImportFrm.ApplicationEvents1ShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
begin
HelpLbl.Caption := HintStr;
end;
然而,似乎ShowHint事件仅在鼠标移动时触发。有没有办法在组件获得焦点时触发提示代码,而不必为表单上的每个组件实现OnEnter事件?
答案 0 :(得分:4)
一个简单的解决方案是使用OnIdle
事件:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
if Assigned(ActiveControl) then
Label1.Caption:= ActiveControl.Hint;
end;
更高级的解决方案是覆盖ActiveChanged
的受保护TForm
方法:
type
TForm1 = class(TForm)
...
protected
procedure ActiveChanged; override;
end;
...
procedure TForm1.ActiveChanged;
begin
inherited;
if Assigned(ActiveControl) then
Label1.Caption:= ActiveControl.Hint;
end;
接收焦点和OnShowHint
是完全不同的事件;同样可以触发OnShowHint
进行非聚焦控制。
答案 1 :(得分:4)
在主窗体的创建中为TScreen.OnActiveControlChange
添加处理程序,并处理该事件中的提示:
type
TForm2=class(TForm)
...
private
procedure ScreenFocusControlChange(Sender: TObject);
end;
implementation
procedure TForm2.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := ScreenFocusControlChange;
end;
procedure TForm2.ScreenFocusControlChange(Sender: TObject);
begin
Label1.Caption := ActiveControl.Hint;
Label1.Update;
end;
请注意Sender
对你不会有好处;它总是Screen
。您可以通过测试Label.Caption
来过滤(例如,仅更改编辑控件的ActiveControl
:
if (ActiveControl is TEdit) then
// Update caption of label with ActiveControl.Hint
请注意,如果您在显示子表单时需要重新分配事件(对于该子表单上的事件),或者您将始终使用提示更新原始表单的标签。执行重新分配的最简单方法是为每个表单提供OnActiveControlChange
处理程序,并在表单的OnActivate
事件中指定它,并在OnDeactivate
事件中取消分配:
procedure TForm1.FormActivate(Sender: TObject);
begin
Screen.OnActiveControlChange := Self.ScreenActiveControlChange;
end;
procedure TForm1.FormDeactivate(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;
这样您就可以在每个表单上更新Label1
以外的控件,并且只使用您想要的表单上的提示更改。
答案 2 :(得分:1)
为什么需要为每个组件实现OnEnter
事件?您可以创建一个通用方法/事件处理程序,如:
procedure TForm1.AnyControlEnter(Sender: TObject);
begin
lbl1.Caption := TControl(Sender).Hint;
end;
并将其分配给您在表单上放置的每个组件。
答案 3 :(得分:1)
你说:
似乎ShowHint事件仅在鼠标移动时触发
这是正常行为。您遇到的问题(这是猜测)是提示不会直接触发。不要试图解决方法,你尝试用MouseEnter做的事情正是已经发生的事情......唯一的区别是你忘记了......
保留事件ApplicationEvents1ShowHint(),就像您最初完成的那样,但是在表单构造函数事件中添加它:
Application.HintPause := 1;
然后会立即(差不多)显示提示。