显示提示

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事件?

Ken*_*ite 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;
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每个表单以外的控件,并且仅在您想要执行此操作的表单上使用提示更改。