やりたいこと
・Comboboxを3つ置く(以下A,B,C)
・それぞれのDropDownListで、0〜10まで選択できる
・それぞれを排他で選択したい
Aで1を選択した場合、B、CのComboboxでは、
リストに残しつつ、1を選択不可にしたいのです。
選択した項目が、選択可であるか判定できる方法はないでしょうか?
TabコントロールのOnChangingイベントみたいなものが欲しい。
素直にAの選択後、B・Cのリストを再作成するほうが
ラクなのかなと思いつつ、すばらしきアイディアが出ることを
期待して質問しました。
よろしくお願いします。
春子:「ヒロミくん、これ"海の日"のお客様の予約リスト、グループごとに分けて、こっちに名前 清書しておいてね」
広海:「え、"海の日"? そっか、もう夏がすぐそこに来てるンだよねぇ」
真琴:「でもぉ〜、今は毎日雨ばっかり…お客様も来ないし、梅雨なんてなければイイのにぃ〜」
海都:「マコっちゃん、梅雨がなかったら夏に水不足になるし、困る人も大勢いるよ」
真琴:「そうだけどぉ〜…」
春子:「梅雨があけたら、もう眼が回るほど大忙しだから、それもイヤじゃないの?」
真琴:「ううん、夏は大好きだから、いくら忙しくてもアタシ平気だよ、だけどぉ〜」
広海:「文句いってないで、ほら、マコトもコレ手伝えよ、ヒマなんだろ?」
真琴:「アタシたち、ヒマじゃないよ、ね、カイトさん?」
広海:「えっ、なに〜ぃ? 二人で恋の密談〜?」
真琴:「バァ〜ッカ、そんナンじゃナイって」
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っていうのもあるのね?」
海都:「うん、それで、排他制御するものと、そうじゃないものに分けるんだ」
広海:「あの、オレもソッチのグループ入ろかなぁ〜」
春子:「ダメよ、サッサと名前書く、夕食前までに終わらせる、いいわネ」
広海:「はいはい…、ハルコちゃん、だんだん、前の社長に似てきた…」
春子:「ナンか言った?」
広海:「ああ〜っ、それもソックリぃ」
ををををっ!!
CBN_SELCHANGEで、inheritedを通さなければ、変更されないとは
目から鱗が落ちる。
なんという予想外の回答・・・ですが、ばっちり動きました。
ソックリさん、固定ハンドルをお持ちでない(使わない)と
お見受けしますが、毎度毎度楽しいレスをありがとうございます。
今回も、本当にありがとうございました。
ツイート | ![]() |