Ich möchte in einer meiner Komponenten einen speziellen Hint anzeigen lassen, je nach Position des Mauszeigers. In dieser Komponente verwende ich unter anderen Paintboxen in denen die Items dargestellt werden.
Mittels
Delphi-Quellcode:
procedure TKomponente.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
i: Integer;
mousept: TPoint;
newItemIndex: Integer;
HintPos: TPoint;
begin
mousept.X:=X;
mousept.Y:=Y;
newItemIndex:=-1;
for i:=0 to self.FItemList.Count-1 do
if PtInRect(self.FItemList[i].Rect, mousept) then
newItemIndex:=i;
if newItemIndex<>FMouseOverItem then
begin
FMouseOverItem:=newItemIndex;
if FMouseOverItem>-1 then
begin
HintPos.X:=Self.FItemList[FMouseOverItem].BoundsLeft;
HintPos.Y:=Self.FItemList[FMouseOverItem].Rect.Bottom+3;
Hintpos:=self.FPaintBoxClient.ClientToScreen(HintPos);
Application.CancelHint;
Application.ActivateHint(HintPos);
end;
end;
end;
von der FPaintBoxClient ermittele ich das Item, über dem die Mouse befinde. Das Item wird gefunden und die Zeile Application.ActivateHint wird auch ausgeführt.
Dann will ich auf die Messages
Delphi-Quellcode:
procedure TKomponente.CMHintShow(var Message: TCMHintShow);
var
HintStr: string;
begin
inherited;
if Message.HintInfo.HintControl=Self then
begin
if (FMouseOverItem>-1) and (FMouseOverItem<self.FItemList.Count) then
HintStr:=Self.FItemList[FMouseOverItem].Hint else HintStr:='';
Message.HintInfo.HintStr:=HintStr;
Message.HintInfo.HideTimeout:=FHintDelay;
end;
end;
procedure TKomponente.CMHintShowPause(var Message: TCMHintShowPause);
var
PHintDelay: PInteger;
begin
inherited;
PHintDelay:=@FHintDelay;
Message.Pause:=PHintDelay;
end;
reagieren, explizit natürlich auf die CM_HINTSHOW , damit ich den passenden HintStr setzen kann. Diese wird aber nie ausgeführt.
Deklaration sieht folgendermaßen aus:
Delphi-Quellcode:
procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
procedure CMHintShowPause(var Message: TCMHintShowPause);
message CM_HINTSHOWPAUSE;
Es wird auch nie ein Hint angezeigt. Was könnte ich vergessen haben? Die Message CM_HINTSHOW müsste doch wenigstens ankommen.