Search code examples
windowsdelphidelphi-7

Set position of InfoTip


My TListView control has ShowHints enabled and handles the OnInfoTip event. The message in the popup InfoTip box is set in the OnInfoTip handler. However, the position of the popup InfoTip box is relative to the position of the mouse when hovering over an item in the list. There doesn't appear to be a way to customise the position.

Is it possible set the position of the hint popup, for example in a specific area of the TListView or even elsewhere on the form outside the bounds of the TListView control? Ideally, I'd like to display the hint popup in such a way to minimise (or eliminate) obscuring any other item in the TListView.


Solution

  • First you have to expose the CMHintShow of the TListView as following:

      type
       TListView = class(Vcl.ComCtrls.TListView)
          private
             FPos: TPoint;
          protected
             procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
          published
             property MyPos: TPoint  read FPos write FPos;
       end;
    
    
      TfrmMain = class(TForm)
        ...
        ListView1: TListView;
    

    Then at the OnInfoTip event you set the desired Position. At my example, I get the coords of the TopLeft Corner of a ScrollBox (sbxFilter - which is located under the TlistView) and pass the Coords to the TListView property MyPos.

    procedure TfrmMain.ListView1InfoTip(Sender: TObject; Item: TListItem; var InfoTip: string);
    var
       p: TPoint;
    begin
       InfoTip := 'Test';
       p := sbxFilter.ClientToScreen(point(0, 0));
       ListView1.MyPos := p;
    end;
    
    
    { TListView }
    
    procedure TListView.CMHintShow(var Message: TCMHintShow);
    begin
       inherited;
       Message.HintInfo.HintPos := FPos;
    end;