在Delphi 2010中,我需要显示一个网格,其水平滚动条大约有15列x5行。
我选择使用StringGrid。
但是,当鼠标按钮向下拖动水平滚动条时,我希望网格滚动直播。
它出现的StringGrid组件不会实时滚动。它等待直到释放鼠标按钮才更新列并在必要时滚动。
此外,水平滚动条按钮(就是所谓的)与列数不成比例。并且当在底行上的向下箭头移动到右边的下一列的顶部时...
这些似乎是常见的需求,所以我很惊讶不在TStringGrid中找到它们。
关于解决这两个问题的方法有什么建议吗?我可以使用DbGrid或其他标准组件,但我倾向于不使用商业网格,如果我可以避免它。而且我不打算使用共享软件或免费软件......
TIA
答案 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组件就像用生锈的剪刀刺伤自己的腹部。