まあ、これを達成するためにオーバーライドできます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;