|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
ヘルプを見ても、StringList のサンプルコードが少なく、使い方を迷うこと
があります。基本的使用法を例示して下さい。ListBox の使い方と違うとこ
ろも色々あるようですが。
[A]
StringList はコントロールと無関係に文字列リストを管理できます。ListBox
への表示の裏操作に用いる、などの使い方があると思います。
さて、基本操作ですが、次の通りです。
1:生成・破棄
var StringList1: TStringList;
...
StringList1:=TStringList.Create;
try
...
finally
StringList1.Free;
end;
2:内容を空にする
StringList1.Clear;
3:項目数
var iCount: Integer;
iCount:=StringList1.Count;
4:リスト中の個々の項目
var strItem: string;
i: integer;
strItem:=StringList1.Strings[i];
{先頭は、インデックス値 i:=0}
5:特定の項目の選択
ListBox のような、マウスクリック反転というのはありません(笑)。
6:項目を追加する
StringList1.Add(strItem);
7:項目を削除する
StringList1.Delete(i);
8:項目を挿入する
StringList1.Insert(i,strItem);
{インデックス値 i>=0 の場所に挿入します}
これはわかります。挿入だから、項目数は 1 個増えて、上のインデック
ス値の項目は、インデックス値が 1 つずつ増えます。
9:項目を移動する
StringList1.Move(i,j);
{インデックス値 i の項目を、新しいインデックス値 j の位置に移動
します}
その結果、元の、インデックス値 j の項目は、どうなるのか?
これは、削除&挿入と考えるとわかりやすいです。従って、インデック
ス値 0 の項目を、どんどん、末尾、一つ手前、さらに一つ手前、...と移
動して行けば、逆順での並べ替えができるはず。それが次のコードです。
(例)FileListBox1 から選択したファイルを、逆順に、ListBox1 に表示
します。
procedure TForm1.Button1Click(Sender: TObject);
{実行(&G)}
var
i,iCount,
j,jCount
: integer;
strItem: string;
begin
iCount:=FileListBox1.Items.Count;
if iCount=0 then exit;
StringList1:=TStringList.Create;
try
for i:=0 to iCount-1 do
if FileListBox1.Selected[i] then
StringList1.Add(FileListBox1.Items[i]);
{next i}
jCount:=StringList1.Count;
if jCount=0 then exit;
{ここから-------------------------}
j:=0;
while (j<jCount-1) do begin
StringList1.Move(0,jCount-1-j); {<====ここ}
inc(j);
end
{ここまで-------------------------}
ListBox1.Items.Assign(StringList1);
finally
StringList1.Free;
end;
end;
実際、{<====ここ} の部分を、
strItem:=StringList1.Strings[0];
StringList1.Delete(0);
StringList1.Insert(jCount-1-j,strItem);
としても、同じ結果が得られます。
ただし、逆順操作そのものは、実際には、次の、Exchange がいいでし
ょう(効率が2倍)。
10:入れ替え
StringList1.Exchange(i,j);
{インデックス値 i の項目と、インデックス値 j の項目を入れ替えま
す}
(例)上と同じ、逆順操作をするのに、上の
{ここから-------------------------}
{ここまで-------------------------}
の部分を、
for j:=0 to (jCount div 2)-1 do
StringList1.Exchange(j,jCount-1-j);
11:StringList1 に含まれる文字列を知るために、
IndexOf(const strItem: string): integer;
を用います。位置のインデックス値が返されます。見つけられないときは
-1 が返ります。
あるいは、
Find(const strItem: string; var Index: integer): boolean;
を用います。こちらは、Index に位置のインデックス値が返り、見つかっ
た場合は True を返します。
12:一括追加
StringList1.AddStrings(FileListBox1.Items);
StringList1.AddStrings(StringList2);
など。既に StringList1 に含まれる項目に、さらに追加されます。
13:一括コピー
StringList1.Assign(FileListBox1.Items);
StringList1.Assign(StringList2);
など。既に StringList1 に含まれる項目は、上書きされてなくなります。
11:ソート
StringList1.Sort;
{項目を昇順に並べ替えます。}
StringList1.Sorted
は、boolean でして、StringList1 がソート性をもっているかどうかを判
別します。12の下を参照。
12:項目に重複が許されるかどうかを、StringList がソート性をもってい
るときだけ、Duplicates プロパティーで指定できます。
dupIgnore:重複文字列の追加ができません。
dupAccept:重複文字列を追加できます。
dupError: 重複文字列追加で EListError 例外が発生します。
※ヘルプで、
「文字列リストをソートするには,Sort メソッドを使います。リストがソ
ートされているかを判断するには,Sorted プロパティの値を確認します。」
ということですから、
StringList1.Sorted:=true;
で、StringList1 に、ソートする性質を付与できます。
リストにソート性を与えると、これを乱すような、挿入、移動操作がエラ
ーになります。追加・削除は可能。しかも追加の場合、ソートされて適切な
位置に納まります。
もう一つ。StringList1 がソート性をもってなくても、つまり、生成後の
ディフォルト状態、StringList1.Sorted=false の状態でも、項目を
StringList1.Sort;
できますが、この後追加しても、StringList1.Sorted=false なんですから
追加項目は末端につくだけです。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|