DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数のフォームを引数で受け取る方法

環境/言語:[VB.NET]
分類:[.NET]

初めてご質問させて頂きます。
よろしくお願い致します。


VB.NETでWindowsアプリケーションを作成しております。

実現したいことは以下のようなことです。

複数の親画面から呼ばれる1つの子画面があり、
子画面の値を親画面のプロパティを介して親画面に渡す場合の
親画面のフォームの型の宣言の仕方がわからず困っています。

具体的には、親画面から子画面を開く時に、
SubFrm.ShowDialog(Me)
というように引数で親画面自身を渡し、

子画面のSub Newで
Public Sub New(ByVal pForm As ******)


End Sub

このように親画面を引数として取得したいのですが、
複数の画面から呼ぶので「******」の部分を固定では
指定することができず困っています。

皆様はこのような場合、どういう風に対処されているのでしょうか。
ご指導の程よろしくお願い致します。


※親画面から子画面の値を取得するところは
当サイトの「別のフォームのデータを取得、設定する」
(http://dobon.net/vb/dotnet/form/accessanotherformdata.html)
を参考にさせて頂き実現することができました。
大前提としてフォームを渡す必要性が無いように作ります。
フォームを渡さないといけないというのは、内部ロジックとの切り分けが成功していないということです。

その上でいかのようにすれば実現可能です。

'呼び出されるほう
public sub Init( byval pFormA as FormA )
public sub Init( byval pFormB as FormB )


'呼び出す側
Dim disp as FormC = new FormC()
disp.Init(me)
disp.ShowDialog()
disp.Dispose

------------------------------------------------------
中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP
http://naka.wankuma.com/
http://naka.wankuma.com/blog/
naka@wankuma.com
2005/02/14(Mon) 13:26:05 編集(投稿者)

じゃんぬねっと です。
すいません、また中さんとかぶってしまいました。

■No9117に返信(yuuさんの記事)
> このように親画面を引数として取得したいのですが、
> 複数の画面から呼ぶので「******」の部分を固定では
> 指定することができず困っています。

オーバロードで解決できませんか?

> 皆様はこのような場合、どういう風に対処されているのでしょうか。
> ご指導の程よろしくお願い致します。

最近、同じことを連呼してますが、そもそも呼び出し側のインスタンスを渡してしまっては、
汎用的でなくなり、その「仕様上の親」に特化してしまうのはお判りでしょうか?
何故「呼び出し側のインスタンス」自体が必要になるのかお聞かせ願えませんでしょうか?

呼び出し側のインスタンスで必要な情報があるのならば、
その必要な情報を、渡せば良いのですから、私はこのような場合の対処は存じません。
中様、じゃんぬねっと様

ご返答ありがとうございました。

わからないことが多くて申し訳ありません。

>何故「呼び出し側のインスタンス」自体が必要になるのかお聞かせ願えませんでしょうか?

親画面のボタンをクリック
 ↓
子画面を開く
 ↓
子画面のボタンをクリック
 ↓
子画面の値を親画面の(プロパティを介して)テキストボックスに表示

上記のことを実現するために、以下のようにするのは間違いでしょうか?
(とりあえず、複数画面から呼び出されることを考えない場合です)

【親画面】
------------------------------------------------
private FormA as FormA

Public Sub New(byval pFormA as FormA)
FormA = pFormA
End Sub

'ボタンクリック時処理。
'子画面上のテキストボックスの値を親画面のプロパティにセット
FormA.PROPERTY_A = Me.Textbox1.text
------------------------------------------------

【子画面】
------------------------------------------------
ボタンクリック時処理。
Dim SubFrm As New FormB(Me)
SubFrm.ShowDialog()

 ※インスタンス化する時に「Me」を引数で渡すのと、
  中様のように
  disp.Init(me)
  として、メソッドの引数として渡すのと、
  又、私が先ほど書きましたように
  ShowDialogする時に引数として渡すのと、
  何か違いがあるのでしょうか?


'子画面から値を取得
Me.textbox1 = Me.PROPERTY_A
------------------------------------------------

このやり方が間違っていないとすれば、
お二方から教えて頂いたように
オーバーロードを使って実現しようと思います。
ただ、その場合、引数を受け取るprivate変数の宣言は
やはり親画面の数だけ行わないといけない、
そうすると、変数がそれだけ増えるということで
認識は正しいでしょうか?


素人の質問で申し訳ありません。
どうぞよろしくお願い致します。
こんにちは中です。
考え方だけです。
親のことは親がする、子の事は子がすると考えてください。

親画面のボタンをクリック
 ↓
子画面を開く
 ↓
子画面のボタンをクリック
 ↓
子画面が終了する
 ↓
子画面の結果を親が取得する
 ↓
親が自発的に親の内容を変更する。

これが筋です。
中様

ご返信ありがとうございます。

> 子画面が終了する
>  ↓
> 子画面の結果を親が取得する

ここの実現方法を色々考え以下のようなこともしてみました。

(親画面ボタンクリック時)
別のクラスAをインスタンス化
 ↓
子画面をインスタンス化する時にクラスAを引数として渡す
 ↓
(子画面ボタンクリック時)
引数で受け取ったクラスAのプロパティに値をセットし、子画面を終了
 ↓
クラスAのプロパティから値を取得し、親画面に表示する

このようにすれば親画面自身を引数として渡すことなく実現できたのですが、
(このやり方は間違っていないでしょうか?)
一点問題がありまして、「子画面から値を取得する」ことを子画面を閉じることなく
連続して行いたいのです。
モーダルで子画面を開いた場合、上記のようなことを実現できず、
子画面から親画面を操作することを考えてしまいました。

タイトルとは違った質問になってしまいますが、
子画面を閉じることなく親画面へ値を渡す方法はありますでしょうか?

どうぞよろしくお願い致します。
こんにちは中です。

まぁいいと思いますが、ダイアログでキャンセルされたときに値を反映しないなんていう画面が普通ですので、SetとGetは分けて、Getでは新しいクラスAを返すなんていうつくりのほうが望ましいでしょうね。
■No9124に返信(yuuさんの記事)
> 一点問題がありまして、「子画面から値を取得する」ことを子画面を閉じることなく
> 連続して行いたいのです。
> モーダルで子画面を開いた場合、上記のようなことを実現できず、
> 子画面から親画面を操作することを考えてしまいました。
1. 子画面の方に「適用」イベントを作って、
2. 各親画面が、その子画面を ShowDialog する前に、イベントハンドラを登録。
3. イベントハンドラは子画面から内容を読み取ってその内容を反映する。
というのでいかが?
>一点問題がありまして、「子画面から値を取得する」ことを子画面を閉じることなく
>連続して行いたいのです。

横から失礼します。
yuu さん、それでしたら、私も「通りすがりのもですが」さんのように イベント処理で値の受け渡しを行っています。
コードがあるのでのせておきます、こんな感じです。

【親画面】
------------------------------------------------
Private WithEvents FormA As New FormA

Private Sub FormA_OKClick(ByVal Text As String) Handles FormA.OKClick
TextBox1.Text = Text
End Sub
------------------------------------------------

【子画面】
------------------------------------------------
Public Event OKClick(ByVal Text As String)

Private Sub ButtonOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOK.Click
RaiseEvent OKClick("Clickしたよ")
End Sub
中様
通りすがりのもですが様
ポン様

ご教授頂きありがとうございます。
大変助かります。

>Private WithEvents FormA As New FormA
>Public Event OKClick(ByVal Text As String)
>RaiseEvent OKClick("Clickしたよ")

経験が浅く、この辺りのことがまだ「???」状態ですので、
今から調べて試してみます。

理解し、うまくできましたら、また報告させて頂きます。

本当にありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板