4

在 Delphi 2010 中,我需要显示一个具有大约 15 列 x 5 行的水平滚动条的网格。

我选择使用 StringGrid。

但是,当鼠标按钮向下拖动水平滚动条时,我希望网格实时滚动。

看起来,StringGrid 组件不会实时滚动。它会一直等到释放鼠标按钮,然后再更新列并在必要时滚动。

此外,水平滚动条按钮(就是所谓的)与列数不成比例。对于底部行上的向下箭头移动到右侧下一列的顶部...

这些似乎是常见的需求,所以我很惊讶没有在 TStringGrid 中找到它们。

关于解决这两个问题的方法有什么建议吗?我可以使用 DbGrid 或其他标准组件,但如果可以避免的话,我的偏好是不使用商业网格。而且我不会使用共享软件或免费软件...

TIA

4

3 回答 3

4

对于第一个问题,您可以在设计时或运行时goThumbTracking在 StringGrid中设置:Options

StringGrid1.Options := StringGrid1.Options + [goThumbTracking];


对于第三个问题,您可以通过使用控件的键盘事件处理程序来提供您需要的功能。一个例子;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  StringGrid: TStringGrid;
begin
  StringGrid := Sender as TStringGrid;
  case Key of
    VK_DOWN:
      if StringGrid.Row = StringGrid.RowCount - 1 then begin
        Key := 0;
        StringGrid.Row := StringGrid.FixedRows;
        if StringGrid.Col = StringGrid.ColCount - 1 then
          StringGrid.Col := StringGrid.FixedCols
        else
          StringGrid.Col := StringGrid.Col + 1;
      end;
    VK_UP:    //...;
    VK_RIGHT: //;
    VK_LEFT:  //;
  end;
end;


对于第二个问题,滚动代码似乎隐藏在TCustomGrid. 我不知道如何实现这一目标..

于 2010-11-06T09:57:13.963 回答
3

如果注意到您对第三方组件不感兴趣——免费软件,我也不喜欢这些,但如果我们想要解决问题,有时我们都必须做出牺牲。这是这些牺牲之一!这个组件好到可以忽略。如果您没有几年的空闲时间,您将不会自己创建类似的东西。

要么写一个基于 TStringGrid 的新组件(我不会 - 它不是盒子里最好的工具)

但是花点时间学习一下 TVirtualStringTree。该组件比 TStrignGrid 领先数年。源是可用的,并且有很多人使用它。

并且已经实现了对滚动条变化做出反应的事件 OnScroll、OnShowScrollbar

http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

在 stackoverflow 上搜索,您可以阅读更多关于 tvirtualstringtree 的信息

于 2010-11-06T09:28:56.323 回答
0

其次是使用 TVirtualStringTree 的建议。使用 TStringGrid 组件就像用生锈的剪刀在自己的肚子上刺一样。

于 2010-11-06T09:45:13.693 回答