保存StringGrid时进度条进度

时间:2013-05-24 18:28:50

标签: delphi

我正在开发一个程序,我有一个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:=0ProgressBar1.Max:=FileSize。你有什么建议吗?

1 个答案:

答案 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;