C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: フォームの操作をどこからでも行うには


(過去ログ 136 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■80136 / inTopicNo.1)  フォームの操作をどこからでも行うには
  
□投稿者/ だんご (7回)-(2016/06/15(Wed) 22:21:38)

分類:[.NET 全般] 

たびたび質問させていただきます…。

自分は独学でVBを始めたためいまいちフォーム間の操作を行う方法がわかりません。
例えば、Form1,Form2,Form3,Form4という4つのフォームがあったとします。
Form1が初期起動、Form2にテキストボックスがあります。
各FormからForm2のテキストボックスに文字列を追加していくとする場合、どういった経由でアクセスするのがよいのでしょうか。
またFormではなくインスタンスを作らないsharedなどの関数からForm2へのアクセスは可能でしょうか。

よろしくお願いします。

VB.Net
引用返信 編集キー/
■80150 / inTopicNo.2)  Re[1]: フォームの操作をどこからでも行うには
□投稿者/ 774RR (414回)-(2016/06/16(Thu) 11:09:44)
「どこからでも」という発想が浮かぶ時点でオブジェクト指向な考えかたが身についていない証拠。

オブジェクト指向(オブジェクト志向)ってのは、
「そのオブジェクトに無関係な何かが当該オブジェクトに何かする」ことを排除してバグを減らそう
という考え方。だから「どこからでも」というのはおかしいんだ。

Form に親子関係があれば(ということは無関係ではない、ということ)
・親が子にデータを渡す
・子は、渡されたデータを表示したり加工したりする
・(必要があれば)親は、子の持っているデータを取り出して自分自身に反映する
(設定ダイアログなんかはこういう方式)

技巧的にはやってやれなくはないけど、そもそもそういう仕様は出発点からしておかしいと思うべき。
仕様っつか要求レベルから見直してみないかい?

Form2 と Form3 と Form4 には何か関連があるの?無いの?
その辺、「自分が本当にしたいこと」を書けばまた別のコメントが付くかもしれない。

引用返信 編集キー/
■80152 / inTopicNo.3)  Re[2]: フォームの操作をどこからでも行うには
□投稿者/ だんご (8回)-(2016/06/16(Thu) 12:25:55)
No80150 (774RR さん) に返信
> Form2 と Form3 と Form4 には何か関連があるの?無いの?
> その辺、「自分が本当にしたいこと」を書けばまた別のコメントが付くかもしれない。
>

ついついC言語の名残でオブジェクト指向が難しく思います。
勉強します…。

言葉足らずですみません。
簡単に言えばMDIアプリで、子フォーム同士のやり取りといった感じでしょうか。今回で言いますと、Form1が親フォーム、その他が子フォームです。

具体的に言いますと、ログ機能をつけたいと思っています。何かしらのエラーや情報を一つのテキストボックスで出力しようとしています。
引用返信 編集キー/
■80153 / inTopicNo.4)  Re[3]: フォームの操作をどこからでも行うには
□投稿者/ 774RR (415回)-(2016/06/16(Thu) 13:16:35)
> ログ機能をつけたいと思っています。
オブジェクト指向的にはこう考えるといいかも。

ログ機能クラスがある。
ログ機能クラスのインスタンスがある(というか、初期化の段階で作る)。
おそらくそのインスタンスは1個でよい(この例では複数あってもおかしくない)
1個でなきゃダメ、なら「シングルトン」なり static class なりを考えればいい。
1個でも2個でも3個以上でも良いなら普通のクラス設計となるだろう。

ログを出す側は「ログ機能クラスのインスタンスに、出力をお願いする」
=最終的にどこに表示されるかは、ログを出す側は気にしなくていい
→ログを出す元である Form とログを表示する Form は切り離せた(疎結合になった)ので、
 ログ機能クラスは別のプロジェクトでも流用できそうだ→良い設計
ログ表示先(画面とかファイルとか)を切り替えるのはログ機能クラスの担当とすればよい
マルチスレッドな時、ログが混ざらないようにするのもログ機能クラスの責務。

では次に考えるべきは
各ログを出す側 Form にログ機能インスタンスをどう渡せばよいか
ログ機能インスタンスに出力先をどう渡せばよいか
ということになる。

この例では
・ログ機能インスタンスはプログラム開始から終了までずっと存在する必要がある
→ class Program の所有物として実装してもよさそうだ
→ (普通 Form1 が close されたらプログラムが終了するので)Form1 の所有物として実装してもよさそうだ

・Form1 が内部で Form2(ログ出力したい人1) Form3(ログ出力したい人2) Form4(ログ出力先) を new するなら
→ログ機能インスタンスを new して Form4 を出力先としてプロパティに設定してやればいい
→ Form2 Form3 のログ機能プロパティにログ機能インスタンスを渡せばよい

ログ機能自体をそっくり入れ替えることまで考えると、ログ機能は interface としたらよいかな

オイラ流のコード例などを書いちゃってもいいんだけど一度自分で考えてみるといい。
あっと、オイラがサンプル書くとしたら C# になっちゃうのでその辺はよろしく。

引用返信 編集キー/
■80157 / inTopicNo.5)  Re[4]: フォームの操作をどこからでも行うには
□投稿者/ だんご (9回)-(2016/06/16(Thu) 19:26:32)
No80153 (774RR さん) に返信
> では次に考えるべきは
> 各ログを出す側 Form にログ機能インスタンスをどう渡せばよいか
> ログ機能インスタンスに出力先をどう渡せばよいか
> ということになる。

ここの部分が分かりとてもすっきりしました。
ログ機能も無事作成でき、マルチスレッドに対応、出力側とも分離させることができました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -