タイトル | : 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 のような実装にする事はできるでしょう。もっとも、このようなコードは お奨めできませんし、それが目的の処理かどうかも分かりませんけれども。
|