-1

シンプルな時刻表 (urnik.txt) を文字列グリッドにロードしようとしています。まず、ファイルが存在するかどうかを確認し、存在しない場合は作成し、そうでない場合はロードします。

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;

ただし、ファイルが存在しない場合は、エラーが発生します。 エラー

私は何を間違っていますか??

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;

このような作品....私はそれが大丈夫だといいのですが....

4

1 に答える 1

2

FormCreate の else 句に begin/end がありません。

より具体的には、ファイルが存在しない場合は、Seznam を作成して解放します。else には begin/end がないため、Seznam := TStringList.Create; のみです。がスキップされると、ファイルが存在しなくても残りのコードが実行されます。

その場合、Seznam は if-then 部分で既に解放されているため、try-finally ブロックで Seznam にアクセスします。最新の 2 番目の SezNam.Free に到達すると、既に解放されているインスタンスを解放しようとしていますが、これがエラーの原因である可能性が最も高いです。

于 2013-09-16T11:12:42.303 に答える