今回はDelphi/400のアプリケーションで
チェックボックス形式の排他表示を行う方法についてご紹介いたします。
標準的なWindowsのアプリケーションでチェック項目を作成する場合、
独立したチェックはチェックボックスが、
排他でのチェックはラジオボタン(またはラジオグループ)が使用されます。
しかし画面の見栄えなどによっては、
チェックボックスを使って排他制御を行いたい場合もあります。
Delphi/400では複数チェックボックスを使用する場合、
グループで扱えるTCheckListBoxコンポーネントを使うと実装が簡単です。
仕組みとしてはTCheckListBoxのOnClickCheckイベントにおいて、
全てのチェックを外し、最後にチェックされたチェックを戻します。
これによって常に1つしかチェックできない排他動作を実現できます。
例)
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
i,j : integer ;
begin
//チェックされたインデックスを退避
i := CheckListBox1.ItemIndex;
//全てのチェックを外す
for j := 0 to CheckListBox1.Items.count - 1 do
begin
CheckListBox1.Checked[j] := False;
end;
//退避したインデックスでチェックする
CheckListBox1.Checked[i] := True;
end;
またDelphi 2010以降ではTCheckListBoxに
CheckAllという全てのチェックを外す(付ける)メソッドも用意されていますので
これを使うとさらに実装が簡単です。
例)
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
i : integer ;
begin
//チェックされたインデックスを退避
i := CheckListBox1.ItemIndex;
//全てのチェックを外す
CheckListBox1.CheckAll(cbunChecked, True, False);
//退避したインデックスでチェックする
CheckListBox1.Checked[i] := True;
end;
ItemHeightプロパティを設定しても値が変わらず、見た目が変になる……
という場合は、StyleプロパティをlbOwnerDrawFixedまたはlbOwnerDrawVariableに設定します。
(左:Style設定前、右:Style設定後)
(ミガロ.情報マガジン「MIGARO News!!」Vol.184 2016年3月号より)