在Delphi中清空字符串网格

时间:2011-11-11 15:10:41

标签: delphi memory grid

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

将rowcount设置为1,清空网格,但不释放内存。

提前致谢,

5 个答案:

答案 0 :(得分:10)

这应该取消初始化已分配的字符串(来自存储行文本的字符串列表)。由于您有很多行,因此按列完成清理。

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;

答案 1 :(得分:4)

通过“不释放内存”,您的意思是,如果设置RowCount := 1,然后设置RowCount := 10' you can still see the old content of the单元格?

如果是这样,这是一个老问题,与未被释放的内存无关;它只是因为你刚刚再次分配内存时才会看到内存的前一个内容,因为内存不是零。

我在实用程序单元中有一个非常标准的例程来处理这个视觉故障,除非网格巨大工作得足够快。只需在之前传递TStringGrid ,即可将RowCountColCount更改为较低的值。

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;

答案 2 :(得分:4)

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

答案 3 :(得分:2)

使用TStringGrid的最快方法是使用OnGetValue / OnSetValue。 这样,只动态请求可见单元格的文本。 然后添加和删除行快速点亮,否则TStringgrid 当你有超过5000条记录时非常懒散。 这样我就可以在一秒钟内填充并清除700.000条记录的网格!

答案 4 :(得分:1)

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

要清除从内存选项中排除moBeyondGrid的此类网格,请将RowCount设置为FixedRows

它是开源的,可下载的from here