Как запретить колесу прокрутки выбирать последнюю строку 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;
Другие вопросы по тегам