显示提示

时间:2011-12-06 23:45:27

标签: delphi vcl delphi-xe2

我在表单上添加了组件提示。当组件获得焦点时,我想设置标签组件的标题以显示提示。

我添加了TApplicationEvents对象并将OnShowHint事件设置为

procedure TImportFrm.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  HelpLbl.Caption := HintStr;
end;

然而,似乎ShowHint事件仅在鼠标移动时触发。有没有办法在组件获得焦点时触发提示代码,而不必为表单上的每个组件实现OnEnter事件?

4 个答案:

答案 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;

然后会立即(差不多)显示提示。