-2

私のプログラムでは、ユーザーはフォームに入力してから を押しSubmitます。次に、すべてのユーザー情報が書き込まれるテキストファイルまたはランダムな拡張ファイルが作成されます。そのため、ユーザーがアプリケーション フォームを実行するたびに、すべての情報を含むファイルが存在するかどうかを確認し、情報をコピーしてフォームに貼り付けます。ただし、何らかの理由で機能していません (構文エラーはありません)。

procedure TForm1.FormCreate(Sender: TObject);
var
  filedest: string;
  f: TextFile;
  info: array[1..12] of string;
begin
  filedest := ExtractFilePath(ParamStr(0)) + 'User\Identity\IdentityofMyself.txt';

  if FileExists(filedest) then
  begin
    AssignFile(f,filedest);
    Reset(f);

    ReadLn(info[1], info[2], info[3], info[4], info[5], info[6], info[7],
      info[8], info[9], info[10], info[11], info[12]);     

    Edit1.Text := info[1];
    Edit2.Text := info[2];
    ComboBox1.Text := info[3];            
    ComboBox5.Text := info[4];
    ComboBox8.Text := info[4];
    ComboBox6.Text := info[5];
    ComboBox7.Text := info[6];
    Edit3.Text := info[7];
    Edit4.Text := info[8];
    Edit5.Text := info[11];
    Edit6.Text := info[12];
    ComboBox9.Text := info[9];
    ComboBox10.Text := info[10];     

    CloseFile(f);                                           
  end
  else
  begin
    ShowMessage('File not found');
  end;

end;

ファイルは存在しますが、メッセージが表示されますFile not found。理解できない。

4

2 に答える 2

5

私はあなたのためにコードをフォーマットする自由を取りました。違い(ビフォーアフター)が分かりますか?また、私があなただったら、コントロールにもっと良い名前を付けます。、などの代わりにEdit1、、、などを使用できます。そうしないと、コードを維持するための PITA になり、たとえばと混同する可能性があります。Edit2Edit3eFirstNameeLastNameeEmailAddrComboBox7ComboBox4

コードの具体的な問題の 1 つは、次の行です。

readln(info[1], info[2], info[3], info[4], info[5], info[6], info[7],
  info[8], info[9], info[10], info[11], info[12]);  

ファイルを指定するのを忘れましたf!

また、コードをフォーマットする前に、最後endの手順がありませんでした。実際のコードではブロックが正しくない可能性があるためShowMessage、ファイルが存在しても表示されますか? (コードを適切にフォーマットするもう 1 つの理由...)

この問題に遭遇し、簡単なデバッグを行いたい場合は、挿入します

ShowMessage(BoolToStr(FileExists(filedest), true));
Exit;

ラインの直後

filedest := ...

の戻り値が何であるかを確認するだけFileExists(filedest)です。(もちろん、ブレークポイントを設定してデバッガを使用することもできます。)

が表示された場合、実際にはfalse何が含まれているのか疑問に思うでしょうfiledest: 上記の「デバッグ コード」を次のコードに置き換えます。

ShowMessage(filedest);
Exit;

次に、Windows エクスプローラー (またはコマンド プロンプト) を使用して、ファイルが実際に存在するかどうかを確認します。

于 2013-05-14T10:01:56.647 に答える
2

デバッグ メッセージを出力する別の可能性について言及したいと思います (実際のデバッガーの操作方法がまだわからないと仮定します)。

  { ... }
  filedest := ExtractFilePath(ParamStr(0)) + 'User\Identity\IdentityofMyself.txt';

  AllocConsole;                   // create console window (uses Windows module) - required(!)
  WriteLn('"' + filedest + '"');  // and output the value to verify

  if FileExists(filedest) then
  { ... }
于 2013-05-14T10:25:55.857 に答える