  
  
  
   
   
   
   
   
   
  | 
| Delphi2010 チェックリストボックス(CheckListBox) 2010/09/07 | 
 
   
前回は[Additional]内の「ScrollBox」(スクロールボックス)について見ましたので、今回は同じく[Additional]内の「CheckListBox」(チェックリストボックス)について見てみます。チェックリストボックスは Delphi6 にもあります。 
  
名前が「リストボックス(ListBox)」に「チェック」が付いたものなので、リストボックスでチェックマークをつける事が出来るコンポーネントなのだろうか、と想像は出来ますね。それでは配置してみます。1つ目なので Nameプロパティは「CheckListBox1」となります。 
  
リストボックス同様、Itemsプロパティをもっていますので、右端の[…]ボタンをクリックして、文字列リストの設定を行います。 
  
保存・コンパイル(再構築)をして実行してみます。 
  
チェックリストボックスは、複数項目にチェックできるようになっているようですね。ただ、上記の「--- CPU ---」にはチェックをつけたくないので、そういう場合には、Header プロパティを True にせよ、との事です。<オブジェクトインスペクタ>にはありませんので、フォームの OnShowイベントハンドラ内でプログラムしておきます。 
procedure TForm1.FormShow(Sender: TObject); 
begin 
 CheckListBox1.Header[0] := True ; 
end; | 
 
 保存・コンパイル(再構築)をして実行してみます。 
最初の「--- CPU ---」にはチェックボックスが外れました。 
この時の文字色は HeaderColor プロパティ(デフォルトは「clInfoText」)で表示され、文字の背景色は HeaderBackgroundColor プロパティ(デフォルトは「clInfoBk」)で表示されます。 
  
このチェックリストボックスにも、親クラスから継承(派生)されるメンバ(※親クラスのプロパティやメソッドを、子クラスから見る場合は「メンバ」とヘルプには表記されているようです)で MultiSelect プロパティが存在するようですが、<オブジェクトインスペクタ>にはありませんし、フォームの OnShowイベントハンドラで False を入れる、というような事をしてみても動作せず無効化されているようです。 
  
ですので、1つだけをチェックしたい場合は、チェックリストボックスの OnClickCheckイベントハンドラで、どの項目をチェックしたいのかを取得したあとに、全チェックをオフにして、指定した項目にチェックを入れ直す、というようなプログラムを書きます。全チェックをオフにしたい場合は、for ループ(繰り返し)せずとも CheckAll メソッドという便利な機能があります。 
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject); 
var 
 i : integer ; 
begin 
 i := CheckListBox1.ItemIndex; 
 CheckListBox1.CheckAll(cbunChecked, True, False); 
 CheckListBox1.Checked[i] := True; 
end; | 
 
 また、指定した項目を避けるように他の項目のチェックを外す、という事も可能です。1つのチェックリストボックス内で複数のセクションがある場合には、こちらの方が良いかもしれません。以下は一例です。 
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject); 
var 
 i,j : integer ; 
begin 
 i := CheckListBox1.ItemIndex; 
 for j:=0 to CheckListBox1.Count-1 do begin 
  if (j = i) then continue; 
  CheckListBox1.Checked[j] := False; 
 end; 
end; | 
 
 この場合は、指定した項目のチェックオン・チェックオフが出来ますが、指定した項目を必ずチェックオンしたい場合は 
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject); 
var 
 i,j : integer ; 
begin 
 i := CheckListBox1.ItemIndex; 
 for j:=0 to CheckListBox1.Count-1 do begin 
  if (j = i) then 
   CheckListBox1.Checked[j] := True 
  else 
   CheckListBox1.Checked[j] := False; 
 end; 
end; | 
 
 とします。なお、ループ変数の j は 0 から開始していますが、0 は無効化しているので動作とは無関係となりますので影響はありませんが、1 から開始でも構いません。但し、チェックリストボックスの途中の項目を無効化している場合、その項目を除外すると考えても、考えなくても、別段動作は変わりませんので、簡単にプログラミングする事を考えればいいと思います。 
  
なお、CheckAll メソッドはヘルプによると 
procedure CheckAll(AState: TCheckBoxState; AllowGrayed: Boolean = True; AllowDisabled: Boolean = True); 
  
TCheckListBox コントロールのチェック ボックスの状態を変更します。 
  
CheckAll で TCheckListBox コントロールのチェック ボックスの状態を変更します。CheckAll が特に便利なのは、リストのすべてのチェックボックスを一括して変更する必要があるときです。 次の表に、メソッドのパラメータリストを示します。  
| AState | すべてのチェック ボックスに割り当てられる新しい状態を指定する。 | 
 
| AllowGrayed | 淡色のチェック ボックスにも変更が影響するかどうかを指定する。 AllowGrayed パラメータのデフォルト値は true。 | 
 
| AllowDisabled | 無効のチェック ボックスにも変更が影響するかどうかを指定する。 AllowDisabled パラメータのデフォルト値は true。 | 
 
  | 
 
 との事です。 
  
このチェックリストボックスでも、チェックボックス同様の、淡色表示(グレー表示)が可能です。その場合は、AllowGrayed プロパティを True にします。そして、各項目のチェック状態は、Checked プロパティではなく、State プロパティを使います。値は下記を持ちます。 
| cbUnchecked | チェックなし | 
 
| cbGrayed | 淡色表示(グレー表示) | 
 
| cbChecked | チェックあり | 
 
 淡色表示は、どっちでもない、どっちでもいい、気にしない、扱いとしてはそんな感じでしょうか? 私自身、プログラムでこの淡色表示(グレー表示)というのを実際に使うかどうか、というのは現在よく分かりませんが、使わない可能性も高いですね。 
  
ただ、例えば CADでのレイヤ操作での、編集可能・表示のみ・非表示、というような3状態を扱いたい場合に利用するかもしれません。 
  
  
そのほか、<オブジェクトインスペクタ>をざっと見た感じでは、これまでと同じ、また、他のコンポーネントの追加分と同じ、という感じです。 
  | 
 
  | 
バッチファイル 
BASIC 
C言語のお勉強 
拡張子な話 
DOSプログラム 
Delphi 
>Delphi入門編 
>Delphi2010 
▲2010/09/06 
 2010/09/07 
▼2010/09/08 
  
シェアウェア 
Script!World 
データベース 
  |