在Delphi中清空字符串网格

10

在Delphi中,是否有快速清空TStringgrid(包含超过5000行)并释放内存的方法?

将行数设置为1可以清空网格,但不会释放内存。

谢谢!

保罗


内存有什么问题?将rowcount设置为1并不能释放内存,但是根据我的观察,当你重新填充行时,这块内存会被再次使用。如果你真的想要释放内存,可以尝试释放TStringGrid并重新创建它。 - philnext
5个回答

15

这应该会取消初始化已分配的字符串(从存储行文本的字符串列表中)。由于你有很多行,所以清理是按列进行的。

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to StringGrid1.ColCount - 1 do
    StringGrid1.Cols[I].Clear;
  StringGrid1.RowCount := 1;
end;

6
“不释放内存”是指如果您设置“RowCount:= 1”,然后设置“RowCount:= 10”,仍然可以看到旧的“Cells”的内容吗?
如果是这样,那么这是一个老问题,与内存释放无关; 这仅仅是因为重新分配内存时恰好看到了先前的内存内容,因为内存没有被清零。
我在实用程序单元中有一个非常标准的程序来处理这个视觉故障,除非网格很大,否则速度足够快。只需在更改“RowCount”或“ColCount”为较低值之前将“TStringGrid”传递即可。
procedure ClearStringGrid(const Grid: TStringGrid);
var
  c, r: Integer;
begin
  for c := 0 to Pred(Grid.ColCount) do
    for r := 0 to Pred(Grid.RowCount) do
      Grid.Cells[c, r] := '';
end;

使用方法如下:

ClearStringGrid(StringGrid1);
StringGrid1.RowCount := 1;

把它倒过来不是更好吗?先设置 RowCount,然后再清除 StringGrid 吗?你没有通过 BeginUpdate / EndUpdate 锁定更新,这可能会闪烁。 - TLama
1
实际上不是这样的。:) 如果你先改变 RowCount,那么你就无法访问旧行以清除它们。不过你提到的忘记使用 Begin/EndUpdate 是对的;我的实际代码在另一台机器上,我忘记加上了。已修复。:) - Ken White
没有 TStringGrid.BeginUpdateTStringGrid.EndUpdate ;) 但是您可以访问 RowsCols,因为 OP 说他有很多行,所以我决定清除 Cols。当然,如果您先设置 RowCount,那么您只需要在行中迭代一次就可以了。 - TLama
你就是坚持让我修复Begin/EndUpdate的问题,是吗? :) 明白了;昨天一定很累了。 <g> 谢谢。 - Ken White
еҚідҪҝItemsдёҚеӯҳеңЁ :) еҸӘжңүRowsе’ҢColsжҳҜTStringsгҖӮиҝҷзңҹзҡ„жҳҜдёҖдёӘеҫҲе·®зҡ„жҺ§д»¶ ;) - TLama
显示剩余2条评论

5

我建议您将字符串值存储在自己完全掌控的内存中,然后使用 TDrawGrid 或更好的虚拟 TListView 在需要时显示该内存的内容。


+1,或者我最喜欢的VirtualTreeView :) - TLama

2

使用OnGetValue/OnSetValue是使用TStringGrid的最快方法。这样只会动态请求可见单元格的文本。添加和删除行将变得非常快,否则当你有超过5000条记录时,TStringgrid会非常缓慢。这样,我可以在一秒钟内填充和清除具有700,000条记录的网格!


你知道 Delphi 何时引入了 OnGetValue/OnSetValue 事件吗?至少在 Delphi 4 中它们还不可用。 - Wolf

1

当内存使用是关键参数时,请考虑使用另一个网格。例如,NLDStringGrid,这是我自己编写的,并且具有一个名为MemoryOptions的附加属性。它控制数据是否可以存储在ColCount * RowCount之外,存储是否成比例(部分填充的行和列使用更少的内存),是否存储ColsRows属性结果以及数据是否以稀疏方式存储。

要清除具有从内存选项中排除moBeyondGrid的网格,只需将RowCount设置为FixedRows即可。

它是开源的,可以从这里下载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接