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

这个问题相当令人困惑。

您应该向自己提出的问题是:谁负责宣布和执行政策?您有两个实体:“表单”和“机器人”。您对机器人的法律地位有一些政策。哪个班级负责制定该政策?机器人是否知道它何时超出范围,并告知该事实的形式?或者表单是否知道机器人何时超出范围,并告知机器人这一事实?

希望被告知的是事件监听器。希望通知其他人违反策略的东西是事件。完全不清楚您想成为其中的哪一件,以及您想成为哪一件。但是您违反的规则很明确: 事件侦听器不是在事件发生时被允许说的东西音乐会的人不会站起来向钢琴家大喊要按什么键的指示!那是钢琴家的决定,听者只需决定是否听,以及如何反应。

如果表单决定机器人何时超出范围,则机器人需要成为侦听器。如果机器人决定表单何时超出范围,则表单需要成为侦听器。现在,您已经获得了作为侦听器的表单,但它试图告诉机器人何时超出范围。

于 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 回答