TStringListの保存について

解決


とてら  2004-06-03 04:55:05  No: 9281

TStringListを保存するさいINIファイルに保存したいんですが
なにかうまいやりかたはありませんか?
お願いします。


ふぐちゃん  2004-06-03 05:20:04  No: 9282

とてらさんが保存したいTStringListの中の各文字列(SL.Strings[0]など)は
改行コードを含んでいますか?


おおさわ  2004-06-03 05:28:24  No: 9283

保存は、普通に .SaveToFile('ファイル名.ini') で大丈夫だったと思います。
ただ、実際に TStringList にINIファイル形式で書き込むのが大変だと思いますが。
INIファイルの編集ために作られたクラス、TIniFile(uses IniFiles) を使うことをオススメします。


るるとん@K  2004-06-03 05:52:03  No: 9284

Memo1.Text:=StringReplace(Memo1.Text,'&','∧',[rfreplaceall]);
Memo1.Text:=StringReplace(Memo1.Text,#13#10,'&crlf;',[rfreplaceall]);
として、改行を仮になくす手も有ります


るるとん@K  2004-06-03 05:56:54  No: 9285

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  2004-06-03 05:57:54  No: 9286

↑半角デスクトップが文字化けしていますが、気にしないで下さい


とてら  2004-06-05 12:21:57  No: 9287

返信が遅れてすいません
>改行コードを含んでいますか?
含んでいません

るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?


jok  2004-06-05 12:41:45  No: 9288

> るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?

TIniFile の ReadString() メソッドを使います。


にゃ〜  2004-06-05 18:27:22  No: 9289

> るるとん@Kさんの方法だとIniの読み込み時にどうするのですか?

読み込む時は StringListの Countが分からないと困るにゃ〜
にゃんで Countも書き込んでおく方がいいにゃ〜
にゃにゃし、この方法はゴミがタマルこともあるにゃ〜
ゴミ掃除も必要かにゃ〜?


jok  2004-06-05 19:25:45  No: 9290

とてらさんの質問の意味がよく分からないのですが、
たんに TStringList の SaveToFile と LoadFromFile でいいような
気もしますね。


るるとん@K  2004-06-05 19:35:04  No: 9291

> るるとん@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;


わんこ  2004-06-05 22:05:36  No: 9292

>たんに TStringList の SaveToFile と LoadFromFile でいいような
>気もしますね。
質問者はんは、INIファイル形式で文字列のリストを保存したいのか、
それとも、拡張子が「.ini」のテキストファイルに文字列のリストだけを保存したいのか、
どっちなんやろ?

>るるとん@Kはん
正しく動作すると思いまっけど、文字列のリストを復元するのにwhile文でValueExistsを繰り返すより
にゃ〜はんが提案しはったCountを保存する方法のほうがいいんちゃいまっか?
ValueExistsの数だけTStringListの生成破棄が起こるんもどうなんかなあ。


とてら  2004-06-05 23:00:34  No: 9293

>質問者はんは、INIファイル形式で文字列のリストを保存したいのか、
>それとも、拡張子が「.ini」のテキストファイルに文字列のリストだけを保>存したいのか、どっちなんやろ?
既存のiniファイルに追加で書き込みたいんです。

やっぱりTStringlistだけの保存ファイルを作って
SaveToFileとLoadFromFileを使った方がいいんですかね?


るるとん@K  2004-06-05 23:32:54  No: 9294

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]);
で改行を復元させる
というのはどうでしょう?


わんこ  2004-06-05 23:50:17  No: 9295

>るるとん@Kはん
そうまでするメリットは何かあるんでっか?
改行コードを文字列に置換するリスクはどうやろ?


わんこ  2004-06-06 00:00:30  No: 9296

>既存の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.


るるとん@K  2004-06-06 00:41:03  No: 9297

inifileを継承する上のサンプルが良いと思いますが
>改行コードを文字列に置換するリスク
とは何でしょう?


わんこ  2004-06-06 01:44:04  No: 9298

るるとん@KはんはTIniFileでサンプル書いてはりましたやろ?
TIniFileのReadStringが中で使うてるバッファは
var
  Buffer: array[0..2047] of Char;
て宣言されてるから、一行一行は短くても全部連結したらやばいかなあ思たんです。
まあ、普通は大丈夫やろけど。
TMemIniFileなら問題ないんかなあ。


take  2004-06-07 22:04:38  No: 9299

>>改行コードを文字列に置換するリスク
>とは何でしょう?
Memo1.Text:=StringReplace(Memo1.Text,#13#10,'&crlf;',[rfreplaceall]);
の命令によって改行コードを文字列(&crlf)に置換しているようですが
元の文字列に&crlfという文が使われていた場合うまく動作しませんよね?
そういうことではないでしょうか


G.G  2004-06-08 00:28:25  No: 9300

質問者さんが満たしたい要件としては、TStringList型オブジェクトの内容をINIファイルに書き込んだり読込んだりしたいって事ですよね、
であれば、INIファイル上に一意のセクションを用意して、
TStringListのTextプロパティの値をTIniFile.WriteStringで出力してやれば良いのでは?
読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?
読込部位のロジックとしてはTIniFile.ReadSectionValueを使う手もあるので・・・


G.G  2004-06-08 00:37:49  No: 9301

すみません。誤字がありましたので訂正させて下さいm(_ _)m

>読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?

の部位で読込む"再"は、正しくは"際"でした、申し訳ありませんでした。


通りすがり  2004-06-08 01:03:57  No: 9302

>TStringListのTextプロパティの値をTIniFile.WriteStringで出力してやれば良いのでは?
>読込む再もTIniFile.ReadStringでTStringList.Textに読込んではだめでしょうか?
改行コードを含む文字列をWriteStringとReadStringで保存・復元することができないので、
とてらさんは質問されたわけですから。^_^;


G.G  2004-06-08 02:49:37  No: 9303

>とてら 2004/06/05(土) 03:21:57
>返信が遅れてすいません
>>改行コードを含んでいますか?
>含んでいません
上記の内容かと思いましたので・・・すみません^^;


るるとん@K  2004-06-08 04:34:06  No: 9304

確かに文字列が長いのはよくないですね
>元の文字列に&crlfという文が使われていた場合うまく動作しませんよね?
ソースをよく見てください
&crlf;は∧crlfに変換されますよ


take  2004-06-08 17:36:14  No: 9305

>&crlf;は∧crlfに変換されますよ
なるほど、うまく動くのを確認しました。


通りすがり  2004-06-08 19:46:43  No: 9306

結局のところ、このスレッドは解決していないのですか?


jok  2004-06-08 22:45:38  No: 9307

わたしの見るところでは、質問者の方が ini ファイルの形式をしらなかった
のが原因だと思います。たんに、TIniFile か TMemIniFile クラスの使い方
を覚えるだけで解決するのではないでしょうか。


とてら  2004-06-10 01:21:04  No: 9308

わんこさんやるるとん@Kさんのいうcountを保存して
一行一行連番の名前で別々に保存することにします。

今回は質問をしておいて返事が遅くなり申し訳ありませんでした。
たくさんのレスありがとうございました。
また分からないことがあればこの掲示板で質問させてもらいます。
そのときもよろしくお願いします。


とてら  2004-06-10 01:21:45  No: 9309

↑チェックしわすれです


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加