イベントプロシジャ内で、コントロール名を判断して処理を振り分けるには

解決


Hiro  2006-11-22 03:44:23  No: 23999

お世話様です。よろしくお願いいたします。

複数のコントロールで共用しているイベントにおいて、どのコントロールから飛んできたかにより処理を振り分けたいと思います。
イベント内で、コンポーネント名を判断して、
  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
というようにする方法はありますでしょうか?

以上、よろしくお願いいたします。


えーとね  2006-11-22 04:32:25  No: 24000

> だんだん長くなってしまいます。
With TComponent(Sender) do を使う。

> 集合型のような考え方
Tag プロパティを使う。


tagに賛成  2006-11-22 23:50:45  No: 24001

p := Tcomponent(Sender).Tag;
Case p of
  0 : 処理A;
  1 : 処理B;
  2 : 処理C;
    略
end;

  tagは一意にして、無関係なコンポーネントのタグは処理内で使っているtagとは違うモノにしないととんでもないことになるけど。


Hiro  2006-11-24 19:17:17  No: 24002

お返事いただきましてありがとうございます。
うれしーです。

そうですね。
Withを使えば表記を短縮できますね。

処理を行いたいコンポーネントのTagプロパティを設定して、
if Tcomponent(Sender).Tag=1 then 処理A
とすることにしました。ありがとうございました。

ところで、ヘルプでは、集合型は同一の順序型の集まりとありますが、例として
set of (Club, Diamond, Heart, Spade)
という宣言がのっています。
この場合「Club」というものは文字として認識されているということなのでしょうかね。


うんと  2006-11-24 22:44:35  No: 24003

> この場合「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;

いろいろ要素を入れ換えて試してみてください。


Syake  2006-11-25 00:10:45  No: 24004

横槍です。(^_^;)
もう終わっちゃってますけど・・・
> if TComponent(Sender).Name='AAA' then 
長くなるけど、Tagを使うまでのことは無いなって時
if Sender = AAA then
でも良いです。


Hiro  2006-11-25 02:13:14  No: 24005

>「文字として認識」という意味がわかりませんが。
  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
>でも良いです。

いろいろな表記法ができるのですね。勉強になります。


うんと  2006-11-25 06:24:39  No: 24006

> 「Spade」という文字の並びが8であるという結びつけは、どういう仕組みで判断されているのでしょうか。

if Spade in c then 処理

この文で Spade という文字列の並びが c の型である TCard 型の要素であること
はコンパイラに分かるので、TCard の定義時の値 8 が割り当てられている事は
実行時に評価できるのでは? in は単に評価時に対応するビットが立っているか
どうか調べるだけですね。

> あと、順序型ということは、要素として255個までしか使用できないということでしょうか。

D6 のヘルプを読むとそのようです。


Hiro  2006-11-26 12:10:24  No: 24007

>実行時に評価できるのでは? in は単に評価時に対応するビットが立っているか
>どうか調べるだけですね。
なるほど...。
いろいろありがとうございました。

これで解決とさせていただきます。


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

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






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