相対パスで指定すると、Iniファイルが作成されません

解決


ムキー  2004-03-05 20:32:11  No: 7584  IP: 192.*.*.*

uses節にIniFilesを加え、
var
  Form1: TForm1;
  Ini : TIniFile;
procedure TForm1.Button1Click(Sender: TObject);
begin
    Ini := TIniFile.Create('test.ini'); ※1
    Ini.WriteBool('flg','a_flg',true);
    Ini.Free;

end;

なお、※1を
    Ini := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));
とすると、アプリケーション名と同じ名前のiniファイルが作成されます。

普通のテキストファイルとかを読み込むときも相対パスだと書き込めなかった経験があります。参考書を見ると、普通に相対パスで特に断りもなく書かれているのですが、何か設定が必要なのでしょうか?ご回答よろしくお願い致します。

編集 削除
ふぐちゃん  2004-03-05 21:29:07  No: 7585  IP: 192.*.*.*

TIniFileのCreateはAPIのGetPrivateProfileString関数を
利用しているのですが、この関数はファイル名にフルパスが
指定されていないとWindowsディレクトリにINIファイルを
作成してしまいます。
絶対パスで指定すべきでしょう。

> 普通のテキストファイルとかを読み込むときも相対パスだと
> 書き込めなかった経験があります。
カレントディレクトリはTOpenDialog等で変更されますので、
この場合も相対パスは避けるべきです。

編集 削除
ムキー  2004-03-05 22:25:27  No: 7586  IP: 192.*.*.*

ふぐちゃんさん、どうもありがとうございます。
WINNTフォルダを見たらさりげなく作成されていました(^_^;)。
しかし、プログラムを配布する場合、ユーザーがどのフォルダにアプリケーションをコピーするかわからないので、どうやって絶対パスを書いておけばいいんでしょうか?ちょっと想像がつきません。

編集 削除
通りすがり  2004-03-05 23:42:22  No: 7587  IP: 192.*.*.*

Application.ExeName
ExtractFilePath
等をヘルプで調べるといいかも。

編集 削除
通りすがり  2004-03-05 23:44:41  No: 7588  IP: 192.*.*.*

ExtractFilePathは関係ないか^^;

編集 削除
たかみちえ  URL  2004-03-06 00:13:00  No: 7589  IP: 192.*.*.*

相対パスと絶対パスを相互変換する関数がありますよ、
ExtractRelativePath 関数 で、相対パス→絶対パス
ExpandFileName 関数 で、その逆を行います。
ヘルプにありますので、みてみてください。

  ただし、ExpandFileNameが展開時に基準とするパスはカレントフォルダです。
SetCurrentDirなどをつかって、一時的にでも目的のフォルダに変更してあげてください。


  ちなみにわたしは、ChangeFileExt(Application.ExeName, '.ini') でやっていますが…。

編集 削除
たかみちえ  URL  2004-03-06 00:14:36  No: 7590  IP: 192.*.*.*

何を勘違いしているんだろう(^_^;
上の、関数の説明が真逆になってます。
ExtractRelativePath 関数 は、絶対パス→相対パス ですね。

編集 削除
ムキー  2004-03-06 01:52:09  No: 7591  IP: 192.*.*.*

できたぁ。上記コードでChangeFileExt関数を使うやりかたでそのまま
読み込めばいいだけでした。たかみちえさん、通りすがりさん、
感謝です。また、勉強させてもらいたいと思いますので、気が向いたら
今後も面倒をみてやってください。では、失礼致します。

編集 削除