在Delphi中,是否有一种快速清空TStringgrid(包含超过5000行)的方法,它还可以释放内存?
将rowcount设置为1,清空网格,但不释放内存。
提前致谢,
保
答案 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
,即可将RowCount
或ColCount
更改为较低的值。
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
之外,存储是否成比例(部分填充的行和列的内存使用量更少),是否存储Cols
和Rows
属性结果以及是否存储数据以稀疏的方式存储。
要清除从内存选项中排除moBeyondGrid
的此类网格,请将RowCount
设置为FixedRows
。
它是开源的,可下载的from here。