Sam*_*m M 5 delphi vcl delphi-xe2
我已经在表单上添加了组件提示.当组件获得焦点时,我想设置标签组件的标题以显示提示.
我添加了一个TApplicationEvents对象并将OnShowHint事件设置为
procedure TImportFrm.ApplicationEvents1ShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
begin
HelpLbl.Caption := HintStr;
end;
Run Code Online (Sandbox Code Playgroud)
但是,似乎ShowHint事件仅在鼠标移动时触发.有没有办法在组件获得焦点时触发提示代码,而不必为表单上的每个组件实现OnEnter事件?
在主窗体的创建中添加一个处理程序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;
Run Code Online (Sandbox Code Playgroud)
请注意,这Sender不会给你带来太多好处;总是如此Screen。您可以通过测试来过滤(例如,仅更改Label.Caption编辑控件)ActiveControl:
if (ActiveControl is TEdit) then
// Update caption of label with ActiveControl.Hint
Run Code Online (Sandbox Code Playgroud)
请注意,如果您在显示子表单时需要重新分配事件(分配给该子表单上的事件),或者您将始终使用提示更新原始表单的标签。进行重新分配的最简单方法是为每个OnActiveControlChange表单提供一个处理程序,并在表单的OnActivate事件中分配它并在OnDeactivate事件中取消分配它:
procedure TForm1.FormActivate(Sender: TObject);
begin
Screen.OnActiveControlChange := Self.ScreenActiveControlChange;
end;
procedure TForm1.FormDeactivate(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;
Run Code Online (Sandbox Code Playgroud)
这将允许您更新Label1每个表单以外的控件,并且仅在您想要执行此操作的表单上使用提示更改。
| 归档时间: |
|
| 查看次数: |
5512 次 |
| 最近记录: |