- PR -

フォーム間の値渡し(DataSet)

投稿者投稿内容
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 2005-09-11 09:57
毎度質問ばかりで恐縮なのですが。
今回の質問はフォーム間の値渡しです。

フォームAでデータセットを生成し
そのデータセットをフォームBで使う場合は
標準モジュールでデータセットをPublic宣言し
グローバル変数のDataSetを使うという方法で
良いのでしょうか?

オブジェクト指向の本とかを読んでいると
グローバル変数の使用は×みたいなことを
書いていたので、グローバル変数を使わずに
できるのかと・・・頭を悩ませています。

もしそういう方法がありましたら
ご教示いただければ幸いです。
paupau
会議室デビュー日: 2005/08/24
投稿数: 13
投稿日時: 2005-09-11 10:45
フォームってWEBですか?
WINDOWSカナ?
WEBならセッションに入れて渡すとか。
WINDOWSならクラス間の受け渡しってイメージなのかもしれないけど
引数に値入れて参照渡しとかカナ?

モジュールは怖いから使いたくないですねw
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2005-09-11 10:47
フォームAからフォームBを開くのでしょうか?
それであれば、次の二通りが基本です。
1.フォームAからフォームBを開く時に、フォームBへデータセットを渡す。
2.フォームBからフォームAのデータセットを参照する。ただし、フォームBが開いた時にまだフォームAが閉じていないことが条件。

以上が基本ですが、渡す値をクラスや構造体にセットして、それをフォームBに渡すこともあります。これは渡す数が多い場合や、フォームAのUIにとらわれないといったメリットがあります。ちょうど、パソコンから機械へ、制御のためのデータを受け渡すようなイメージです。

ではなくて、フォームBはフォームAとは全く無関係のタイミングで開くのでしょうか?
そうであれば、
データセットや上で述べたクラスや構造体を、どこかに保持しなければなりません。この場合は、どこかstaticな変数に保持する必要があります。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-09-11 11:19
WindowsFormsかWebFormsかは大きな違いがあります。
まずはそれを書きましょう。

OSやVisualStudioのバージョンも書きましょう。

引用:

フォームAでデータセットを生成し
そのデータセットをフォームBで使う場合は
標準モジュールでデータセットをPublic宣言し
グローバル変数のDataSetを使うという方法で
良いのでしょうか?


だめです。

WindowsFormsだとプログラムがきたなくなります。
WebFormsだと運用時に致命的な状況になるかもしれません。

引用:

オブジェクト指向の本とかを読んでいると
グローバル変数の使用は×みたいなことを
書いていたので、



オブジェクト指向の問題と、ネイティブリソースであることの問題があります。
データベースリソースはDisposeしなければいけませんが標準モジュールにするとその責任を担当する場所があいまいになりバグ・運用時の障害を誘発します。

なぜ×なのかについてはバニラミントさん自身でもさらに熟考することをお勧めします。


引用:

グローバル変数を使わずに
できるのかと・・・頭を悩ませています。



できます。

案1.フォームAからフォームBを呼び出すときに引数にDataSetを使う

案2.フォームAのDataSetオブジェクトを取得するpublicプロパティを作る

案3.フォームAとフォームBを呼び出す・管理するコントローラクラスを用意して、そこからフォームの表示、データの割り当てを行う。

案4.ドキュメントを保持するシングルトンなクラスを作って全体の情報を一元管理する。WebではSessionになるけど、これにデータセットを入れるのはお勧めしません。

案5.フォーム毎にデータセットを作る

他にもあるだろうけど思いついたものだけ。

どういう方法が良いかは場合によります。

_________________
たつごろー
codeseek
こみゅぷらす
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 2005-09-11 11:34
みなさま返答ありがとうございました。
フォームと言えばWindowsFormだとばかりと
勝手に思っていまして><
説明不足ですみませんでした。

trapemiyaさんの仰るとおりWindowsFormで
フォームAからフォームBを開く時に
DataSetを渡したいと思ってます。

>1.フォームAからフォームBを開く時に、フォームBへデータセットを渡す。

>案1.フォームAからフォームBを呼び出すときに引数にDataSetを使う
とは同じことだと思うのですが
フォームを開くときは、私が参考にしている書籍では
--------------------
Dim F2 As New Form2
F1 = Me
F2.Show()
-------------------
という風に開くと書いてあるのですが
このF2.Show()の時に引数を書くのでしょうか・・・・?


[ メッセージ編集済み 編集者: バニラミント 編集日時 2005-09-11 11:35 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-09-11 11:54
機能するか否かという意味なら、Public変数に格納して、これ経由で渡しても機能しますよ。ただ、設計として汚くて、保守性が悪いってだけです。

ではどのようにすれば良いのか?それは設計による所だから、なんとも言いようが無いです。データやビジネスロジックと、表示に関する部分を、それぞれ分離させるのがセオリーです。したがってWindowsFormsがDataSetを変数として持っている時点で、既に行儀の悪いプログラムと言えます。

一度、オブジェクト思考設計に関する本と、デザインパターン関する本を読んでみることを強くお勧めします。

引用:

Dim F2 As New Form2
F1 = Me
F2.Show()


Showメソッドをオーバーライトして引数として渡しても良いと思いますし、引数を持つコンストラクタを作成して引数として渡しても良いでしょう。FormAとFormBが親子関係になるなら、DataSetを直接参照させずに、Parentを使って参照しても良いでしょう。

#ところで、F1 = Meって何者・・・
バニラミント
ベテラン
会議室デビュー日: 2005/05/27
投稿数: 58
投稿日時: 2005-09-11 13:26
貴重なレスありがとうございました。
言語の習得をあせるばかり基本を
とばして勉強をはじめていました><
もう少しオブジェクト指向に関する書籍を
読んでみたいと思います
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2006-09-11 13:20
koaraと申します。
古いスレッド掘り返してすみません。

WindowsXP(PRO) SP2
VisualStudio VB.NET 2003
で開発しております。

引用:

データやビジネスロジックと、表示に関する部分を、それぞれ分離させるのがセオリーです。したがってWindowsFormsがDataSetを変数として持っている時点で、既に行儀の悪いプログラムと言えます。


という甕星様の書込みを読み、
自分のソースがまったくその通りで行儀の悪いプログラムだと気付きました。

標準モジュールは汎用処理を書く以外は使ったことが無く、
ほぼWindowsFormsに処理を書いています。

内製ソフトの開発が業務のせいもあり、これで問題にならず通ってしまっております。
先輩、後輩みんながそういったソースに慣れたしまっているのでそれではいけないと思いました。

どのように設計したら良いか一度基礎から勉強したいと思います、
・どういう設計をしたら良いかが分かる良書(サンプルが載っているもの)
・良いサンプルで意図を読み取れというものでも結構です。
勉強するのに良い書籍などありましたら紹介して頂けませんか。


具体的に自分の分かっていない点は
・どこに何を書くべきか曖昧です。
(WindowsForms,モジュール,モジュールの切り分け、モジュールの名前の付け方)
・プログラムをどう組み立てたらよいかセオリーを知りません。
(なぜそうしなければいけないか、又はそうした方がいいのかを知りたいです。)

スキルアップ/キャリアアップ(JOB@IT)