プロが教える店舗&オフィスのセキュリティ対策術

VB2008で親フォームから子フォームを開いたときの処理で

質問させて頂きます。
親フォームから子フォームを開いて、
子フォーム画面ロード時に、TreeViewにノードを追加する処理を行おうとするのですが、
ノードの追加ができません。

親フォームから子フォームの呼び出しの部分
Using frmAct As New form2
frmAct.ShowDialog()
end using
子フォームLoad処理
Private Sub F_Actresult_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call MP_hogeload() ←別のモジュールからサブルーチンを呼び出してノード処理を追加させる。
End Sub

外部サブルーチン
Public Sub MP_hogeload()
With form2
.trehoge.Nodes.Add("hoge")
end with
end sub

同じ子フォーム内に記述している場合は問題なく追加できています。

この開き方の場合、別のモジュールでノードを追加させる方法を探しています。

よろしくお願いいたします。

A 回答 (4件)

フォームオブジェクトを引数にして渡してあげましょう




Module Module1
  Public Sub MP_hogeload(ByVal frm As Form2)
    With frm
      .trehoge.Nodes.Add("標準モジュールで追加")
    End With
  End Sub
End Module


Public Class Form2
  Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    MP_hogeload(Me)
  End Sub
End Class
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
引数で渡すようにすれば出来るようになりました。
ただ、Public Sub MP_hogeload(ByVal frm As Form2)
という形では、共通性が損なわれるため
下記のようにしました。
ありがとうございました。

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using frmAct As New Form2
frmAct.ShowDialog()
End Using
End Sub
End Class
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MP_hogeload(Me.trehoge)

End Sub
End Class
Module Module1
Public Sub MP_hogeload(ByVal pi_form As TreeView)
pi_form.Nodes.Add("hoge")
End Sub
End Module

お礼日時:2010/04/21 12:22

通るすがるです。


なるほど、質問の意味が解りました。
実際やってみたんですけど、エラーにはならないですね!
ただ、treeviewには何も表示されませんから、モジュール上の
form2というメモリ上の領域は、生成したform2とは別の領域なのでは
ないでしょうか?

そもそも、モジュールというのはvb6プログラマのための残している
機能であって、オブジェクト指向の考え方ではないですよね!。
上記のように分割するのでしたらclass化するものだと思うのですけど。

またvb2005環境で新規追加するときの新しい項目の追加メニュー
またはテンプレートには存在してたと思いましたけどvb2008では、
そこから除去されておりおそらく、ゆくゆくはなくなる方向ではないかと
思います。(ここは、私個人の想像ですけど)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おっしゃる通り領域の違いが表示できない理由のようでした。
ありがとうございます。

お礼日時:2010/04/21 12:18

おはようございます。



Moduleを使いたいということですがこのプログラムを見る限り使う利点が見出せないのですが・・・

ちなみに補足説明に書いたコードで動きます。確認済みです。
エラーが出るのであればエラー名を御願いします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

エラーは特に出ていないです。
Moduleを使う理由は、ノード追加のロジックをほかの部分でも使用していて
共通化するためです。
自分のところではノードの追加がいまだに出来ない状態です。
何か設定の違いみたいなのが存在するのでしょうか?

お礼日時:2010/04/21 10:32

はじめまして、通るすがるです。


上記のコード 普通にできたよ?
親フォーム
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using frmAct As New Form2
frmAct.ShowDialog()
End Using

End Sub
End Class


子フォーム
 Public Class Form2

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MP_hogeload()
End Sub
Public Sub MP_hogeload()

trehoge.Nodes.Add("hoge")

End Sub

End Class
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
上記のは動きました。
自分のした質問は子フォームで
Public Sub MP_hogeload()
を宣言するのではなく、
モジュールを新たに作成して
宣言する方法です。
下のような形です。

親フォーム
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using frmAct As New Form2
frmAct.ShowDialog()
End Using
End Sub
End Class

子フォーム
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MP_hogeload()
End Sub
Public Sub MP_hogeload()
Me.trehoge.Nodes.Add("hoge")
End Sub
End Class

モジュール
Module Module1
Public Sub MP_hogeload()
With Form2
.trehoge.Nodes.Add("hoge")
End With
End Sub
End Module

という形です。
これだと動かないんです。

ちょっとわかりにくい書き方だったようで、
申し訳ありませんでした。
また回答いただけると幸いです。

お礼日時:2010/04/21 08:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!