1

Delphi に StringGrid コンポーネントがあります。ユーザーが固定セル (ヘッダー) をクリックしたときにキャッチしたいと思います。

FixedCellClickイベントをグリッドにバインドすると、イベントはマウスの左ボタンを使用したクリックのみを検出できます。右のボタンで試しても何も起こりません。

procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
  ShowMessage('');
end;

解決策は何ですか?

4

2 に答える 2

2

TStringGridOnFixedCellClick左ボタンのクリックに対してのみイベントを発生させるようにハードコーディングされています。右ボタン クリックのイベントはありません。のソース コードを変更するか、仮想メソッドをオーバーライドできるようにTStringGridカスタム コンポーネントを派生させる必要があります。TStringGridMouseUp()

于 2016-04-13T00:13:28.193 に答える
2

お気づきのように、Clickイベントは通常、マウスの左ボタンのアクションに関連付けられています。マウス ボタン イベントをより一般的に処理するには、Mouseイベントがより便利です。

この場合、OnMouseButtonDownイベントを使用できます。

注:これは、コントロールの同じ領域でのマウスダウンに続くマウスアップに確実に応答するのではなく、最初のマウスダウンイベントに応答して発生するため、「クリック」に正確には対応し ません。 .

ただし、多くの場合、それで十分です。

OnMouseButtonDownイベントには、関連するマウスと位置を識別するパラメーターが含まれButtonXますYShiftStateまた、イベント中に Ctrl および/または Shift キーの状態を検出するための も含まれます (関連する場合)。

これらを使用して、固定された行/列でマウスの右ボタンが押されたことを検出できます。

procedure TfrmMain.StringGrid1MouseDown(Sender: TObject;
                                        Button: TMouseButton;
                                        Shift: TShiftState;
                                        X, Y: Integer);
var
  grid: TStringGrid;
  col, row: Integer;
  fixedCol, fixedRow: Boolean;
begin
  grid := Sender as TStringGrid;

  if Button = mbRight then
  begin
    grid.MouseToCell(X, Y, col, row);

    fixedCol := col < grid.FixedCols;
    fixedRow := row < grid.FixedRows;

    if   (fixedCol and fixedRow) then
      // Right-click in "header hub"

    else if fixedRow then
      // Right-click in a "column header"

    else if fixedCol then
      // Right-click in a "row header"

    else
      // Right-click in a non-fixed cell
  end;
end;
于 2016-04-13T00:13:49.640 に答える