Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何处理大型字符串网格?_Delphi - Fatal编程技术网

Delphi 如何处理大型字符串网格?

Delphi 如何处理大型字符串网格?,delphi,Delphi,我发现我可能必须使用少于10列的字符串网格,但大约有50k行 实验表明,这是一个非常没有反应的CPU猪 有什么建议吗 代码还是组件 最好是Delphi(7)内置或TMS(我有许可证)或FOSS(用于商业用途) 更新:请不要只是告诉我使用虚拟树视图等。请告诉我为什么,这样我可以学到一些东西。谢谢。您可能想看看Virtual Treeview,它是为高容量而构建的: 经常推荐使用虚拟模式下的TListView组件(我自己没有尝试过,但听起来很容易实现)如果您对虚拟树视图感兴趣,您应该从中签出整个虚

我发现我可能必须使用少于10列的字符串网格,但大约有50k行

实验表明,这是一个非常没有反应的CPU猪

有什么建议吗

代码还是组件

最好是Delphi(7)内置或TMS(我有许可证)或FOSS(用于商业用途)



更新:请不要只是告诉我使用虚拟树视图等。请告诉我为什么,这样我可以学到一些东西。谢谢。

您可能想看看Virtual Treeview,它是为高容量而构建的:

经常推荐使用虚拟模式下的TListView组件(我自己没有尝试过,但听起来很容易实现)

如果您对虚拟树视图感兴趣,您应该从中签出整个虚拟树视图主干。您将找到Demos\Advanced子目录,其中和演示应用程序显示了虚拟树视图功能,例如如何将虚拟树视图用作网格


您需要SVN从googlecode签出代码。如果您从未使用过SVN下载并安装

,我认为将此号码添加到TStringGrid中不会产生问题

添加100k行不到1秒(700ms)(不是高端PC,只是双核)

我认为你的代码很慢,你会从数据库中获取数据吗?如果是这样的话,这将是代码的瓶颈,也将向任何网格添加50k,以显示给名为的用户“坏习惯”


如果不显示任何代码,很难告诉您为什么这么慢。

+1 Darian,我道歉。看起来我更新了这个问题是为了回应你的帖子,你可能认为这是侮辱。事实上,我突然想到,有些人可能会毫无理由地说“使用X”,这对我和其他阅读此问题的人来说帮助不大(如果我们理解了原因,这会有所帮助)。直到我编辑了这个问题之后我才看到你的答案(你确实说它是为高容量而构建的)。坦斯克,达里安,我已经搜索并阅读了关于它的好东西,但没有检查出来,因为它被称为树视图,我想要一个网格-更愚弄我。+1我想说虚拟树视图是你能得到的最好的。如果您查看Soft Gems网站上的屏幕截图,您可以看到该组件的各种“显示模式”——包括字符串网格视图。如果您不想了解代码速度慢的原因,您应该发布一些代码。首先,为什么“需要”加载50k行,您一次只能在屏幕上显示25-50行左右?其次,您还没有告诉我们您的系统(或虚拟机)有多少内存,以及这些50k行占用了多少内存,如果它需要的内存超过了系统内存,那么“虚拟内存”将发挥作用,并使用比RAM慢的HDD(或者,可能只是您的SSD)。不要把我的评论当作是攻击,我想了解你的问题是什么。我只能显示20-50行,但我确实需要某个地方的数据。也许我可以把它放在DB中,而不是字符串网格中,或者我想保留在我的程序中,而不使用DB。在任何一种情况下,我都会有两组数据-字符串网格,其中我保留了50行&soemwhere,其中我保留了其余(或全部),并且需要一些复杂的代码来同步它们。这是一个很好的观点,反映了我为什么要问这个问题。如果网格内置了某种过滤功能,那么50K行就可以了。在后端进行过滤并不总是最好/性能最好的解决方案,比如OLAP/cubes。@mjn,没错,但他问的问题是如何在普通StringGrid或TMS one中添加50k,这与OLAP/cubes无关。+1感谢您的编码(希望我能给出更多+1)。我认为我的问题可能是使用一个不支持db的字符串网格和一个db。但是使用db感知网格会让事情变得更好吗,还是会变得非常缓慢?人们通常对50k行字符串网格有问题吗?@LeonixSolutions,正如我之前所说的,显示50k是一种非常糟糕的做法,用户永远无法像您所显示的那样处理多行,但请尝试先将数据加载到内存表中,然后看看需要花费多少时间,然后将数据显示到DBGrid或StringGrid中,并查看差异。+1谢谢,这非常有用。我想这就是我要走的路
procedure TForm1.btn1Click(Sender: TObject);
Const
  arr : array[1..5] of string = ('One','Two','Three','Four','Five');
  Rows = 100000;
var
  I: Integer;
  F,E : Integer;
begin
  StringGrid1.RowCount := Rows;
  F := GetTickCount;
  for I := 0 to Rows do
  begin
    StringGrid1.Cells[1,I] := Arr[1] + IntToStr(I);
    StringGrid1.Cells[2,I] := Arr[2]+ IntToStr(I);
    StringGrid1.Cells[3,I] := Arr[3]+ IntToStr(I);
    StringGrid1.Cells[4,I] := Arr[4]+ IntToStr(I);
    StringGrid1.Cells[5,I] := Arr[5]+ IntToStr(I);
  end;
  E := GetTickCount;
  ShowMessage(Inttostr(E-F));
end;