複数のCheckBoxの排他的選択法


イルカ  2007-07-27 18:49:48  No: 27234  IP: 192.*.*.*

複数のCheckBoxを1個のみ選択できるようにする方法はありませんか?
例えば,RadioButtonでしたらRadioGroupを使って簡単に1個のみ選択できるように作れますが,CheckBoxの場合はどうすれば良いのか分かりません.
GroupBoxと一緒に使うことで実現可能かと思いましたが,自分の勉強不足でなかなか上手く行きません.
どなたか,ご教授お願い致します.

編集 削除
通りすがり  2007-07-27 20:29:21  No: 27235  IP: 192.*.*.*

排他的選択を行なうユーザーインターフェースこそが RadioButton です。
それが Windows の「お作法」です。そもそも論になっちゃいますけど。

編集 削除
あんこ  2007-07-27 20:35:45  No: 27236  IP: 192.*.*.*

初心者ということなので、基本的なことを言わせてもらいます。
チェックボックスは複数選択可
ラジオボタンは複数選択不可
というのは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;

編集 削除
イルカ  2007-07-30 11:20:23  No: 27237  IP: 192.*.*.*

通りすがりさん,あんこさん,ご指摘ありがとうございます.
確か,「チェックボックスは複数選択可,ラジオボタンは複数選択不可というのはPC全般の暗黙のルール」ですね.
ただ,ラジオボタンはチェックボックスより大きさが小さく,目立たないため,ソフトのよりユーザーより,ラジオボタンをもっと大きくするか,変わりにチェックボックスを使うようにと言われました.ラジオボタンのサイズをもっと大きくするのは,WindwosではOS側で描画する為不可能ではないかと思い,チェックボックスを選ぼうと思ったわけです.
あんこさんのご指摘の通りやってみたいと思います.上手く行きましたらまたご報告させていただきます.

編集 削除
ウォレス  2007-07-30 11:34:54  No: 27238  IP: 192.*.*.*

そういう目的なら、SpeedButtonを使うというのはどうですか?
いくらでも大きい表示にできますが。

使い方は、
1.例えばSpeedButtonを4つ配置し、
2.その4つのSpeedButton全部のGroupIndexを(0以外の)同じ値にする。
3.AllowAllUpをfalseにする。(好みで)
4.Flatをtrueにする。(お好みで)
5.デフォルトチェックのSpeedButton1つだけのDwonプロパティをtrueにする。

以上です。

編集 削除
イルカ  2007-08-02 23:38:19  No: 27239  IP: 192.*.*.*

ウォレスさんのご指摘のとおり,SpeedButtonを使うとそれっぽい感じのものが作れると思います.
後は,SpeedButtonのスタイルをCheckBoxぽいものに変えることができると嬉しいですね.
あんこさんのソースコードとおり入力して実行するとなぜかエラーが出ます.
自分の勉強不足で,どこに問題があるのか分かりません.

編集 削除
HOta  2007-08-03 06:59:21  No: 27240  IP: 192.*.*.*

どこでエラーが出ているかを書いたほうが、レスポンスは早いですよ。

編集 削除
ケツ  2007-08-03 08:46:01  No: 27241  IP: 192.*.*.*

つパネルグループ コンポーネント
http://norg1964.hp.infoseek.co.jp/delphianworld/compo/panelgrp.html#PG0019

RadioGroupのCheckBox版があり、RadioGroup同様に一個だけチェックできる
プロパティあり
あとは、GroupBox枠消して、Caption空にしとけばおk

編集 削除
あんこ  2007-08-03 10:34:41  No: 27242  IP: 192.*.*.*

とりあえず新規アプリケーションで試してください。
オブジェクトインスペクタで
    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.

編集 削除