tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2005、クラス、フォーム間の連携について
記事No7787
投稿日: 2008/07/08(Tue) 23:13
投稿者時徒
表題からわかりにくいかもしれませんが下記のことが出来るかが知りたいです。
今、クラスモジュールで各フォームで共通の処理を作成しようとしています。
クラスにて共通の処理を行った後、フォームで指定した変数に値を代入して欲しいのです。
例えば、
フォームにLogを表示するテキストボックスがある。
フォームモジュールではLogの内容をテキストに出力するクラスを実行します。
そして実行されたクラスではテキストに出力が終わるとLogの内容をフォームのテキストボックスにも表示させます。
このような処理が行えるクラスを作成したいです。
しかし、クラスでフォームを指定してしまうといろいろなフォームで使えないため
クラスをセットした後にこのフォームではTxtLogという名前のテキストボックスに結果を表示してください(フォームが違うと名前も変えたい)。
とか、このフォームではテキストボックスへの出力はいらないよとかそういう宣言をしたいのですが可能ですか?
現在は以下の方法でしのいでます。
フォーム
 Dim Log As New Class
 Log.LogWrite("Log内容",Me.TxtBox.Text)
クラス
Public Sub LogWrite(ByVal Naiyou As String,ByRef TxtBox_C As String)
  Using TxtWrite As New System.IO.StreamWriter("c:\Log.txt")
      TxtWrite.WriteLine(Naiyou)
    End Using
  TxtBox_C = Naiyou & vbCrLf & TxtBox_C
End Sub
この方法だと、何度もMe.TxtBox.Textを宣言しなくてはいけません。また、Me.TxtBox.Textへの更新をフォームでやるとLogWriteの後に毎回同じ代入式を書かなければならなくなります。
一度どこかで、Me.TxtBox.Textに結果を入れてくれというのを、クラスに対してフォームで宣言できたらMe.TxtBox.Textは一度書けば良いし、引数も1つでよくなります。
そのような方法は無いでしょうか?
どうかよろしくお願いします。

[ツリー表示へ]
タイトルRe: VB2005、クラス、フォーム間の連携について
記事No7789
投稿日: 2008/07/09(Wed) 09:37
投稿者るしぇ
>何度もMe.TxtBox.Textを宣言しなくてはいけません。
フォーム側に"Log内容"を引数で渡すサブプロシージャを
作れば済む話では?

[ツリー表示へ]
タイトルRe^2: VB2005、クラス、フォーム間の連携について
記事No7794
投稿日: 2008/07/09(Wed) 23:26
投稿者時徒
> >何度もMe.TxtBox.Textを宣言しなくてはいけません。
> フォーム側に"Log内容"を引数で渡すサブプロシージャを
> 作れば済む話では?
確かに済むのですが、前回の書き込みに書いたようなことが、クラスの記述の工夫をすることで出来ないのだろうか?ということが知りたいです。
フォームでこの変数とクラス上の変数を関連付けるような関数や方法は無いのかなと思いまして・・・。
よろしくお願いいたします

[ツリー表示へ]
タイトルRe^3: VB2005、クラス、フォーム間の連携について
記事No7797
投稿日: 2008/07/10(Thu) 11:54
投稿者るしぇ
関連付けるような情報を変数に覚えておくだけの話だと思いますが、
簡単にやろうとするとフォームなりテキストボックスなりの参照
アドレスを共通クラスに渡すことになりそうなのでお勧めできません。

お勧めできるような手法は知りません。

[ツリー表示へ]
タイトルRe^4: VB2005、クラス、フォーム間の連携について
記事No7803
投稿日: 2008/07/10(Thu) 21:10
投稿者時徒
> 関連付けるような情報を変数に覚えておくだけの話だと思いますが、
> 簡単にやろうとするとフォームなりテキストボックスなりの参照
> アドレスを共通クラスに渡すことになりそうなのでお勧めできません。
>
> お勧めできるような手法は知りません。
そうですか、ありがとうございました。

[ツリー表示へ]
タイトルRe: VB2005、クラス、フォーム間の連携について
記事No7799
投稿日: 2008/07/10(Thu) 13:14
投稿者魔界の仮面弁士
案1) Trace クラスのような実装にする。
→ Trace の場合、.Listeners.Add() でログの出力先
 (ファイル/イベントログ/コンソール/DB/コントロール等)を指定できますね。


案2) BackgroundWorker クラスのような実装にする。
→ 進捗状況に応じて、ProgressChanged イベントが発生しますよね。それと同様、
 ログが生成される際に何かイベントを発生させるようにしておき、フォーム側は
 そのイベントを用いて、TextBox への表示を行うような処理を書くとか。


案3) データバインドのような実装にする。
→ たとえば DataGridView1.DataSource = Me.Controls などとすると、
 フォーム配下のコントロールの一覧が、DataGridView に表示されますよね。
 そして、グリッドに表示された中から、TextBox 行の Text 列の情報を
 ユーザーが書き換えると、実際の Text プロパティも更新されますよね。
 それと同様、自作クラスには最初に出力先となるコントロールを渡しておき、
 実際の出力操作を、そこにログ出力を行わせるようにする、と。

[ツリー表示へ]
タイトルRe^2: VB2005、クラス、フォーム間の連携について
記事No7802
投稿日: 2008/07/10(Thu) 21:09
投稿者時徒
ありがとうございます
> 案1) Trace クラスのような実装にする。

これはフォーム側でしないといけないような気がするのですが間違いですか?


> 案3) データバインドのような実装にする。
>  それと同様、自作クラスには最初に出力先となるコントロールを渡しておき、
>  実際の出力操作を、そこにログ出力を行わせるようにする、と。
そこのコントロールの渡し方がわかりません。
フォームの名前は変わるので、クラスにはそのまま直に書けませんし、
class.D=Me.Controls
みたいな感じで渡せたとしても、クラスでどのようにしたらこの変数を変更できるのか・・・
前に書いているように処理の引数として渡すのなら変更できますが、
コントロールを渡す(関連付ける)処理とコントロールに書き込む処理が別の時はよい方法がうかびません
すいませんが、もう少し詳しく教えていただけないでしょうか?お願いします

[ツリー表示へ]
タイトルRe^3: VB2005、クラス、フォーム間の連携について
記事No7804
投稿日: 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文字で、スニペット一覧を表示させ、そこから
# [共通コードパターン]-[プロパティとプロシージャ]-[プロパティの定義]
# を選ぶ事でも、テンプレートが生成されます。


> 前に書いているように処理の引数として渡すのなら変更できますが、
メソッド引数としてではなく、プロパティとして渡せば良いかと。

[ツリー表示へ]