2010-11-06 67 views
3

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

我选择使用StringGrid。

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

显示的StringGrid组件不会实时滚动。它会一直等到鼠标按钮被释放后再更新列并在必要时滚动。

此外,水平滚动条按钮(即所谓的)与列数不成正比。而对于一个向下的箭头,当在底部行移动到右边的下一列的顶部...

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

任何有关解决这两个问题的建议?我可以使用DbGrid或其他标准组件,但是如果我可以避免它,我的首选是不使用商业网格。而且我不打算使用共享软件或免费软件...

TIA

回答

3

对于第一个问题,你可以设置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私有方法。我不知道如何做到这一点..

+0

谢谢,Sertac。我没有注意到goThumbTracking选项。很棒。我以类似于您的建议代码的方式处理了OnKeyDown中的箭头键。 (感谢您将它添加到您的回复中。)我会放弃让Thumb变大。再次感谢! – RobertFrank 2010-11-06 14:28:30

3

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

写根据TStringGrid一个新的组件(我不会 - 它不是在盒子开始的最佳工具)

但需要一定的时间和学习TVirtualStringTree。该组件比TStrignGrid早几年。来源是可用的,并且有许多人使用它。

而且目前已经实现对滚动条反应事件的变化 OnScroll,OnShowScrollbar

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

搜索的计算器,你可以阅读更多关于tvirtualstringtree

+0

+1 VirtualTreeView是一个优秀的组件,如果不是最好的组件。这是一个非常聪明的概念,并得到很好的实施。 – Remko 2010-11-06 11:21:26

+0

+1对于TVirtualStringTree建议 – RobertFrank 2010-11-06 14:32:16

0

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