データを保存するためにファイルを新規作成してから保存するということを
やりたいのですが上手くいきません。
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がありません』といった内容のメッセージが
出てきます。このやり方でファイルの保存を行うにはどのように設定すればよいの
でしょうか?ヘルプや本を見ても詳しくは書いてないので困っています。
どうかご存知の方教えていただけないでしょうか?
ライブラリパスがなくなっていませんか?
Classes.dcu(Personal以外にはソースファイルがあるらしいですから、あればソースファイルフォルダを指定したほうがいいでしょうけど)は
(Delphiのフォルダ)\Lib にあります。
ツール>環境オプションで確認してみてください、そして、なくなっていたら、追加してください。
ところで、テキストファイルの保存なら、TStringListを介したほうがコードはすっきりしますけど…。
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;
これでどうでしょう?
なるほど、たかみちえさん、kazuさんありがとうございます。
ライブラリパスはなくなっていませんでした。
Delphi6 Personalだからできないのでしょうか?
kazuさんには答えて申し訳ないのですが、TFileStreamを使用するのはあきらめて
TStringlistを介したコードでやってみようと思うのですが、
上のプログラムでいうと
FS := TFileStream.Createを、FS := TStringList.Create に変更すればよいのでしょうか?
また変更したときのファイルの保存方法はどのようにすればよいのでしょうか?
IntegerもしくはStringをテキストファイルに保存したいのですがイマイチわかりません。
SaveToFile(tes.txt + mat[i,j]);
とやってみたのですがText型との互換性の問題でできません。
どうするのがよいでしょうか?
> Delphi6 Personalだからできないのでしょうか?
それはないです。そもそもほとんどのファイル操作関数は、ほとんどClassesにはいってます。(TStringListも)
それがなかったら、なんのためのPersonalでしょうか(^^ゞ
Personalでできないことは、あんまり多くないです。事実Delphi6Personalで作られたフリーソフトもたくさんありますから。
uses節にかかれたClassesの記述のスペルが違うとか、そういうことはないでしょうか?
それと、
> といった内容の
という文面が気になるのですけど、"classes.pasがありません"という文章以外の文章だったとしたら、別のエラーになります。
"識別子の多重定義..."だったら、Classesが間違って二つ以上かかれたことになりますし。
> とやってみたのですがText型との互換性の問題でできません。
TStringListはTextFile変数を保持するのではなく、ただの文字列を保持します。
文字列そのものを入れてください。
保存方法、文字列の追加方法、編集方法はすべてヘルプ参照です。
たかみちえさん、どうもありがとうございます。
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;
追加ですが、下から3番目の段落のFS.SaveToFile(...でエラーが出ます。
SaveToFileだけの場合は'未定義の識別子’とエラーが出ます。
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); です
書き忘れましたが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;
Takuさんありがとうございます。
SaveDialogを使わない場合はできました。
しかし、先に書いて頂いたSaveDialogを使った場合になると
EAccessViolationクラスの例外が発生します。無効なメモリへのアクセスをしていることになると思うのですが原因がわかりません。
おかしいところはSaveDialogのところなのですが、一つのルーチンの中にSaveも含めると’ソースファイルが見つかりません’となります。
他のルーチンに分けて実行すると上記のようなエラーになります。その場合に、他にも’読み込み、書き込み違反’というメッセージが出ることもあります。
これはTStringListの利用に原因があるのでしょうか?
せっかく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;
kazuさんありがとうございます。
ルーチンを分けた場合では、FSなど必要なものすべて一応グローバルにしていたのですが・・・
保存の方法よくわかりました。書き込んで頂いたみなさんどうもありがとうございました。大変勉強になりました。
ツイート | ![]() |