- PR -

Form1→(複数)Form2を開き、Form1から全Form2を閉じる

1
投稿者投稿内容
domingo
会議室デビュー日: 2006/01/28
投稿数: 5
投稿日時: 2006-01-28 15:00
初めて投稿します。
初心者ですので基本的な質問だと思いますが、よろしくお願いいたします。

VB.NETにおいて、
Form1での検索結果において選択された行の再詳細情報をForm2にて表示します。
複数の再詳細情報を閲覧する必要があるため、
モードレスにて複数のForm2を開きますが、
別の検索が行われたときには、開いた全てのForm2を閉じる、
という動作にしたいのですが、どうすればよいのでしょうか。

ご教授の程お願いいたします。

[ メッセージ編集済み 編集者: domingo 編集日時 2006-01-28 15:02 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-28 15:04
開いた Form2 の参照をArrayList等に保持しておいて閉じます。

_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-28 19:59
引用:

domingoさんの書き込み (2006-01-28 15:00) より:

モードレスにて複数のForm2を開きますが、
別の検索が行われたときには、開いた全てのForm2を閉じる、
という動作にしたいのですが、どうすればよいのでしょうか。


呼び出している時点で Form1 は親になるので、Form1 で管理します。
開ける時に参照を入れて管理するだけです。

VB6 みたいに考えるのであれば以下のリンクがそのものかと思います。

  Visual Basic .NET で Forms コレクションを作成する方法

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
domingo
会議室デビュー日: 2006/01/28
投稿数: 5
投稿日時: 2006-02-13 19:37
囚人さん、じゃんぬめっとさん、ありがとうございました。

とはいえ、きっとお二方のご想像を超える初心者でして、
ArrayListや、じゃんぬめっとさんご提案の
  Visual Basic .NET で Forms コレクションを作成する方法
や、別スレにあったJittaさんの
http://quick-tips.hp.infoseek.co.jp/vs.net/sample/index.html
(VCの持ち合わせがなく、表示不可)
などを試してみましたが、実のところいまだ解決に至っておりません。

囚人さんもじゃんぬめっとさんも、
『Form2の参照をForm1で管理する』
とおっしゃっていますが、その方法が良く分かりません。

分からないなりにまず試してみたコードは以下の通りです。

Form1の宣言部において
Private frm2_(10) As Form2
Private arrylst As ArrayList
Private intFrmNum As Integer

Form2を開くコードを
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
frm2_(intFrmNum).Show()
arrylst.Add(frm2_(intFrmNum))
intFrmNum = intFrmNum + 1
End Sub

閉じるコードを
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
For i = 0 To intFrmNum
arrylst.Remove(frm2_(i))
Next
End Sub
としましたが、
(Closeの仕方がわかりませんでした)

まずForm2を開こうとすると
『オブジェクト参照がオブジェクト インスタンスに設定されていません。』
というエラーになります。

というわけで、現在は力技(?)で
Form1の宣言部において
Private frm2_1 As New Form2
Private frm2_2 As New Form2
Private frm2_3 As New Form2
Private frm2_4 As New Form2
Private frm2_5 As New Form2

Form2を開くコードを
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Select Case intFrmDNum
Case 0
frm2_1.Show()
intFrmNum = intFrmNum + 1
Case 1
frm2_2.Show()
intFrmNum = intFrmNum + 1
Case 2
frm2_3.Show()
intFrmNum = intFrmNum + 1
Case 3
frm2_4.Show()
intFrmNum = intFrmNum + 1
Case 4
frm2_5.Show()
intFrmNum = intFrmNum + 1
Case Else
MsgBox("同時表示は5画面までです。")
End Select
End Sub

閉じるコードを
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Select Case intFrmDNum
Case 0
frm2_1.Close()
Case 1
frm2_1.Close()
frm2_2.Close()
Case 2
frm2_1.Close()
frm2_2.Close()
frm2_3.Close()
Case 3
frm2_1.Close()
frm2_2.Close()
frm2_3.Close()
frm2_4.Close()
Case 4
frm2_1.Close()
frm2_2.Close()
frm2_3.Close()
frm2_4.Close()
frm2_5.Close()
End Select
intFrmNum = 0
End Sub
としています。

とりあえずは動きますが、全く醜いので、やはりお二方のおっしゃる
『Form2の参照をForm1で管理する』
を美しく実装したいと切に願う次第です。

大変お手数とは思いますが、よろしくご教授の程お願いいたします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-02-13 20:08
なるほど、確かに"ご想像を超える初心者"のようですね。
初めはだれでもそうです。

で、ソースですが参考にしてください。
Form1のソースです。
コード:
Private form2Arr As ArrayList = New ArrayList

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim f As Form2 = New Form2
    f.Show()

    form2Arr.Add(f)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    For Each f As Form2 In form2Arr
        f.Close()
    Next
End Sub


Button1のClickでForm2を開きます。
Button2のClickで全て閉じます。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-13 21:16
Form2 だけしか管理しないのであれば、厳密な型を使ったほうがいいですね。
キャスト、遅延バインディングもなるべく避けるに限ります。

質問者さんのソースに加えるとするならば、
ArrayList から Remove する場所で Close するだけですね。

何故わからないのだろうと思ったのですが、キャストがわからなかったのかな?
いや、それにしても frm2 の配列があったり、ArrayList があったりと、
どっちで管理したいのか、かなりの謎ではあるんですが...

配列の長さを決め打ちするのは良くないですね。
動的に配列を確保して、動的に長さを取得しましょう。
intFrmNum は必要ないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-13 22:22
引用:

domingoさんの書き込み (2006-02-13 19:37) より:

や、別スレにあったJittaさんの
http://quick-tips.hp.infoseek.co.jp/vs.net/sample/index.html
(VCの持ち合わせがなく、表示不可)
などを試してみましたが、実のところいまだ解決に至っておりません。


えっと、、、.cs ファイルをメモ帳で見る、という手もあります。

C# から VB.NET への変換は、そういうことをしてくれるサイトがあるそうです。
domingo
会議室デビュー日: 2006/01/28
投稿数: 5
投稿日時: 2006-02-14 11:06
素晴らしい、希望通りの実行が実現しました!!
一郎さん、心より感謝します。
じゃんぬめっとさんも、再度御助言頂き、ありがとうございました。
Jittaさん、仰るようなツールがあるとは知りませんでした。
http://www.masahiko.info/it/archives/000388.html
活用させていただきます。ありがとうございます。

frm2を配列にしていたのは、複数開き、全てを閉じるので、
個別のfrm2を識別するために配列にしなくてはならないと思っていたからです。

したがって、一番驚いたのは、一郎さんに頂いたコードの通り、
配列にしていなくても、単純にArrayListに格納していくだけでOK、という点です。

一郎さんの「初めはだれでもそうです。 」の言葉に甘えることなく、
ステップアップに全力を尽くして行きたいと思います。

では、またの機会がございましたら、懲りずにお付き合い頂ければ幸いです。

御協力いただいた皆様、改めて感謝いたします。
そして、このような有用な場を御提供いただいているITMedia様にも感謝です。

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

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