お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
ListBox をよく使うんですが、まとまった、基本的使用法の例示があると便 利です。

[A]
ListBox(正確には TListBox と呼ぶべきか)は、Windows のリストボックス
をコンポーネント化したものです。

さて、基本操作ですが、次の通りです。

1:生成・破棄(通常は不要)
    var ListBox1: TListBox;
    ...
    ListBox1:=TListBox.Create;
    try
      ...
    finally
      ListBox1.Free;
    end;

※通常は、オブジェクトインスペクターでフォームに配置して使うでしょう
から、(その場合は)不要です。

2:内容を空にする
    ListBox1.Items.Clear;

3:項目数  
    var iCount: Integer;
    iCount:=ListBox1.Items.Count;

4:リスト中の個々の項目  
    var strItem: string;
        i: integer;
    strItem:=ListBox1.Items[i];
      {先頭は、インデックス値 i:=0}

5:特定の項目の選択
  MultiSelect=true と false で異なる点があります。また、MultiSelect=
  trueのとき、ExtendedSelect も絡んできます。
  (1) マウスクリックで反転選択(これは共通)(笑)
  (2) MultiSelect=true のとき、
    (a) ExtendedSelect=true なら、Ctrl+マウスクリックで個々に複数選択、
      Shift+マウスクリックでマウスクリック間全項目選択
      (これって Windows でのマウスクリックの常識でしょうが、SBORLAND
      MES 9 で、尋ねてらっしゃる方いましたね。だからここに挙げてもい
      いでしょう。と、言い訳)
    (b) ExtendedSelect=false なら、Ctrl、Shift 押下は関係なく、マウス
      クリックで、トグルで、項目反転・解除
    (c) 選択反転項目をコードで検知
        ListBox1.Selected[i] {インデックス値 i>=0}
      が true のとき、選択されてます。
        ListBox1.ItemIndex   {インデックス値 i>=0}
      の方は、項目が反転しているかどうかにかかわらず、フォーカスのある
      項目を示します。さらに下をご覧下さい。
    (d) コードで選択。画面上で反転表示されます。
        ListBox1.Selected[i]:=true; {インデックス値 i>=0}
      false にすれば非選択、画面上反転でなくなります。これと同じことを
        ListBox1.ItemIndex:=i
      とすることはできません。無意味なコードです。
                  ~~~~~~~~~~
    (e) 選択項目があるかどうか
        var iSel: Integer;
        iSel:=ListBox1.SelCount; {>=0: 選択項目数}
  (3) MultiSelect=false のとき、
    (a,b) ExtendedSelect 設定は無意味。Ctrl、Shift 押下は関係なく、マ
      ウスクリックで、項目反転。解除するためには他の項目をクリックする
      必要があります。あるいはコードで、
        ListBox1.ItemIndex:=-1
      とします。
    (c) 選択反転項目をコードで検知
        ListBox1.Selected[i] {インデックス値 i>=0}
      は実行時エラー、
        「リストのインデックスが範囲を超えています」
      となります。この場合は、
        ListBox1.ItemIndex   {インデックス値 i>=0}
      で、調べます。
    (d) コードで選択。画面上で反転表示されます。
        ListBox1.ItemIndex:=i;  {i>=0}
    (e) 選択項目があるかどうか
        ListBox1.SelCount
      は無意味です。常に -1。この場合は
        ListBox1.ItemIndex>=0
         かどうかで調べます。-1 なら選択項目なし。

  ※ItemIndex、って、ヘルプでは、

    「リストボックス..(略)..の場合,MultiSelect プロパティが True で
  リストボックス..(略)..で複数の項目を選択すると,ItemIndex にはフ
  ォーカスを持つ選択項目のインデックスが設定されます。MultiSelect が
  True ならば,ItemIndex のデフォルト値は 0 です。」

    これ、クセありですね。反転表示項目ではなく、フォーカスもってる項目
  を示すみたい。マウスクリック1回だけで、反転かつフォーカス、ってこ
  とは確かにありますけど。複数選択してて、その中のどれかを Ctrl+クリ
  ックすると、その項目は通常表示となりますが、フォーカスは来ます。
  ItemIndex はそれを指すんです。また、MultiSelect が True ならば,
  ItemIndex のデフォルト値は 0 です。で、試してみるとそうなってますが、
  これはフォーカスだけのことで、その項目は反転してはくれません。

  ※MultiSelect が絡んで複雑な説明になってしまいましたが、要は、

    MultiSelect=true  ...... 主として SelCount、Selected を使う。
         〃    =false ...... ItemIndex を使う。

  ってことですね。(なお、この部分の改訂に関しては、SBORLAND MES 9 
  'T'   、くり さん(QZG14637) にお礼申し上げます。)

  ※MultiSelect が True のときの、この、ItemIndexって、使い道あるんだ
  ろうか、って、疑問に思ってたんですが、その後、使い道を見つけました。
  選択した項目をまとめて名前を付けるときなど、どの項目の名前を元にす
  るかを、反転かつフォーカス表示にしとけば、ItemIndex で取得できます。
  あるいは、その項目自体は選択しないんだったら、フォーカス表示だけ。

  6:項目を追加する
    ListBox1.Items.Add(strItem);

7:項目を削除する
    ListBox1.Items.Delete(i);

8:項目を挿入する
    ListBox1.Items.Insert(i,strItem);
      {インデックス値 i>=0 の場所に挿入します}

9:項目を移動する
    ListBox1.Items.Move(i,j);
      {インデックス値 i の項目を、新しいインデックス値 j の位置に移動
       します}
    StringListと同じですね。削除&挿入と考えるとわかりやすいです。

10:入れ替え
     ListBox1.Items.Exchange(i,j);
      {インデックス値 i の項目と、インデックス値 j の項目を入れ替えま
       す}

11:ListBox1 に含まれる文字列を知るために、
        ListBox1.Items.IndexOf(const strItem: string): integer;
    を用います。位置のインデックス値が返されます。見つけられないときは
    -1 が返ります。
     StringList で使えた Find はダメのようでした。

12:一括追加
    ListBox1.Items.AddStrings(FileListBox1.Items);
    ListBox1.Items.AddStrings(ListBox2.Items);
    ListBox1.Items.AddStrings(StringList1);

    など。既に ListBox1 に含まれる項目に、さらに追加されます。
    既に StringList1 に含まれる項目に、さらに追加する一括追加は、

    StringList1.AddStrings(ListBox1.Items);

13:一括コピー
    ListBox1.Items.Assign(FileListBox1.Items);
    ListBox1.Items.Assign(ListBox2.Items);
    ListBox1.Items.Assign(StringList1);

    など。既に ListBox1 に含まれる項目は、上書きされてなくなります。
    StringList への一括コピーは、

    StringList1.Assign(ListBox1.Items);

    既に StringList1 に含まれる項目は、上書きされてなくなります。

11:ソート
    StringList で使えた Sort はダメ。

    ListBox1.Sorted

         は、boolean で、ListBox1 のソート性の設定をし、また、ソート性をも
    っているかどうかの判別も行います。

12:項目に重複が許されるかどうかを、ListBox がソート性をもってい
    るときだけ、Duplicates プロパティーで指定できません。あらま。
     これ、ダメのようです。

※さて、ここまでで、StringList vs. ListBox、メソッドを実行するのに、
ListBox では Items という、フィールド名(エラーでこう出てきますね)
が必要。ただし、Sorted は同じ(Items がいらない)。また、項目選択に関
する Selected、SelCount、ItemIndex も Items が要りません。Move、
Exchange は、Items プロパティーまで追っかければ使えること、わかるんだ
けど、TListBox のところには挙げてないので、使えないと誤解してました。


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会