ファイルの作成、保存について

解決


たけし  2003-01-10 11:30:48  No: 2561

データを保存するためにファイルを新規作成してから保存するということを
やりたいのですが上手くいきません。
var  i,j:Integer;F:TextFile;
     mat:array [0..9,0..9] of Integer;FS:TFileStream;
 begin  FS := TFileStream.Create('D\tes.txt',fmOpenWrite +                    fmShareExclusive);
        AssignFile(F, 'tes.txt');
        Rewrite(F);
        for i := 1 to 10 do
         begin for j := 1 to 10 do
                begin mat[i,j] := i+j;
                end;
         end;
        for i := 1 to 10 do
         begin for j := 1 to 10 do
                begin Writeln(F, IntToStr(mat[i,j]));
                end;
         end;
         FS.Free;
end;
とやり実行すると『classes.pasがありません』といった内容のメッセージが
出てきます。このやり方でファイルの保存を行うにはどのように設定すればよいの
でしょうか?ヘルプや本を見ても詳しくは書いてないので困っています。
どうかご存知の方教えていただけないでしょうか?


たかみちえ  URL  2003-01-10 16:45:57  No: 2562

ライブラリパスがなくなっていませんか?
Classes.dcu(Personal以外にはソースファイルがあるらしいですから、あればソースファイルフォルダを指定したほうがいいでしょうけど)は
(Delphiのフォルダ)\Lib  にあります。  
ツール>環境オプションで確認してみてください、そして、なくなっていたら、追加してください。

  ところで、テキストファイルの保存なら、TStringListを介したほうがコードはすっきりしますけど…。


kazu  2003-01-10 18:08:53  No: 2563

var
  mat:array [0..9,0..9] of Integer;
begin
  :
for i := 1 to 10 do          //←i := 0 to 9
  begin for j := 1 to 10 do  //←j := 0 to 9
  :
for i := 1 to 10 do          //←i := 0 to 9
  begin for j := 1 to 10 do  //←j := 0 to 9

または

var
  mat:array [1..10,1..10] of Integer;

これでどうでしょう?


たけし  2003-01-11 08:28:14  No: 2564

なるほど、たかみちえさん、kazuさんありがとうございます。
ライブラリパスはなくなっていませんでした。
Delphi6 Personalだからできないのでしょうか?
kazuさんには答えて申し訳ないのですが、TFileStreamを使用するのはあきらめて
TStringlistを介したコードでやってみようと思うのですが、
上のプログラムでいうと
FS := TFileStream.Createを、FS := TStringList.Create  に変更すればよいのでしょうか?
また変更したときのファイルの保存方法はどのようにすればよいのでしょうか?
IntegerもしくはStringをテキストファイルに保存したいのですがイマイチわかりません。
SaveToFile(tes.txt + mat[i,j]);
とやってみたのですがText型との互換性の問題でできません。
どうするのがよいでしょうか?


たかみちえ  URL  2003-01-11 08:46:26  No: 2565

> Delphi6 Personalだからできないのでしょうか?
  それはないです。そもそもほとんどのファイル操作関数は、ほとんどClassesにはいってます。(TStringListも)
それがなかったら、なんのためのPersonalでしょうか(^^ゞ
  Personalでできないことは、あんまり多くないです。事実Delphi6Personalで作られたフリーソフトもたくさんありますから。

  uses節にかかれたClassesの記述のスペルが違うとか、そういうことはないでしょうか?
それと、
> といった内容の
  という文面が気になるのですけど、"classes.pasがありません"という文章以外の文章だったとしたら、別のエラーになります。
"識別子の多重定義..."だったら、Classesが間違って二つ以上かかれたことになりますし。

> とやってみたのですがText型との互換性の問題でできません。
  TStringListはTextFile変数を保持するのではなく、ただの文字列を保持します。
文字列そのものを入れてください。
保存方法、文字列の追加方法、編集方法はすべてヘルプ参照です。


たけし  2003-01-12 10:50:30  No: 2566

たかみちえさん、どうもありがとうございます。

Classesの記述はデフォルトの状態で書かれているので間違えているということは
無いと思われます。implementationの後に記述したときに、’識別子の多重定義'というエラーが出ます。

ファイルの保存方法について以前から何度も試みているのですが、本当にわかりません。一応参考書はいくつか揃っているのですが、参考書もDelphiのヘルプも軽く流しているだけで本当に知りたいところが書かれていません。本当の最後の最後で何をすればよいのかがわかりません。
何度もやっているのですが必ずと言っていいほどエラーがでてしまいます。参考までに見て頂けないでしょうか?

var  i,j:Integer;
      F:String;
      mat:array [0..9,0..9] of Integer;
      FS:TStringList;
 begin  FS := TStringList.Create;
        try  F := 'test.txt';
             for i := 1 to 10 do
             begin for j := 1 to 10 do
                    begin mat[i,j] := i+j;
                    end;
             end;
             for i := 1 to 10 do
              begin for j := 1 to 10 do
                     begin FS.Add(IntToStr(mat[i,j]));
                     end;
              end;
              FS.SaveToFile(SaveDialog1.FileName);
        finally FS.Free;
        end;


たけし  2003-01-12 11:13:25  No: 2567

追加ですが、下から3番目の段落のFS.SaveToFile(...でエラーが出ます。
SaveToFileだけの場合は'未定義の識別子’とエラーが出ます。


Taku  2003-01-12 19:23:10  No: 2568

Kazuさんのレスを良く見てください
配列を0..9で宣言して1..10で代入すれば、当然エラーになります
プロジェクト->オプション->コンパイラの範囲チェックを有効にすればDelphiが教えてくれます。

FS.SaveToFile(SaveDialog1.FileName);はSaveDialog1を呼び出していないと
この場合もエラーになります
F := 'test.txt'を使うのならFS.SaveToFile(F);
SaveDialog1.FileNameを使うのなら、コンポーネントを貼り付けて
if SaveDialog1.Execute then
  FS.SaveToFile(SaveDialog1.FileName);  です


Taku  2003-01-12 19:35:55  No: 2569

書き忘れましたがTStringListを使うならmatは要りません
配列に代入しないのでforはどんな数値から初めてもエラーになりません
begin  
      FS := TStringList.Create;
  Try  
      F := 'test.txt';
      for i := 1 to 10 do
        for j := 1 to 10 do
          FS.Add(IntToStr(i+j)); //この場合はbegin - end も不要です
      FS.SaveToFile(F);
  finally 
      FS.Free;
  end;
end;


たけし  2003-01-13 02:30:54  No: 2570

Takuさんありがとうございます。
SaveDialogを使わない場合はできました。

しかし、先に書いて頂いたSaveDialogを使った場合になると
EAccessViolationクラスの例外が発生します。無効なメモリへのアクセスをしていることになると思うのですが原因がわかりません。
おかしいところはSaveDialogのところなのですが、一つのルーチンの中にSaveも含めると’ソースファイルが見つかりません’となります。
他のルーチンに分けて実行すると上記のようなエラーになります。その場合に、他にも’読み込み、書き込み違反’というメッセージが出ることもあります。
これはTStringListの利用に原因があるのでしょうか?


kazu  2003-01-13 06:57:50  No: 2571

せっかくTakuさんがかいてくれてるのに。
レスは丁寧に読んでね。

一つのルーチンというのが良くわからないけど、同じイベント内に
書いた場合ということなら、SaveDialog1.FileNameが空っぽなんじゃない?

別のルーチン(イベント?)に書いた場合はのエラーは、FS:TStringListが
ローカルだから。

var
  i,j:Integer;
  FS:TStringList;
begin
  if SaveDialog1.Execute then begin
  FS := TStringList.Create;
  try
    for i := 1 to 10 do
      for j := 1 to 10 do
        FS.Add(IntToStr(i+j));
    FS.SaveToFile(SaveDialog1.FileName);
  finally
    FS.Free;
  end;
  end;
end;


たけし  2003-01-13 07:02:55  No: 2572

kazuさんありがとうございます。
ルーチンを分けた場合では、FSなど必要なものすべて一応グローバルにしていたのですが・・・
保存の方法よくわかりました。書き込んで頂いたみなさんどうもありがとうございました。大変勉強になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加