複数のCheckBoxを1個のみ選択できるようにする方法はありませんか?
例えば,RadioButtonでしたらRadioGroupを使って簡単に1個のみ選択できるように作れますが,CheckBoxの場合はどうすれば良いのか分かりません.
GroupBoxと一緒に使うことで実現可能かと思いましたが,自分の勉強不足でなかなか上手く行きません.
どなたか,ご教授お願い致します.
排他的選択を行なうユーザーインターフェースこそが RadioButton です。
それが Windows の「お作法」です。そもそも論になっちゃいますけど。
初心者ということなので、基本的なことを言わせてもらいます。
チェックボックスは複数選択可
ラジオボタンは複数選択不可
というのはPC全般の暗黙のルールです。
それに従わないソフトというのは誰にでも優しいインターフェースであるとはいえません。
もう一度その設定が本当に必要かどうかを再検討したほうがよろしいかと思います。
ちなみにCheckBoxで排他するなら
procedure TForm1.CheckBoxClick(Sender: TObject);
begin
CheckBox1.OnClick:=nil;
CheckBox2.OnClick:=nil;
CheckBox3.OnClick:=nil;
if Sender<>CheckBox1 then
CheckBox1.Checked:=False;
if Sender<>CheckBox2 then
CheckBox2.Checked:=False;
if Sender<>CheckBox3 then
CheckBox3.Checked:=False;
CheckBox1.OnClick:=CheckBoxClick;
CheckBox2.OnClick:=CheckBoxClick;
CheckBox3.OnClick:=CheckBoxClick;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1.OnClick:=CheckBoxClick;
CheckBox2.OnClick:=CheckBoxClick;
CheckBox3.OnClick:=CheckBoxClick;
end;
通りすがりさん,あんこさん,ご指摘ありがとうございます.
確か,「チェックボックスは複数選択可,ラジオボタンは複数選択不可というのはPC全般の暗黙のルール」ですね.
ただ,ラジオボタンはチェックボックスより大きさが小さく,目立たないため,ソフトのよりユーザーより,ラジオボタンをもっと大きくするか,変わりにチェックボックスを使うようにと言われました.ラジオボタンのサイズをもっと大きくするのは,WindwosではOS側で描画する為不可能ではないかと思い,チェックボックスを選ぼうと思ったわけです.
あんこさんのご指摘の通りやってみたいと思います.上手く行きましたらまたご報告させていただきます.
そういう目的なら、SpeedButtonを使うというのはどうですか?
いくらでも大きい表示にできますが。
使い方は、
1.例えばSpeedButtonを4つ配置し、
2.その4つのSpeedButton全部のGroupIndexを(0以外の)同じ値にする。
3.AllowAllUpをfalseにする。(好みで)
4.Flatをtrueにする。(お好みで)
5.デフォルトチェックのSpeedButton1つだけのDwonプロパティをtrueにする。
以上です。
ウォレスさんのご指摘のとおり,SpeedButtonを使うとそれっぽい感じのものが作れると思います.
後は,SpeedButtonのスタイルをCheckBoxぽいものに変えることができると嬉しいですね.
あんこさんのソースコードとおり入力して実行するとなぜかエラーが出ます.
自分の勉強不足で,どこに問題があるのか分かりません.
どこでエラーが出ているかを書いたほうが、レスポンスは早いですよ。
つパネルグループ コンポーネント
http://norg1964.hp.infoseek.co.jp/delphianworld/compo/panelgrp.html#PG0019
RadioGroupのCheckBox版があり、RadioGroup同様に一個だけチェックできる
プロパティあり
あとは、GroupBox枠消して、Caption空にしとけばおk
とりあえず新規アプリケーションで試してください。
オブジェクトインスペクタで
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure FormCreate(Sender: TObject);
そのあと下記ソースを丸々張り付け
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
procedure CheckBoxClick(Sender: TObject);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CheckBoxClick(Sender: TObject);
begin
CheckBox1.OnClick:=nil;
CheckBox2.OnClick:=nil;
CheckBox3.OnClick:=nil;
if Sender<>CheckBox1 then
CheckBox1.Checked:=False;
if Sender<>CheckBox2 then
CheckBox2.Checked:=False;
if Sender<>CheckBox3 then
CheckBox3.Checked:=False;
CheckBox1.OnClick:=CheckBoxClick;
CheckBox2.OnClick:=CheckBoxClick;
CheckBox3.OnClick:=CheckBoxClick;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1.OnClick:=CheckBoxClick;
CheckBox2.OnClick:=CheckBoxClick;
CheckBox3.OnClick:=CheckBoxClick;
end;
end.
ツイート | ![]() |