0

ある種の「読み取り専用」行を実装したいくつかの行を持つTStringGridがあります。もっと正確に言うと、ユーザーが最後から2番目の行をクリックすることを許可しません。ユーザーが最後の行をクリックしても、何も起こりません。フォーカスはその行のセルに移動しません。

私は(KeyDownに)コードを持っていて、すべてがスムーズに機能します。ただし、ユーザーが一番上の行をクリックしてからマウスホイールを使用して下にスクロールすると、最終的にフォーカスは最後から2番目の行に移動します。これを防ぐ方法はありますか?

4

2 に答える 2

5

まあ、これを達成するためにオーバーライドできますDoMouseWheelDown

function TMyStringGrid.DoMouseWheelDown(Shift: TShiftState; 
  MousePos: TPoint): Boolean;
begin
  if Row<RowCount-2 then
    //only allow wheel down if we are above the penultimate row
    Result := inherited DoMouseWheelDown(Shift, MousePos)
  else
    Result := False;
end;

しかし、フォーカスを最後の行に移動する方法が他にないことをどのように知っていますか?

実際、はるかに優れた解決策はオーバーライドすることSelectCellです:

function TMyStringGrid.SelectCell(ACol, ARow: Longint): Boolean;
begin
  Result := ARow<RowCount-1;
end;

このようにすると、KeyDownコードは必要なく、オーバーライドする必要もありませんDoMouseWheelDown。選択したセルを最終行に変更するすべての可能なメカニズムは、これによってブロックされます。

TStringGrid@TLama が正しく指摘しているように、これを達成するためにサブクラス化する必要はありません。イベントを使用できますOnSelectCell

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Longint;
  var CanSelect: Boolean);
begin
  CanSelect := ARow<(Sender as TStringGrid).RowCount-1;
end;
于 2012-09-04T14:55:39.813 に答える
-1

これをイベント OnMouseWheelUp に入れることで、この問題を解決しました。

procedure Tmainform.sgup(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
        sg.RowCount := sg.RowCount + 1;
        sg.RowCount := sg.RowCount - 1;
end;
于 2015-05-21T18:47:17.760 に答える