5

私はこれに関する他の多くの回答と例を研究してきましたが、これを設定する方法についてますます混乱しています。フォーム クラスの performMove メソッドの結果に基づいて、Robot クラスでイベントを発生させる必要があります。私は別のクラスからイベントを発生させることができないことを知っているので、私が持っているものは明らかに機能しません。しかし、私はこれを適切に設定する方法を本当に理解していません。私は、codeProject、dreamInCode、およびこのサイトで、他の多くのデリゲートとイベントの記事を読みました。これは初心者のC#クラス用で、誰もがわかると確信しているので、私はこれにかなり慣れていません:)

namespace Assignment12
{
    public delegate void ErrorHandler();

public partial class frmRobot : Form
{
    Robot moveRobot = new Robot();

    public frmRobot()
    {
        InitializeComponent();
        reset_Position();
        current_Position_Display();
        moveRobot.outOfRange += new ErrorHandler(moveRobot.coor_Within_Range);
    }
    ...

    private void performMove()
    {
        Point loc = lblArrow.Location;
        int x = moveRobot.Move_Robot_XAxis(loc.X);
        int y = moveRobot.Move_Robot_YAxis(loc.Y);
        if (x < -100 && x > 100)
        {
            moveRobot.outOfRange();
            x = loc.X;
        }
        if (y < -100 && y > 100)
        {
            moveRobot.outOfRange();
            y = loc.Y;
        }
        this.lblArrow.Location = new Point(x, y);
        current_Position_Display();
    }

class Robot
{

    public event ErrorHandler outOfRange;
    ...
    public void coor_Within_Range()
    {
        System.Console.WriteLine("TestOK");

    }
}
4

3 に答える 3

13

この質問はかなり紛らわしいです。

自問すべきことは、ポリシーの宣言と実施を担当しているのは誰ですか? 「フォーム」と「ロボット」の 2 つのエンティティがあります。ロボットの法的地位とは何かについて、いくつかのポリシーがあります。そのポリシーを考え出す責任があるのはどのクラスですか? ロボットは、範囲外になったことを認識し、その事実をフォームに通知しますか? それとも、フォームはロボットが範囲外になったことを認識し、その事実をロボットに通知しますか?

通知を希望するのは、イベントリスナーです。ポリシー違反を他人に知らせたいのはイベントソースです。これらのうちのどれがリスナーになりたいのか、どれがソースになりたいのかはまったく不明です。しかし、違反しているルールは明らかです 。イベントリスナーは、イベントが発生したときに言うことが許可されているものではありませんコンサートを聞いている人は、立ち上がってピアニストにどのキーを押すかについて大声で指示することはできません! それはピアニストの決定であり、聞き手は聞くかどうか、どのように反応するかを決定するだけです。

フォームがロボットが範囲外になるタイミングを決定する場合、ロボットはリスナーである必要があります。フォームが範囲外になるタイミングをロボットが判断できるようになる場合は、フォームがリスナーになる必要があります。現在、フォームはリスナーになっていますが、ロボットが範囲外にあることをロボットに伝えようとしています。

于 2012-04-18T17:06:18.917 に答える
2

イベントは必要ないようです。今のところ、 を呼び出すのは複雑な方法moveRobot.coor_Within_Range()です。仲買人を切り取ります:

    if (x < -100 && x > 100)
    {
        moveRobot.coor_Within_Range();
        x = loc.X;
    }

Within_Range と outOfRange は奇妙なことに反対の名前ですが。

ロボットで起こっていることをフォームに通知するには、イベントが必要です。その方法について、こちらに回答を投稿しました。

于 2012-04-18T17:02:16.213 に答える
0

イベントcoor_Within_Rangeを発生させる必要があります。

public void coor_Within_Range()
{
    System.Console.WriteLine("TestOK");
    if (this.outOfRange != null) {
        this.outOfRange();
    }
}

次に、Formクラスでイベントを処理する必要があります。

public frmRobot()
{
    // snipped
    moveRobot.outOfRange += new ErrorHandler(this.oncoor_Within_Range);
}

public void oncoor_Within_Range() {
    Console.WriteLine("robot within range");
}
于 2012-04-18T17:01:01.447 に答える