実行ファイルに取り込んだテキストファイルを上書きするには?

解決


?  2008-09-04 21:03:45  No: 31825  IP: 192.*.*.*

実行ファイルにテキストファイルを取り込んでから、フォームにMemo
コンポーネントとButtonコンポーネントとを貼り付けて、

    procedure TForm1.Button1Click(Sender: TObject);
    var
      RS:TResourceStream;
    begin
      RS := TResourceStream.Create(hInstance,'test','TXT');
      try
        Memo1.Lines.LoadFromStream(RS);
      finally
        RS.Free;
      end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
      RS:TResourceStream;
    begin
      RS := TResourceStream.Create(hInstance,'test','TXT');
      try
        Memo1.Lines.SaveToStream(RS);
      finally
        RS.Free;
      end;
    end;

と記述してButton2をクリックしたところ、

    プロジェクト Project2.exe が EStreamError クラスの例外を生成しました。
    '読み込み専用リソース ストリームには書き込めません'
    プロセスは停止しています。再開するにはステップ実行または実行を選択してください。

と言われてしまいました。SaveToStream()というものが用意されているのだからこれで保存
できそうだと思ったんですが、リソースを上書きすることは不可能なのでしょうか?

編集 削除
うーむ  2008-09-04 22:15:53  No: 31826  IP: 192.*.*.*

>リソースを上書きすることは不可能なのでしょうか?

リソースはexeファイルの一部。自分の実行中に自分のファイルに書き込むことはできません。

編集 削除
?  2008-09-04 22:36:31  No: 31827  IP: 192.*.*.*

うーむ さん返答ありがとうございます。
リソースに上書きすることはできない、となると、実行ファイルの設定を
保存したければ、iniファイルのようなものを実行ファイルの外に用意する
以外に手段は無い、ということなのでしょうか?

編集 削除
うーむ  2008-09-05 02:44:05  No: 31828  IP: 192.*.*.*

そうです。そのために ini やレジストリがあるんですね。

編集 削除
?  2008-09-05 03:19:38  No: 31829  IP: 192.*.*.*

うーむ さんこんな真夜中にわざわざ返答していただきありがとうございます。
やはりiniファイルに書き込む必要があるのですね。
DelphiでSaveDialog付きの実行ファイルを作ると、前回ファイルを保存した
場所を実行ファイル自体が記憶しているようなので、これはきっと実行ファイル
内のデータを上書きしているのだろう、ならばリソースでも文字列ぐらいなら
上書きできるのではなかろうか、と思ったのですが間違いでした。
iniファイルを使うことにします。

編集 削除
うーむ  2008-09-05 04:54:17  No: 31830  IP: 192.*.*.*

SaveDialog はウィンドウズのコモンダイアログであり、アプリごとにレジストリに記録しているようです。

編集 削除
?  2008-09-05 06:06:15  No: 31831  IP: 192.*.*.*

なるほど、同じ実行ファイルを別々のフォルダに用意して、片方のファイル
を実行して終了した後、他方のファイルを実行すると、なぜか先程実行して
いたファイルの設定が反映されていて、不思議に思ったことがありますが、
実はwindows側で設定を外部に記録しているからだったわけですね。
勉強になりました。
うーむ さんありがとうございます。

編集 削除