Добавьте обработчик для 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
, в каждой форме и использовать изменения подсказок только в тех формах, которые вы хотите сделать.