ComboBoxで項目毎に選択可・不可する

解決


ofZ  2008-06-05 21:14:51  No: 30914

やりたいこと
・Comboboxを3つ置く(以下A,B,C)
・それぞれのDropDownListで、0〜10まで選択できる
・それぞれを排他で選択したい

Aで1を選択した場合、B、CのComboboxでは、
リストに残しつつ、1を選択不可にしたいのです。

選択した項目が、選択可であるか判定できる方法はないでしょうか?
TabコントロールのOnChangingイベントみたいなものが欲しい。

素直にAの選択後、B・Cのリストを再作成するほうが
ラクなのかなと思いつつ、すばらしきアイディアが出ることを
期待して質問しました。
よろしくお願いします。


ソックリ  2008-06-06 02:43:15  No: 30915

春子:「ヒロミくん、これ"海の日"のお客様の予約リスト、グループごとに分けて、こっちに名前 清書しておいてね」
広海:「え、"海の日"? そっか、もう夏がすぐそこに来てるンだよねぇ」
真琴:「でもぉ〜、今は毎日雨ばっかり…お客様も来ないし、梅雨なんてなければイイのにぃ〜」
海都:「マコっちゃん、梅雨がなかったら夏に水不足になるし、困る人も大勢いるよ」
真琴:「そうだけどぉ〜…」
春子:「梅雨があけたら、もう眼が回るほど大忙しだから、それもイヤじゃないの?」
真琴:「ううん、夏は大好きだから、いくら忙しくてもアタシ平気だよ、だけどぉ〜」
広海:「文句いってないで、ほら、マコトもコレ手伝えよ、ヒマなんだろ?」
真琴:「アタシたち、ヒマじゃないよ、ね、カイトさん?」
広海:「えっ、なに〜ぃ? 二人で恋の密談〜?」
真琴:「バァ〜ッカ、そんナンじゃナイって」

type
  TComboSelChangingEvent = procedure(Sender: TObject; var CanSelect: Boolean) of Object;
  TComboBox = class(StdCtrls.TComboBox)
  private
    FGroupID: Integer;
    FCanSelect: Boolean;
    FPreItemIndex: Integer;
    FOnSelChanging: TComboSelChangingEvent;
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  published
    property GroupID: Integer read FGroupID write FGroupID default 0;
    property OnSelChanging: TComboSelChangingEvent read FOnSelChanging write FOnSelChanging;
  public
    constructor Create(AOwner: TComponent); override;
  end;
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    ComboBox6: TComboBox;
    .....
    procedure FormCreate(Sender: TObject);
  private
    procedure ComboBoxSelChanging(Sender: TObject; var CanSelect: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{TComboBox}
constructor TComboBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FPreItemIndex := -1;
  FGroupID := 0;
end;

procedure TComboBox.CNCommand(var Message: TWMCommand);
begin
  case Message.NotifyCode of
   CBN_SELCHANGE:
    if Assigned(FOnSelChanging) then begin
     FCanSelect := True;
     FOnSelChanging(Self, FCanSelect);
     if not FCanSelect then begin
      ItemIndex := FPreItemIndex;
      exit;
     end;
     FPreItemIndex := ItemIndex;
    end;
  end;
  inherited;
end;

{TForm1}
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.GroupID := 1;  ComboBox1.OnSelChanging := ComboBoxSelChanging;
  ComboBox2.GroupID := 1;  ComboBox2.OnSelChanging := ComboBoxSelChanging;
  ComboBox3.GroupID := 1;  ComboBox3.OnSelChanging := ComboBoxSelChanging;
  ComboBox4.GroupID := 2;  ComboBox4.OnSelChanging := ComboBoxSelChanging;
  ComboBox5.GroupID := 2;  ComboBox5.OnSelChanging := ComboBoxSelChanging;
end;

procedure TForm1.ComboBoxSelChanging(Sender: TObject; var CanSelect: Boolean);
var
  i: Integer;
begin
  for i:=0 to ComponentCount - 1 do begin
   if (Components[i] is TComboBox)and(Components[i] <> Sender)
    and(TComboBox(Sender).GroupID = TComboBox(Components[i]).GroupID)
     and(TComboBox(Sender).GroupID > 0)
      and(TComboBox(Sender).ItemIndex >= 0) then
   begin
    if(TComboBox(Components[i]).ItemIndex = TComboBox(Sender).ItemIndex) then begin
     CanSelect := False;
     Form1.Caption := '選択不可だよン!!';    //確認
     break;
    end;
   end;
  end;
end;

真琴:「カイトさん、新しいTComboBoxクラスには、GroupIDっていうのもあるのね?」
海都:「うん、それで、排他制御するものと、そうじゃないものに分けるんだ」
広海:「あの、オレもソッチのグループ入ろかなぁ〜」
春子:「ダメよ、サッサと名前書く、夕食前までに終わらせる、いいわネ」
広海:「はいはい…、ハルコちゃん、だんだん、前の社長に似てきた…」
春子:「ナンか言った?」
広海:「ああ〜っ、それもソックリぃ」


ofZ  2008-06-06 04:01:15  No: 30916

ををををっ!!
CBN_SELCHANGEで、inheritedを通さなければ、変更されないとは
目から鱗が落ちる。
なんという予想外の回答・・・ですが、ばっちり動きました。

ソックリさん、固定ハンドルをお持ちでない(使わない)と
お見受けしますが、毎度毎度楽しいレスをありがとうございます。
今回も、本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加