4

ヒントを表示しようとしている次のコードがあります。

procedure TMyGrid.OnGridMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  aPoint: TPoint;
begin
  inherited;
  //Application.Hint := 'Hint Text';
  //Application.ShowHint := True;
  Grid.Hint := 'Hint Text';
  Grid.ShowHint := True;
  aPoint.X := X;
  aPoint.Y := Y;
  Application.ActivateHint(aPoint);
end;

しかし、ヒントは表示されません。どうしたの?

4

2 に答える 2

11

TApplicationグリッド コントロールのOnMouseMoveイベントで新しいヒントを強制的に表示しようとするのではなくCM_HINTSHOW、現在のヒントが正常に表示されるたびにグリッドにメッセージを処理させて、現在のヒントをカスタマイズするのが正しい方法です。

メッセージは、その値 のレコードCM_HINTSHOWへのポインターを提供します。コントロールのクライアント領域内の現在のマウス位置を示すメンバーと、現在のヒントが有効であるべきコントロールのクライアント領域内の四角形を定義できるメンバーがあります (ヒントをさらにカスタマイズするための他のメンバーがあります。テキスト、色、ウィンドウ クラス、表示/非表示のタイムアウトなど)。マウスがその四角形の外側に移動してもコントロールのクライアント領域内にある場合、メッセージが再度生成され、現在のヒントを更新するための新しい情報が取得されます。 THintInfoLPARAMTHintInfoCursorPosCursorRectTHintInfoCM_HINTSHOW

マウスを動かすたびにヒントを更新する必要がある場合は、次のようCursorRectに、現在の のみを含むカスタムを定義できますCursorPos

type
  TMyGrid = class(...)
  private
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  end;

procedure TMyGrid.CMHintShow(var Message: TCMHintShow);
begin
  with Message.HintInfo^ do
  begin
    HintStr := Format('Hint Text (%d,%d)', [CursorPos.X, CursorPos.Y]);
    CursorRect := Rect(CursorPos.X, CursorPos.Y, CursorPos.X, CursorPos.Y);
  end;
end;
于 2013-02-22T19:39:35.717 に答える
8

ActivateHintクライアント座標ではなく、画面座標でポイントが必要です。

ドキュメントから:

ActivateHint は、CursorPos で指定された位置にコントロールまたはメニュー項目を配置します。ここで、CursorPos は画面座標をピクセル単位で表します。コントロールを見つけた後、ActivateHint はコントロールのヒントをヒント ウィンドウに表示します。

したがって、次のようにメソッドを変更する必要があります。

procedure TMyGrid.OnGridMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  aPoint: TPoint;
begin
  inherited;
  //Application.Hint := 'Hint Text';
  Grid.Hint := 'Hint Text';
  Grid.ShowHint := True;
  aPoint.X := X;
  aPoint.Y := Y;
  aPoint := ClientToScreen(aPoint);
  Application.ActivateHint(aPoint);
end;
于 2013-02-22T18:53:16.357 に答える