Как запретить колесу прокрутки выбирать последнюю строку TStringGrid?
У меня есть TStringGrid с несколькими строками, в которой я реализовал какую-то строку "только для чтения". Точнее, я не позволяю пользователю щелкнуть предпоследний ряд. Если пользователь щелкает последнюю строку, ничего не происходит; фокус не будет перемещен на ячейки этого ряда.
У меня есть код (в KeyDown), и все работает гладко. Однако если пользователь щелкает верхнюю строку, а затем использует колесо мыши для прокрутки вниз, в конечном итоге фокус переместится на предпоследнюю строку. Есть идеи, как это предотвратить?
2 ответа
Ну, вы могли бы переопределить 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
, Все возможные механизмы изменения выбранной ячейки до последней строки будут заблокированы этим.
Как правильно указывает @TLama, вам не нужно подкласс TStringGrid
для достижения этой цели. Вы можете использовать OnSelectCell
событие:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Longint;
var CanSelect: Boolean);
begin
CanSelect := ARow<(Sender as TStringGrid).RowCount-1;
end;
Я решил эту проблему, поместив это в событие 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;