我正在开发一个程序,上面有一个StringGrid;当按下某个特定按钮时,我的程序会将字符串it保存到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。你有什么意见建议?
发布于 2013-05-25 03:08:53
我们说的是多少个细胞?您的主要瓶颈是为每个单元格写入文件,而不是进行缓冲写入。
我建议您用来自TStringGrid的数据填充TStringList,并使用TStringList.SaveToFile()方法。
我在具有10,000,000个单元格(10,000行x 1,000列)的StringGrid上测试了以下过程,它在不到一秒的时间内将数据保存到磁盘:
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;https://stackoverflow.com/questions/16741420
复制相似问题