タイトル : Re^3: VB2005、クラス、フォーム間の連携について 投稿日 : 2008/07/11(Fri) 00:08 投稿者 : 魔界の仮面弁士
> > 案1) Trace クラスのような実装にする。 Trace の場合、出力先をプログラムからではなく、App.Config で指定することも できるようになっていますね。今回はそこまで実装する必要は無いでしょうけれども。 > これはフォーム側でしないといけないような気がするのですが間違いですか? どこに吐き出して欲しいかを知っているのは、フォーム側なのですから、 まずはそれを教える必要があるでしょう。 呼び出し側のイメージコードとしては、例えばこんな感じで如何でしょうか。 Private log As New Logging() Private Sub Form1_Load(… log.OutputControls.Add(TextBox1) 'ログの表示先を TextBox1 を指定 log.Start() 'ログ取り開始 End Sub あるいはそのログ出力クラスを、フォームに貼って使えるコンポーネントにしておく という手もあります。たとえば、ErrorProvider クラスをフォームに貼ると、 TextBox 等のプロパティに "ErrorProvider1 の IconoAlignment" プロパティが 用意されますよね。あんな感じで、TextBox 用の拡張プロパティとして実装すれば、 上記のような出力先の指定すら不要になります(デザイナ設定だけで済む)。 あるいは、TextBox1 のインスタンスに自作した属性を貼っておくようにしておき、 ログ出力クラスは、フォーム上にあるコントロールから、その属性を持ったメンバを 探して、そこに自動出力するような実装にするとか。 > > 案3) データバインドのような実装にする。 > そこのコントロールの渡し方がわかりません。 DataGridView なら、デザイン時または実行時に、DataSource プロパティに 割り当てますよね。それと同じようにすれば良いのでは無いかと。 あるいは、クラス側が「出力先を教えてください」と聞くためのイベントを発生させ、 フォームはイベント引数を用いて、そこに TextBox を渡す形にするとか。 > class.D=Me.Controls > みたいな感じで渡せたとしても、クラスでどのようにしたらこの変数を変更できるのか・・・ 上記のプロパティ D の実装方法自体は分かりますよね。 クラス側は、Property D の Get ブロックで受け取ったコントロールを、 インスタンス変数に取って置くだけで良いと思いますが…(そういう意味では無いのかな?) VB2005以上であれば、『property[tab]』の9文字を打てば、スニペットによる プロパティの記述テンプレートが生成されます。 # あるいは、『?[tab]』の2文字で、スニペット一覧を表示させ、そこから # [共通コードパターン]-[プロパティとプロシージャ]-[プロパティの定義] # を選ぶ事でも、テンプレートが生成されます。 > 前に書いているように処理の引数として渡すのなら変更できますが、 メソッド引数としてではなく、プロパティとして渡せば良いかと。 |