まず次のようTListViewののCMHintShowを公開する必要があります。
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;
はその後OnInfoTipイベントで、希望する位置を設定します。私の例では、ScrollBox(sbxFilter - TlistViewの下にあります)のTopLeft Cornerの座標を取得し、CoordをTListViewプロパティ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;
これはうまく動作します。私は自分のTListViewサブクラスの名前を 'THintPostListView'と命名し、宣言と関数を別々の基本単位に入れて、フォームが必要に応じてコントロールを使用できるようにしました。コントロールを使用するフォームの上部では、この例のように 'TListView = class(THintPosListView);を宣言するだけです。 – AlainD