2012-04-18 1 views
5

これについての他の回答と例がたくさんありましたが、これを設定する方法がますます混乱しています。私は、フォームクラスのperformMoveメソッドの結果に基づいて、Robotクラスでイベントを発生させる必要があります。私は別のクラスからイベントを呼び出すことができないことを知っているので、私は明らかにうまくいきません。しかし、私は本当にこれを正しく設定する方法を掴んでいません。私は、codeProject、dreamInCode、そしてこのサイトのデリゲートとイベントの記事を他の多くの記事で読んだ。これは、初心者のC#クラスのためである、と私は誰もがイベント調達する:)イベントを起こそうとしている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"); 

    } 
} 
+0

エラーがありますか? – Josh

+0

申し訳ありません。 performMoveのmoveRobot.outOfRange()行が "エラーを発生させます。 'Assignment12.Robot.outOfRange'イベントは+ =または - =" –

+4

の左側にのみ表示されます。この質問には、あなたがしたいことをやる方法を知らないという発言だけではないようです。あなたは何をしたいのかをより明確に記述できますか?たとえば、「別のクラスで呼び出されたときに、ファーストクラスでイベントを発生させるメソッドを1つのクラスに作成する必要があります。 –

答えて

0

あなたcoor_Within_Rangeニーズを伝えることができると確信しているように私は、これにはかなり新しいです:次に

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

をあなたがイベントを必要としていないようです

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

public void oncoor_Within_Range() { 
    Console.WriteLine("robot within range"); 
} 
2

:あなたのFormクラスであなたがイベントを処理する必要があります。今はmoveRobot.coor_Within_Range()と呼ぶだけの複雑な方法です。仲介者を切り抜いてください:

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

Within_RangeとoutOfRangeは不思議そうな反対の名前ですが。

ロボットで起こっていることについてフォームに通知するイベントが必要です。私はそれを行う方法についてanswer hereを投稿しました。

+0

できません、割り当ては、ロボットクラスでイベントを発生させることです。 –

13

この質問はかなり混乱しています。

あなたが自分に当てはめるべき質問は:です。ポリシーの宣言と実施を担当していますか?あなたは2つのエンティティを持っています: "フォーム"と "ロボット"。あなたは、法的位置がロボットのために何であるかについていくつかの方針を持っています。その方針を思い付くのはどのクラスですか? ロボットは範囲外であることを知り、その事実の形式を知らせますか?またはは、ロボットが範囲外になったことを知り、ロボットにその事実のを知らせますか?

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

ロボットが範囲外のときにフォームが決定される場合は、ロボットがリスナーである必要があります。フォームが範囲外のときにロボットが決定すると、フォームがリスナーである必要があります。今すぐフォームがリスナーになっていますが、ロボットが範囲外のときにそれを伝えようとしています。

+0

私はコンサートの例が大好きです。これを10回アップヴォートすることができればと思います。 – payo

関連する問題