如何防止滚轮选择TStringGrid的最后一行?

时间:2012-09-04 14:51:00

标签: delphi tstringgrid scrollwheel

我有一个包含多行的TStringGrid,其中我实现了某种“只读”行。更准确地说,我不允许用户点击倒数第二行。如果用户点击最后一行,则没有任何反应;焦点不会移动到该行的单元格。

我有代码(在KeyDown中),一切顺利。 然而,如果用户点击顶行,然后使用鼠标滚轮向下滚动,最终焦点将移至倒数第二行。知道如何防止这种情况吗?

2 个答案:

答案 0 :(得分: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。将阻止将所选单元格更改为最后一行的所有可能机制。

正如@TLama正确指出的那样,你不需要子类TStringGrid来实现这一点。您可以使用OnSelectCell事件:

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Longint;
  var CanSelect: Boolean);
begin
  CanSelect := ARow<(Sender as TStringGrid).RowCount-1;
end;

答案 1 :(得分:-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;