| | タイトル | : Re: Delgateの受け渡し? |  | 記事No | : 8807 |  | 投稿日 | : 2009/03/13(Fri) 13:29 |  | 投稿者 | : 魔界の仮面弁士 | 
 > VB2005のTimerクラスをちょっと改良しようとしてTimer クラスには 3 種類ありますが、今回使いたいのは、
 System.Windows.Forms.Timer のクラスなのですね?
 
 
 > 下記コード(未完成)を作成中ですが、
 まずは、何をしたいのかを教えてください。
 その未完成コードに何を求めているのかを知っているのは、ダンボさん自身だけです。
 
 目的が分からないことには、このコードがあとちょっとで完成する段階なのか、
 それとも、実装手法そのものから間違っているのかの判断も出来ません。
 
 
 とりあえず、やりたいことを推測しながら答えると、こんなところでしょうか。
 
 
 (1) Timer に ProfileClass を関連付けたい。
 → 手抜きでよければ、Timer の派生クラスを用意せずとも、
 Timer.Tag プロパティに放り込んでだけと言う手も使えます。
 
 (2) SlideTimerClass 自身がタイマー処理を行いたい。
 → この場合、Tick イベントを使うべきではありません。
 かわりに、OnTick メソッドをオーバーロードするようにしましょう。
 
 (3) SlideTimerClass の利用者が、タイマー処理を行いたい。
 → SlideTimerClass 内ではなく、利用者がイベントを捕らえてください。
 
 (4) 利用者側でデリゲートを用意し、それを SlideTimerClass に処理させたい。
 → いろいろ間違ってます。以下参照。
 
 まず、
 > AddHandler MyClass.Tick, AddressOf MyClass.EventProc
 の 第2引数に、何を引き渡すべきかを把握していますでしょうか。
 ここにくるべきは、EventHandler 型のデリゲート インスタンスです。
 
 もし、
 > Private EventProc As Predicate(Of EventHandler(Of EventArgsSlideTimer))
 をタイマーで処理したいのだとしたら、AddressOf を指定すべきではありません。
 
 かといって、AddressOf を指定せずに、
 AddHandler MyClass.Tick, MyClass.EventProc
 というのは、型が異なるので NG です。
 
 何故なら、デリゲート「Predicate(Of EventHandler(Of EventArgsSlideTimer))」は、
 Function foo(ByVal e As EventHandler(Of EventArgsSlideTimer)) As Boolean
 を要求しますが、本来指定すべき「EventHandler」の定義は、
 Sub foo(ByVal sender As Object, ByVal e As EventArgs)
 であるからです。
 
 AddressOf を使うなら、
 Public Sub New(…
 AddHandler MyClass.Tick, AddressOf foo
 End Sub
 Private Sub Foo(ByVal sender As Object, ByVal e As EventArgs)
 EventProc.Invoke(…
 End Sub
 のような実装にする事はできるでしょう。もっとも、このようなコードは
 お奨めできませんし、それが目的の処理かどうかも分かりませんけれども。
 
 |