Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#1

CM_HINTSHOW in Komponente

  Alt 13. Okt 2018, 23:01
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat