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

他フォームの関数呼出について

環境/言語:[WindowsXP,NET Framework1.1]
分類:[.NET]

いつも参考にさせていただいてます。

可能かどうかを聞きたいのですが、
VB6の下記コードをそのまま使おうとしたらエラーになってしました。

標準モジュールで「objNextForm As Form」と宣言します。
この「objNextForm」に次に表示するフォーム名を格納して、
そのフォーム内の関数を呼び出すことは可能でしょうか?

----------------------------------------------
objNextForm = "Form2"
Call objNextForm.fncMsgBox
 ↑
これがエラーになります
----------------------------------------------

「Form2」には「fncMsgBox」という関数をPublicで宣言してあります。

よろしくお願いします。
> VB6の下記コードをそのまま使おうとしたらエラーになってしました。
それは VB6 であってもエラーになると思いますが…。

VB6 で動作させるなら、
> objNextForm = "Form2"
ではなく、
 Set objNextForm = Form2
ですよね。文字列を入れてしまってはマズイでしょう。

VB.NETでも同様。フォーム名ではなく、フォームのインスタンスを
渡すようにすれば大丈夫でしょう。


> Call objNextForm.fncMsgBox
objNextForm というのは、標準の Form 型として宣言されたのですよね?
しかし、fncMsgBox というのは、nam さんが独自に定義したメソッドです。
(標準の Form クラスには、fncMsgBox というメソッドはありません)

ですから、objNextForm に適切なインスタンスがセットしてあったとしても、
Option Strict のモードによっては、呼び出す事ができない可能性があります。

この場合は、DirectCastを用いて、固有のフォームクラスに変換するか、
もしくは、fncMsgBox を実装した Interface を用意すれば OK でしょう。


> この「objNextForm」に次に表示するフォーム名を格納して、
> そのフォーム内の関数を呼び出すことは可能でしょうか?
先にも書きましたが、この場合は「フォーム名」ではなく、
「インスタンス」を渡せば解決できそうな気がします。
魔界の仮面弁士様ありがとうございます。

> VB6 で動作させるなら、
> > objNextForm = "Form2"
> ではなく、
>  Set objNextForm = Form2
> ですよね。文字列を入れてしまってはマズイでしょう。

そうですね、SETを使ってました。

> VB.NETでも同様。フォーム名ではなく、フォームのインスタンスを
> 渡すようにすれば大丈夫でしょう。

インスタンスを渡すというのはこういうことでしょうか?
勉強不足で申し訳ありません。

Dim objForm As New Form
Dim objNext As New Form2

objForm = objNext

というような感じでしょうか?

> ですから、objNextForm に適切なインスタンスがセットしてあったとしても、
> Option Strict のモードによっては、呼び出す事ができない可能性があります。
>
> この場合は、DirectCastを用いて、固有のフォームクラスに変換するか、
> もしくは、fncMsgBox を実装した Interface を用意すれば OK でしょう。

MDIを使っていて、親フォームから子フォームを制御するところで
これを以前使っていたのですが、やはり変更が必要なのでしょうか?

更新ボタン押す→親フォームの更新イベント→子フォームの更新イベント
→親フォームの更新後イベント→子フォームの更新後イベント
という感じで使ってます。
こんにちは、じゃんぬ です。

■No13416に返信(namさんの記事)
> インスタンスを渡すというのはこういうことでしょうか?
>
> Dim objForm As New Form
> Dim objNext As New Form2
>
> objForm = objNext
>
> というような感じでしょうか?

これ、ちょっと意味がないのではないでしょうか?
objNext をそのまま使えば良いのに、
System.Windows.Forms.Form にアップキャストする意味がわかりません。

それと、新しいインスタンスは、現在表示されているインスタンスとは別物である
という概念がないように思えますが、インスタンスとは何かは理解されてますでしょうか?

> MDIを使っていて、親フォームから子フォームを制御するところで
> これを以前使っていたのですが、やはり変更が必要なのでしょうか?

MDI 親フォームで子フォームは管理できますし、すべきです。
じゃんぬ様ありがとうございます。
>
> ■No13416に返信(namさんの記事)
>>インスタンスを渡すというのはこういうことでしょうか?
>>
>>Dim objForm As New Form
>>Dim objNext As New Form2
>>
>>objForm = objNext
>>
>>というような感じでしょうか?
>
> これ、ちょっと意味がないのではないでしょうか?
> objNext をそのまま使えば良いのに、
> System.Windows.Forms.Form にアップキャストする意味がわかりません。

これはインスタンスを渡すって言うのはってことで書いてます。
実際は新しく表示するフォームはフォーム型の変数に格納してます。
なので「Dim objNext As New Form2」という書き方はできないです。


>
> それと、新しいインスタンスは、現在表示されているインスタンスとは別物である
> という概念がないように思えますが、インスタンスとは何かは理解されてますでしょうか?

.NETをやって間もないものでインスタンスがどういうものか
はっきりとはわかっていません。

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