iniファイルの中身が破壊(項目が減っていた、など)されることがありました。その原因の可能性を探っています。
下記は一般的なiniファイルの読み書きかと思いますが、最後の「INI.Free;」を実行しなかった場合に、iniファイルの中身を破壊することはありますか?
その他に、内容が破壊されるような可能性、状況などはありますか?
---------------------------------------------------
INI:= TIniFile.Create(strIniFile);
{処理}
strData1 := INI.ReadString('項目', 'データ1', '');
INI.WriteString('項目', 'データ1', '書き換え');
INI.UpdateFile;
{処理}
INI.Free;
オブジェクトが残っていれば、他の場所で操作できるため、項目の削除等できてしまいます。
不要になったら解放するのがよいかと。
INI操作のAPIには、扱えるファイルサイズに制限があります。
# win2000系でも制限されていたかは覚えていませんが
そして、TIniFileクラスは、該当するAPIを使っています。
TMemIniFileを使った方がよいかもしれません。
私は、以下のような構文を95〜XPまでずっと使用していますが、
不具合が出たことがありません。というより、不具合は出ないと
信じ切ってますが、まずいでしょうか?
Ini := TIniFile.Create(strIniFile);
try
Ini.WriteString(('項目', 'データ1', '書き換え');
finally
Ini.Free;
end;
いや、とんでもなく大きな文字列を渡せば不具合が出ます、ということです。
例えば、次の2つを比べてみてください。
TIniFileとTMemIniFileの違いだけです。
# 文字列Sの最後に'Z'を追加しているのは、最後までデータが書き込まれたかのチェックです。
procedure TForm1.Button1Click(Sender: TObject);
var
Ini: TIniFile;
S: String;
i: integer;
begin
Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
S := '';
for i := 0 to 1024*1024 - 1 do
begin
S := S + IntToHex(i mod 16, 1);
end;
S := S + 'Z';
Ini.WriteString('Section', 'Ident', S);
finally
Ini.UpdateFile;
Ini.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Ini: TMemIniFile;
S: String;
i: integer;
begin
Ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
S := '';
for i := 0 to 1024*1024 - 1 do
begin
S := S + IntToHex(i mod 16, 1);
end;
S := S + 'Z';
Ini.WriteString('Section', 'Ident', S);
finally
Ini.UpdateFile;
Ini.Free;
end;
end;
ありがとうございます。
破壊された理由はいまのところはっきりしませんが、文字数には気をつけたいと思います。
ところでなんですが、VCのタイマー使わずに、一定時間その場で処理をとめる関数ありますか?
よろしくお願いします。
私の環境(win2k,D5)では違いは出ませんでした。
他のOSでは違いが出るのかなぁ・・・
sleepとか、以下とかです。
procedure pWaitMiliSec(lwMiliSec: Longword);
{
lwMiliSec: 待ち時間(単位:ミリ秒)
}
var
StartTime, WaitTime: TDateTime;
begin
WaitTime := lwMiliSec/1000/24/60/60;
StartTime := Now;
while True do begin
Application.ProcessMessages;
if StartTime + WaitTime < Now then Break;
end;
end;
deldelさん、ありがとうございます。
今から試してみます。
ちなみににしのさんのPGですが、文字数を倍にすると、TIniFileではエラーが出ました。
TMemIniFileでは大丈夫だったので、そのくらい大きな場合のようですね。
> for i := 0 to 1024*1024*2 - 1 do
さらに倍、どん!
竹下景子さんに・・・
当方でもIniファイルの書き込みでエラーが発生した事が
あります。
その場合の対応は、INIファイルと称するtextfileで
入出力しています。
一般的にINIファイルのサイズは64KBがMax(Windows3.1)
です。
Windows2000あたりからINIファイルの挙動が多少あやしい
感じがします(あくまで私感ですが・・・)
関連付いてなんですが
INIファイルは[;]セミコロン記号でコメントアウトできるはずですが
TMemIniFileはそのコメントアウトした行を
削除してしまいませんか?
前に試した時にそうだったのですが、
あまり追求しませんでした。
TIniやAPI直接利用ならコメントアウト行は消えないのかな、、、
どなたか詳しい方、教えてください。
少しだけ関連付いて、こんなページもありました。どうぞ。
Nichiyo Delphian, Tips & Samples for Delphi
http://www.d1.dion.ne.jp/~aide/misc/deltips/deltip07.html
ツイート | ![]() |