在Delphi中,是否有快速清空TStringgrid(包含超过5000行)并释放内存的方法?
将行数设置为1可以清空网格,但不会释放内存。
谢谢!
保罗
这应该会取消初始化已分配的字符串(从存储行文本的字符串列表中)。由于你有很多行,所以清理是按列进行的。
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;
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
锁定更新,这可能会闪烁。 - TLamaRowCount
,那么你就无法访问旧行以清除它们。不过你提到的忘记使用 Begin/EndUpdate
是对的;我的实际代码在另一台机器上,我忘记加上了。已修复。:) - Ken WhiteTStringGrid.BeginUpdate
或 TStringGrid.EndUpdate
;) 但是您可以访问 Rows
或 Cols
,因为 OP 说他有很多行,所以我决定清除 Cols
。当然,如果您先设置 RowCount
,那么您只需要在行中迭代一次就可以了。 - TLamaBegin/EndUpdate
的问题,是吗? :) 明白了;昨天一定很累了。 <g> 谢谢。 - Ken White我建议您将字符串值存储在自己完全掌控的内存中,然后使用 TDrawGrid 或更好的虚拟 TListView 在需要时显示该内存的内容。
使用OnGetValue/OnSetValue是使用TStringGrid的最快方法。这样只会动态请求可见单元格的文本。添加和删除行将变得非常快,否则当你有超过5000条记录时,TStringgrid会非常缓慢。这样,我可以在一秒钟内填充和清除具有700,000条记录的网格!
OnGetValue
/OnSetValue
事件吗?至少在 Delphi 4 中它们还不可用。 - Wolf当内存使用是关键参数时,请考虑使用另一个网格。例如,NLDStringGrid,这是我自己编写的,并且具有一个名为MemoryOptions
的附加属性。它控制数据是否可以存储在ColCount * RowCount
之外,存储是否成比例(部分填充的行和列使用更少的内存),是否存储Cols
和Rows
属性结果以及数据是否以稀疏方式存储。
要清除具有从内存选项中排除moBeyondGrid
的网格,只需将RowCount
设置为FixedRows
即可。
它是开源的,可以从这里下载。