Обычно делал так:
Код:
...
private
{ Private declarations }
procedure ShowHint(Sender: TObject);
procedure OnShowHint(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
procedure AppIdle(Sender: TObject; var Done: Boolean);
...
end;
function FindStatusBar(var SB : TStatusBar) : Boolean;
begin
// ищем наш StatusBar на активной форме
SB := TStatusBar(Screen.ActiveForm.FindComponent('StatusBar'));
// если не найден -- ищем на основной форме
if not Assigned(SB) then
SB := TStatusBar(Application.MainForm.FindComponent('StatusBar'));
Result := SB <> NIL;
end;
procedure TMainForm.ShowHint(Sender: TObject);
var
SB : TStatusBar;
begin
// если что-то обнаружено -- рисуем на нем наш текст
if FindStatusBar(SB) and Assigned(SB) then
SB.SimpleText := Application.Hint;
end;
// меняем цвет и ширину стандартной подсказки.
procedure TMainForm.OnShowHint(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
begin
with HintInfo do
begin
HintMaxWidth := 250;
HintColor := clAqua;
end;
end;
procedure TMainForm.AppIdle(Sender: TObject; var Done: Boolean);
var
S : String;
SB : TStatusBar;
begin
S := Screen.ActiveControl.Hint;
// если что-то обнаружено -- рисуем на нем наш текст
if (not Screen.ActiveControl.ShowHint) and (FindStatusBar(SB)) and (Assigned(SB)) then
begin
if S <> '' then
SB.SimpleText := S
else
SB.SimpleText := '';
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
...
Application.OnHint := ShowHint;
Application.OnShowHint := OnShowHint; // Установка обработчика
Application.OnIdle := AppIdle;
...
end;
саму подсказку можно писать как обычно или делать двойную разделенную символом |.
Код:
Подсказка
Подсказка|Очень длинная подсказка.
В первом случае одна и та же подсказка выведется у контрола и в StatusBar-е, во-втором, в StatusBar выведется текст после символа |.