お世話様です。よろしくお願いいたします。
複数のコントロールで共用しているイベントにおいて、どのコントロールから飛んできたかにより処理を振り分けたいと思います。
イベント内で、コンポーネント名を判断して、
if TComponent(Sender).Name='AAA' then 処理A
else if TComponent(Sender).Name='BBB' then 処理B
else if TComponent(Sender).Name='CCC' then 処理C
としています。
1行で判断するコントロールが複数になり or で結んだりし始めると「TComponent(Sender).Name=」が何回も必要で、だんだん長くなってしまいます。
これを、case文のように
case TComponent(Sender).Name of
'AAA' : 処理A;
'BBB' : 処理B;
'CCC' : 処理C;
end;
というようにする方法はありますでしょうか?
または、AAA,BBB,CCCのコントロールでは処理Aをさせたいとして、集合型のような考え方で、
var
Target: set of ( AAA, BBB, CCC);
などと宣言しておいて、
if TComponent(Sender).Name in Target then 処理A
というようにする方法はありますでしょうか?
以上、よろしくお願いいたします。
> だんだん長くなってしまいます。
With TComponent(Sender) do を使う。
> 集合型のような考え方
Tag プロパティを使う。
p := Tcomponent(Sender).Tag;
Case p of
0 : 処理A;
1 : 処理B;
2 : 処理C;
略
end;
tagは一意にして、無関係なコンポーネントのタグは処理内で使っているtagとは違うモノにしないととんでもないことになるけど。
お返事いただきましてありがとうございます。
うれしーです。
そうですね。
Withを使えば表記を短縮できますね。
処理を行いたいコンポーネントのTagプロパティを設定して、
if Tcomponent(Sender).Tag=1 then 処理A
とすることにしました。ありがとうございました。
ところで、ヘルプでは、集合型は同一の順序型の集まりとありますが、例として
set of (Club, Diamond, Heart, Spade)
という宣言がのっています。
この場合「Club」というものは文字として認識されているということなのでしょうかね。
> この場合「Club」というものは文字として認識されているということなのでしょうかね。
「文字として認識」という意味がわかりませんが。
要素が8個までなら、byte にキャストすると各要素の定義がビットフラグになって
いるのが分かります。上の例なら
Club = 1
Diamond = 2
Heart = 4
Spade = 8
です。
type
TCard = set of (Club, Diamond, Heart, Spade, Hoge, HogeHoge);
procedure TForm1.Button1Click(Sender: TObject);
var
c: TCard;
begin
c := [Club, Spade];
Label1.Caption := IntToStr(byte(c));
end;
いろいろ要素を入れ換えて試してみてください。
横槍です。(^_^;)
もう終わっちゃってますけど・・・
> if TComponent(Sender).Name='AAA' then
長くなるけど、Tagを使うまでのことは無いなって時
if Sender = AAA then
でも良いです。
>「文字として認識」という意味がわかりませんが。
set of (Club, Diamond, Heart, Spade);
の並びで、1,2,4,8の重み付けがされるのはわかるのですが、これを次のように使用するときに
type
TCard = set of (Club, Diamond, Heart, Spade);
procedure TForm1.Button1Click(Sender: TObject);
var
c: TCard;
begin
c := [Spade];
if Spade in c then 処理
end;
「Spade」という文字の並びが8であるという結びつけは、どういう仕組みで判断されているのでしょうか。
あと、順序型ということは、要素として255個までしか使用できないということでしょうか。
>長くなるけど、Tagを使うまでのことは無いなって時
>if Sender = AAA then
>でも良いです。
いろいろな表記法ができるのですね。勉強になります。
> 「Spade」という文字の並びが8であるという結びつけは、どういう仕組みで判断されているのでしょうか。
if Spade in c then 処理
この文で Spade という文字列の並びが c の型である TCard 型の要素であること
はコンパイラに分かるので、TCard の定義時の値 8 が割り当てられている事は
実行時に評価できるのでは? in は単に評価時に対応するビットが立っているか
どうか調べるだけですね。
> あと、順序型ということは、要素として255個までしか使用できないということでしょうか。
D6 のヘルプを読むとそのようです。
>実行時に評価できるのでは? in は単に評価時に対応するビットが立っているか
>どうか調べるだけですね。
なるほど...。
いろいろありがとうございました。
これで解決とさせていただきます。
ツイート | ![]() |