StatusBar에 가각의 패널마다 다른 힌트를 보여주고 싶을때가 있습니다.
그래서 OnHint 이벤트에다가 적당해 해주려고 하면 무슨 문제가 있는지 않됩니다.
구글링 해서 좀 살펴보니.. AutoHint를 True로 설정하면 된다고하는데.. 그래도 안됩니다.
그래서 Application.OnHint 또는 TApplicationEvent 콤포넌트를 사용해서 하면 되지만 StatusBar에 무슨 문제가 있는지 뒤져보기로 맘 먹고.. 뒤져보니깐... TControl.CMHintWindow 프러시저에서 ActionLink가 없으면 DoHint를 호출하지 않더군요.. 음.. 그런데 대부분 StatusBar에 Action을 지정하고 쓰지는 않으니깐.. CMHintShow 이벤트를 Override해서 적당히하면 되겠다 싶어서 간단히 만들어 봤습니다.
TStatusBar에서 CMHintShow를 다음과 같이 Override하면 됩니다.
procedure TStatusBar.CMHintShow(var Message: TMessage);
begin
if Assigned(OnHint) then
begin
OnHint(self);
with TCMHintShow(Message) do
begin
HintInfo.HintStr := Hint;
Result := Integer(Hint = '');
end;
end else
Inherited;
end;
예제는 파일로 첨부했습니다. 예제에서는..
- 위처럼 TStatusBar를 다시 만들어서 한다고 새 콤포넌트를 만들어서 작업하는 것은 낭비여서 Form에 설정된 TStatusBar를 그대로 두고 새 기능이 추가된 새 클래스를 넣었습니다.
- TStatusBar는 윈도우에서 제공하는 몇가지 기능을 그대로 표현하지 않아서 PanelAt()이라는 Helper 함수를 추가했습니다.
|