7

私は Lazarus 0.9.30 を実行しています。

フォームに標準TStringGridがあり、列のタイトルの上にマウス ポインターを移動すると、別のヒントを表示したいと考えています。私はこれを行うためにこのコードを使用していますが、それはある程度機能しますが、マウスポインターが上に移動したときに実際にセルを変更したい場合は、ヒントを変更するためにセルをクリックする必要があります。列インデックスをキーとして使用して検索するコレクションにすべてのヒントを格納しています。ヒントをよりスムーズに表示する方法はありますか?

procedure TTmMainForm.SgScoutLinkMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  R, C: Integer;
begin
  R := 0;
  C := 0;

  SgScoutLink.MouseToCell(X, Y, C, R);

  with SgScoutLink do
  begin
    if (R = 0) then
      if ((C >= 3) and (C <= 20)) then
      begin
        SgScoutLink.Hint := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3);
        SgScoutLink.ShowHint:= True;
      end; {if}
  end; {with}
end;
4

2 に答える 2

10

TApplication.OnShowHintイベント ハンドラーをまたはイベントに割り当てるかTApplicationEvents.OnShowHint、 または サブクラス化してメッセージTStringGridをインターセプトしCM_HINTSHOWます。THintInfoこれらのいずれかを使用すると、ヒント ウィンドウの動作を制御するために使用されるレコードにアクセスできます。THintInfo.CursorRect必要に応じてメンバーの座標をカスタマイズできます。ヒント ウィンドウは、マウスがその四角形の外に移動するたびに、最新のHintプロパティ テキスト (表示される前にメンバーでカスタマイズできます) で再アクティブ化されます。THintInfo.HintStr四角形が小さいほど、ヒント ウィンドウが再アクティブ化される頻度が高くなります。この機能により、UI コントロールはクライアント領域内に複数のサブセクションを持ち、マウスが同じ UI コントロール内を移動している間、異なるヒント文字列を表示できます。

TApplication.HintShortPauseプロパティの値(またはCM_HINTSHOWPAUSEメッセージをインターセプトする値) は、再アクティブ化する前にヒント ウィンドウが消えるかどうかを制御します。一時停止の値を 0 に設定すると、ヒント ウィンドウは消えることなくテキストをすぐに更新します。一時停止の値を 0 以外の値に設定すると、マウスが同じ UI コントロール上にある限り、ヒント ウィンドウが消え、指定されたミリ秒数が経過すると再び表示されます。

例えば:

procedure TTmMainForm.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;

procedure TTmMainForm.FormDestroy(Sender: TObject);
begin
  Application.OnShowHint := nil;
end;

procedure TTmMainForm.AppShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo);
var 
  R, C: Integer; 
begin
  if HintInfo.HintControl = SgScoutLink then
  begin
    R := 0; 
    C := 0; 
    SgScoutLink.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, C, R); 
    if (R = 0) and (C >= 3) and (C <= 20) then 
    begin 
      HintInfo.CursorRect := SgScoutLink.CellRect(C, R);
      HintInfo.HintStr := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
    end;
  end;
end;

編集: Lazarus を使用していることに気付きました。私が説明したのは、Delphi でこの問題を処理する方法です。それがラザロにも当てはまるかどうかはわかりません。

于 2012-02-15T01:38:39.823 に答える