我正在开发一个程序,我有一个StringGrid;当按下某个特定按钮时,我的程序将stringgtid保存到c:\ myfolder \ tab9.txt中。我想设置一个进度条,指示在保存过程结束时剩余的时间,因为有时网格有很多行,可能需要一些时间。我正在使用此代码:
procedure SaveSG(StringGrid:TStringGrid; const FileName:TFileName);
var
f: TextFile;
i,k: Integer;
begin
AssignFile(f, FileName);
Rewrite(f);
with StringGrid do
begin
Writeln(f, ColCount); // Write number of Columns
Writeln(f, RowCount); // Write number of Rows
for i := 0 to ColCount - 1 do // loop through cells of the StringGrid
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
我以这种方式调用该过程:SaveSG(StringGrid1,'c:\myfolder\myfile.txt');
。我的问题是我不明白如何进行表示保存进度的进度条。目前我只宣布了ProgressBar1.Position:=0
和ProgressBar1.Max:=FileSize
。你有什么建议吗?
答案 0 :(得分:3)
我们在谈论多少个细胞?您的主要瓶颈是您正在为每个单元格写入文件,而不是进行缓冲写入。
我建议您使用TStringGrid中的数据填充TStringList,并使用TStringList.SaveToFile()方法。
我在StringGrid上测试了10,000,000个单元格(10,000行x 1,000列)的以下程序,并在不到一秒的时间内将数据保存到磁盘:
procedure SaveStringGrid(const AStringGrid: TStringGrid; const AFilename: TFileName);
var
sl : TStringList;
C1, C2: Integer;
begin
sl := TStringList.Create;
try
sl.Add(IntToStr(AStringGrid.ColCount));
sl.Add(IntToStr(AStringGrid.RowCount));
for C1 := 0 to AStringGrid.ColCount - 1 do
for C2 := 0 to AStringGrid.RowCount - 1 do
sl.Add(AStringGrid.Cells[C1, C2]);
sl.SaveToFile(AFilename);
finally
sl.Free;
end;
end;