TStringListを保存するさいINIファイルに保存したいんですが
なにかうまいやりかたはありませんか?
お願いします。
とてらさんが保存したいTStringListの中の各文字列(SL.Strings[0]など)は
改行コードを含んでいますか?
保存は、普通に .SaveToFile('ファイル名.ini') で大丈夫だったと思います。
ただ、実際に TStringList にINIファイル形式で書き込むのが大変だと思いますが。
INIファイルの編集ために作られたクラス、TIniFile(uses IniFiles) を使うことをオススメします。
Memo1.Text:=StringReplace(Memo1.Text,'&','∧',[rfreplaceall]);
Memo1.Text:=StringReplace(Memo1.Text,#13#10,'&crlf;',[rfreplaceall]);
として、改行を仮になくす手も有ります
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
with TIniFile.Create('C:\WINDOWS\筑集眺餅\Hoge.ini') do
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
WriteString('Hoge','Hogera'+inttostr(i),Memo1.Lines[i]);
end;
free;
end;
end;
↑半角デスクトップが文字化けしていますが、気にしないで下さい
返信が遅れてすいません
>改行コードを含んでいますか?
含んでいません
るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?
> るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?
TIniFile の ReadString() メソッドを使います。
> るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?
読み込む時は StringListの Countが分からないと困るにゃ〜
にゃんで Countも書き込んでおく方がいいにゃ〜
にゃにゃし、この方法はゴミがタマルこともあるにゃ〜
ゴミ掃除も必要かにゃ〜?
とてらさんの質問の意味がよく分からないのですが、
たんに TStringList の SaveToFile と LoadFromFile でいいような
気もしますね。
> るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
with TIniFile.Create('C:\WINDOWS\デスクトップ\Hoge.ini') do
begin
EraseSection('Hoge');
for i:=0 to Memo1.Lines.Count-1 do
begin
WriteString('Hoge','Hogera'+inttostr(i),Memo1.Lines[i]);
end;
free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
i:=0;
with TIniFile.Create('C:\WINDOWS\デスクトップ\Hoge.ini') do
begin
Memo1.Lines.Clear;
while ValueExists('Hoge','Hogera'+inttostr(i)) do
begin
Memo1.Lines.Add(ReadString('Hoge','Hogera'+inttostr(i),''));
inc(i);
end;
free;
end;
end;
>たんに TStringList の SaveToFile と LoadFromFile でいいような
>気もしますね。
質問者はんは、INIファイル形式で文字列のリストを保存したいのか、
それとも、拡張子が「.ini」のテキストファイルに文字列のリストだけを保存したいのか、
どっちなんやろ?
>るるとん@Kはん
正しく動作すると思いまっけど、文字列のリストを復元するのにwhile文でValueExistsを繰り返すより
にゃ〜はんが提案しはったCountを保存する方法のほうがいいんちゃいまっか?
ValueExistsの数だけTStringListの生成破棄が起こるんもどうなんかなあ。
>質問者はんは、INIファイル形式で文字列のリストを保存したいのか、
>それとも、拡張子が「.ini」のテキストファイルに文字列のリストだけを保>存したいのか、どっちなんやろ?
既存のiniファイルに追加で書き込みたいんです。
やっぱりTStringlistだけの保存ファイルを作って
SaveToFileとLoadFromFileを使った方がいいんですかね?
Memo1.Text:=StringReplace(Memo1.Text,'&','∧',[rfreplaceall]);
Memo1.Text:=StringReplace(Memo1.Text,#13#10,'&crlf;',[rfreplaceall]);
で改行を無くし、iniファイルに書き込み、
読み込み後、
Memo1.Text:=StringReplace(Memo1.Text,'&crlf;',#13#10,[rfreplaceall]);
Memo1.Text:=StringReplace(Memo1.Text,'∧','&',[rfreplaceall]);
で改行を復元させる
というのはどうでしょう?
>るるとん@Kはん
そうまでするメリットは何かあるんでっか?
改行コードを文字列に置換するリスクはどうやろ?
>既存のiniファイルに追加で書き込みたいんです。
それやったらTIniFileかTMemIniFileを継承して自分用のクラスをこさえとくと便利でっせ。
例です。
わいはTMemIniFileが好きなんやけど、今回はTIniFileにしときます。
おかしなとことかあったら指摘してよ。
あと、使い方がわからへんかったらゆうてよ。
unit IniFileEx;
interface
uses
Classes, IniFiles;
type
TIniFileEx = class(TIniFile)
public
procedure ReadStrings(const Section: string; List: TStrings);
procedure WriteStrings(const Section: string; List: TStrings);
end;
implementation
uses
SysUtils;
{ TIniFileEx }
procedure TIniFileEx.ReadStrings(const Section: string; List: TStrings);
var
Count, i: Integer;
begin
List.Clear;
Count := ReadInteger(Section, 'Count', 0);
for i := 0 to Count - 1 do
List.Add(ReadString(Section, IntToStr(i), ''));
end;
procedure TIniFileEx.WriteStrings(const Section: string; List: TStrings);
var
i: Integer;
begin
EraseSection(Section);
WriteInteger(Section, 'Count', List.Count);
for i := 0 to List.Count - 1 do
WriteString(Section, IntToStr(i), List[i]);
end;
end.
inifileを継承する上のサンプルが良いと思いますが
>改行コードを文字列に置換するリスク
とは何でしょう?
るるとん@KはんはTIniFileでサンプル書いてはりましたやろ?
TIniFileのReadStringが中で使うてるバッファは
var
Buffer: array[0..2047] of Char;
て宣言されてるから、一行一行は短くても全部連結したらやばいかなあ思たんです。
まあ、普通は大丈夫やろけど。
TMemIniFileなら問題ないんかなあ。
>>改行コードを文字列に置換するリスク
>とは何でしょう?
Memo1.Text:=StringReplace(Memo1.Text,#13#10,'&crlf;',[rfreplaceall]);
の命令によって改行コードを文字列(&crlf)に置換しているようですが
元の文字列に&crlfという文が使われていた場合うまく動作しませんよね?
そういうことではないでしょうか
質問者さんが満たしたい要件としては、TStringList型オブジェクトの内容をINIファイルに書き込んだり読込んだりしたいって事ですよね、
であれば、INIファイル上に一意のセクションを用意して、
TStringListのTextプロパティの値をTIniFile.WriteStringで出力してやれば良いのでは?
読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?
読込部位のロジックとしてはTIniFile.ReadSectionValueを使う手もあるので・・・
すみません。誤字がありましたので訂正させて下さいm(_ _)m
>読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?
の部位で読込む"再"は、正しくは"際"でした、申し訳ありませんでした。
>TStringListのTextプロパティの値をTIniFile.WriteStringで出力してやれば良いのでは?
>読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?
改行コードを含む文字列をWriteStringとReadStringで保存・復元することができないので、
とてらさんは質問されたわけですから。^_^;
>とてら 2004/06/05(土) 03:21:57
>返信が遅れてすいません
>>改行コードを含んでいますか?
>含んでいません
上記の内容かと思いましたので・・・すみません^^;
確かに文字列が長いのはよくないですね
>元の文字列に&crlfという文が使われていた場合うまく動作しませんよね?
ソースをよく見てください
&crlf;は∧crlfに変換されますよ
>&crlf;は∧crlfに変換されますよ
なるほど、うまく動くのを確認しました。
結局のところ、このスレッドは解決していないのですか?
わたしの見るところでは、質問者の方が ini ファイルの形式をしらなかった
のが原因だと思います。たんに、TIniFile か TMemIniFile クラスの使い方
を覚えるだけで解決するのではないでしょうか。
わんこさんやるるとん@Kさんのいうcountを保存して
一行一行連番の名前で別々に保存することにします。
今回は質問をしておいて返事が遅くなり申し訳ありませんでした。
たくさんのレスありがとうございました。
また分からないことがあればこの掲示板で質問させてもらいます。
そのときもよろしくお願いします。
↑チェックしわすれです
ツイート | ![]() |