Delphi - 将文件加载到字符串Grid中

时间:2013-09-16 11:05:28

标签: delphi

我正在尝试将一个简单的时间表(urnik.txt)加载到我的字符串grid.First我检查是否 文件存在,如果没有,那么我创建它,否则加载它。

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j, k: Integer;
  Seznam: TStrings;
  ApplicationPath: string;
const
  dan = '  PoToSrČePe';
begin
  ApplicationPath := ExtractFileDir(Application.ExeName);
  if not FileExists(ApplicationPath + '\Urnik.txt') then
  begin
    Seznam := TStringList.Create;
    try
      for i := 0 to AdvStringGrid1.ColCount - 1 do
        AdvStringGrid1.Cells[i, 0] := Copy(dan, 2 * i + 1, 2);
      for i := 1 to AdvStringGrid1.RowCount - 1 do
        AdvStringGrid1.Cells[0, i] := IntToStr(i) + '.ura';
      for i := 0 to AdvStringGrid1.ColCount - 1 do
        Seznam.AddStrings(advStringGrid1.Cols[i]);
      for i := 0 to AdvStringGrid1.RowCount - 1 do
        Seznam.AddStrings(advStringGrid1.rows[j]);
      Seznam.SaveToFile(ApplicationPath + '\Urnik.txt');
    finally
      Seznam.free;
    end;
  end
  else
    Seznam := TStringList.Create;
  try
    Seznam.LoadFromFile(ApplicationPath + '\Urnik.txt');
    k := 0;
    for i := 0 to AdvStringGrid1.ColCount - 1 do
      for j := 0 to AdvStringGrid1.RowCount - 1 do
      begin
        AdvStringGrid1.Cells[i, j] := Seznam.Strings[k];
        Inc(k);
      end;
  finally
    Seznam.free;
  end;
end;

要保存字符串网格的内容,请使用:

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  i, j: Integer;
  Seznam: TStrings;
  ApplicationPath: string;
begin
  ApplicationPath := ExtractFileDir(Application.ExeName);
  Seznam := TStringList.Create;
  try
    for i := 0 to AdvStringGrid1.ColCount - 1 do
      Seznam.AddStrings(AdvStringGrid1.Cols[i]);
    Seznam.SaveToFile(ApplicationPath + '\Urnik.txt');
  finally
    Seznam.free;
  end;
end;

但是,如果该文件不存在,我收到一个错误: error

我做错了什么?

procedure TForm1.FormCreate(Sender: TObject);
Var
I,j,k:Integer;
ApplicationPath: string;
Seznam:TStrings;
Const dan = '  PoToSrČePe';
begin
  ApplicationPath := ExtractFileDir(Application.ExeName);
  if not FileExists(ApplicationPath + '\Urnik.txt') then
  begin
    Seznam := TStringList.Create;
    try
      for i := 0 to AdvStringGrid1.ColCount - 1 do
        AdvStringGrid1.Cells[i, 0] := Copy(dan, 2 * i + 1, 2);
      for i := 1 to AdvStringGrid1.RowCount - 1 do
        AdvStringGrid1.Cells[0, i] := IntToStr(i) + '.ura';
      for i := 0 to AdvStringGrid1.ColCount - 1 do
        Seznam.AddStrings(advStringGrid1.Cols[i]);
      for i := 0 to AdvStringGrid1.RowCount - 1 do
        Seznam.AddStrings(advStringGrid1.rows[j]);
      Seznam.SaveToFile(ApplicationPath + '\Urnik.txt');
    finally
      Seznam.free;
    end;
  end
  else
  begin
    Seznam := TStringList.Create;
    try
      Seznam.LoadFromFile(ApplicationPath + '\Urnik.txt');
      k := 0;
      for i := 0 to AdvStringGrid1.ColCount - 1 do
        for j := 0 to AdvStringGrid1.RowCount - 1 do
        begin
          AdvStringGrid1.Cells[i, j] := Seznam.Strings[k];
          Inc(k);
        end;
    finally
      Seznam.free;
    end;
  end;
end;

这种作品......我希望没关系......

1 个答案:

答案 0 :(得分:2)

FormCreate中的else子句缺少begin / end。

更具体一点:当文件不存在时,您可以创建并释放Seznam。因为else没有开始/结束只有Seznam:= TStringList.Create;跳过,即使文件不存在,也会执行其余的代码。

在这种情况下,您可以在try-finally块中访问Seznam,这可能有效或无效,因为Seznam已经在if-then部分中被释放。最新的当你到达第二个SezNam.Free时,你将释放一个已经释放的实例,这很可能是导致错误的原因。