当水平滚动条移动时,实时更新StringGrid?

时间:2010-11-06 02:18:55

标签: delphi tstringgrid

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

我选择使用StringGrid。

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

它出现的StringGrid组件不会实时滚动。它等待直到释放鼠标按钮才更新列并在必要时滚动。

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

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

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

TIA

3 个答案:

答案 0 :(得分:4)

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

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的私有方法中。我不知道如何实现这一目标..

答案 1 :(得分:3)

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

要么基于TStringGrid编写一个新组件(我不会 - 它不是开箱即用的最佳工具)

但是花一些时间学习TVirtualStringTree。该组件比TStrignGrid领先多年。来源可用,有很多人使用它。

还有一些事件已经实现,可以对滚动条更改做出反应 OnScroll,OnShowScrollbar

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

在stackoverflow上搜索,您可以阅读有关tvirtualstringtree

的更多信息

答案 2 :(得分:0)

第二个使用TVirtualStringTree的建议。使用TStringGrid组件就像用生锈的剪刀刺伤自己的腹部。