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