0

現在、カスタムボタンハンドラーを構築している最中です(kinectをマウスを使用するボタンシステムに統合する必要がありました)。その後、イベント処理と呼ばれる恐ろしいことになりました。少なくとも1時間は私のことを叫んでいます。 pc:P。ハンドラーごとに複数のイベントを設定するという新しい要望に対応するためにシステムを変更する前に、私は疑問に思っていました。しかし、私は夜に降りるので、明日コンピューターを起動するときに時間を節約でき、システムがそのために設計されていない場合は試行しないことを望んでいます)

また、私がコーディングしていた前に、getInvocリストまたはそのようなものを見たことがあります。複数のデリゲートをそのリストに追加してから、そのリストを取得して、それを繰り返しますか?

以前の例で、私は人々がどこで使用したかを見ました:

public event EventHandler myEventHandler;

私は使用しなければなりませんでした:

private Dictionary<BtnEvent, Delegate> m_events;

次に、ハンドラーを追加するために次のことを行いました(私の方法ではありません)。

myObj.myEventHandler += delegate(object sender, EventArgs ea)
{
     //do stuff on event
};

最初に..これを2回実行した場合、1回はfuncAで、2回目はfuncbで両方を実行しますか?または1つだけ?

次に、+ =のロジックをデリゲートに適用した場合、それは機能しますか?(ハンドラーを辞書内に格納していたため、Delegateを使用する必要がありました。これにより、列挙型を使用してハンドラーに論理的にアクセスできるようになりました)

(私のコード)

private Dictionary<BtnEvent, Delegate> m_events;

//....

m_events = new Dictionary<BtnEvent, Delegate>(6);
m_events.Add(BtnEvent.CLICK_ENTER,  null);
m_events.Add(BtnEvent.CLICK_LEAVE,  null);
m_events.Add(BtnEvent.CLICK_STAY,   null);
m_events.Add(BtnEvent.HOVER_ENTER,  null);
m_events.Add(BtnEvent.HOVER_LEAVE,  null);
m_events.Add(BtnEvent.HOVER_STAY,   null);

//....

public bool addHandle(BtnEvent stateToGet, Delegate function)
{
    bool success = false;

    if(m_events.ContainsKey(stateToGet))
    {
        m_events[stateToGet] = function;
    }

    return(success);
}

// CHANGE ABOVE TO:

public bool addHandle(BtnEvent stateToGet, Delegate function)
{
    bool success = false;

    if(m_events.ContainsKey(stateToGet))
    {
        m_events[stateToGet] += function;
    }

    return(success);
}

m_events[stateToGet]=関数を変更します。to m_events [stateToGet]+=関数; 次のコードを使用して、複数のイベントハンドル(addHandleに渡した関数)を呼び出せるようにしますか?

private void ExecuteEvent(BtnEvent currEvent)
{
    if(m_events.ContainsKey(currEvent))
    {
        if(m_events[currEvent] != null)
        {
           m_events[currEvent].DynamicInvoke(null);
        }
    }
}
4

1 に答える 1

0

最初の質問に答える以下のコードを参照してください。

public partial class Form1 : Form
    {    
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            funcA();
            funcB();
        }

        private void funcA()
        {
            button1.Click += new EventHandler(button1_Click);
        }

        private void funcB()
        {
            button1.Click += new EventHandler(button1_Click);
        }

        void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I am in event handler");
        }

    }

ボタンをクリックすると、「私はイベントハンドラーにいます」というメッセージが2回表示されます。これは+=、オペレーターが整数または文字列で機能するのと同じようにデリゲートで機能することを意味します。関数ハンドラーをキューに追加し、イベントの実行時に、キュー内のすべての関数ポインターを呼び出すだけです。

=2番目の質問については、に変更しても期待どおりの動作は得られないと思います+=。あなたのステートメントから私が理解しているのは、ExecuteEvent()関数の呼び出し時にCLICK_ENTER、CLICK_LEAVEなどの複数のイベントハンドラーを実行したいということです。ただし、イベントハンドラーとそのデリゲートをディクショナリに格納しているため、に変更=する+=と、上記のコードに示されているのと同じ方法でのみ機能します。

于 2012-10-08T05:47:05.420 に答える