tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。