tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル存在しないフォーム名を使う
記事No4698
投稿日: 2006/12/18(Mon) 16:01
投稿者フウセンウナギ
XP SP2 VB2005 です。

プロジェクトの中に存在しないフォーム名(frmXXX)を記述します。
すると「名前'frmXXX'は宣言されていません」とエラーが出ます。
そこでOption ExplicitをOffにしてみたのですが、それでもエラーが消えません。
何とかこのエラーをなくすことはできないでしょうか?
VB6ではエラーにはならなかったのですが・・・

なぜこんなことをするかというと、複数のプロジェクトで共通して使用するフォームが
いくつかあり、そのフォームを呼び出す部分を別の共通モジュールにまとめて記述しています。
共通使用フォームは使用するプロジェクトのみにセットし、共通モジュールはすべての
プロジェクトにセットしているためです。

[ツリー表示へ]
タイトルRe: 存在しないフォーム名を使う
記事No4699
投稿日: 2006/12/18(Mon) 16:54
投稿者大吉末吉
> XP SP2 VB2005 です。
>
> プロジェクトの中に存在しないフォーム名(frmXXX)を記述します。
> すると「名前'frmXXX'は宣言されていません」とエラーが出ます。
> そこでOption ExplicitをOffにしてみたのですが、それでもエラーが消えません。

どうやら、「未定義変数.XXX」の様な記述があると、Option ExplicitをOffにしても駄目みたいで
すね。

例えば、
---------------------------
frmXXX.Show()
---------------------------
とか・・・

> 何とかこのエラーをなくすことはできないでしょうか?
例えば、
---------------------------
Dim F As Form
F = frmXXX
F.Show()
---------------------------

にすると、とりあえず、コンパイルは通るみたいですが・・・

[ツリー表示へ]
タイトルRe: 存在しないフォーム名を使う
記事No4700
投稿日: 2006/12/18(Mon) 17:11
投稿者魔界の仮面弁士
> そこでOption ExplicitをOffにしてみたのですが、それでもエラーが消えません。

Option Explicit を Off にしたとしても、
  Dim X As Object = New Form2()
のような、『型名』としての frmXXX は、コンパイルエラー[BC30002]として処理されます。


回避できる可能性があるのは、『変数名』としての frmXXX の方ですが、それにしても、
  Form2 = Form2
  Form2.ShowDialog()
  Form3 = New Form()
  Form3.ShowDialog()
  Form4 = Nothing
  Form4.ShowDialog()
のような、オブジェクトの代入操作を伴っているとか、
  TypeName(Form5)
  Form5.ShowDialog()
のように、他のメソッドへの呼び出しに利用しているとか、
  Dim Form6
  Form6.ShowDialog()
のように、明示的な変数宣言が行われていた場合と限られます。
# コンパイラのバージョン次第では、警告[BC42104]として扱われる可能性もありますが…。

そして、そういった処理無しに、単に
  Form6.ShowDialog()
とだけ書いてあるような場合には、未定義変数扱いでエラー[BC30451]となるでしょう。


> 何とかこのエラーをなくすことはできないでしょうか?
問題があるからこそのエラー or 警告なわけで、それを無視すべきではないと思いますよ。


> なぜこんなことをするかというと、複数のプロジェクトで共通して使用するフォームが
> いくつかあり、そのフォームを呼び出す部分を別の共通モジュールにまとめて記述しています。
今更かも知れませんが、それがVB6であれ、.NET であれ、本来は設計から見直すべきでしょう。
個々のクラスやモジュールは、特定のフォームに、むやみに依存すべきでは無いと思いますし。
(かといって、依存してはいけない、という意味ではありませんが)


> 共通使用フォームは使用するプロジェクトのみにセットし、共通モジュールはすべての
> プロジェクトにセットしているためです。
共通モジュールが参照するのは、「どのプロジェクトからも参照されるフォーム」にして、
プロジェクト固有の処理は、別パーツとして分割して管理すれば、問題ないかと。

[ツリー表示へ]
タイトルRe^2: 存在しないフォーム名を使う
記事No4701
投稿日: 2006/12/18(Mon) 17:29
投稿者フウセンウナギ
> > そこでOption ExplicitをOffにしてみたのですが、それでもエラーが消えません。
>
> Option Explicit を Off にしたとしても、
>   Dim X As Object = New Form2()
> のような、『型名』としての frmXXX は、コンパイルエラー[BC30002]として処理されます。
>
>
> 回避できる可能性があるのは、『変数名』としての frmXXX の方ですが、それにしても、
>   Form2 = Form2
>   Form2.ShowDialog()
>   Form3 = New Form()
>   Form3.ShowDialog()
>   Form4 = Nothing
>   Form4.ShowDialog()
> のような、オブジェクトの代入操作を伴っているとか、
>   TypeName(Form5)
>   Form5.ShowDialog()
> のように、他のメソッドへの呼び出しに利用しているとか、
>   Dim Form6
>   Form6.ShowDialog()
> のように、明示的な変数宣言が行われていた場合と限られます。
> # コンパイラのバージョン次第では、警告[BC42104]として扱われる可能性もありますが…。
>
> そして、そういった処理無しに、単に
>   Form6.ShowDialog()
> とだけ書いてあるような場合には、未定義変数扱いでエラー[BC30451]となるでしょう。
>
>
> > 何とかこのエラーをなくすことはできないでしょうか?
> 問題があるからこそのエラー or 警告なわけで、それを無視すべきではないと思いますよ。
>
>
> > なぜこんなことをするかというと、複数のプロジェクトで共通して使用するフォームが
> > いくつかあり、そのフォームを呼び出す部分を別の共通モジュールにまとめて記述しています。
> 今更かも知れませんが、それがVB6であれ、.NET であれ、本来は設計から見直すべきでしょう。
> 個々のクラスやモジュールは、特定のフォームに、むやみに依存すべきでは無いと思いますし。
> (かといって、依存してはいけない、という意味ではありませんが)
>
>
> > 共通使用フォームは使用するプロジェクトのみにセットし、共通モジュールはすべての
> > プロジェクトにセットしているためです。
> 共通モジュールが参照するのは、「どのプロジェクトからも参照されるフォーム」にして、
> プロジェクト固有の処理は、別パーツとして分割して管理すれば、問題ないかと。


大吉末吉さんのおっしゃるようにすればエラーは出ないのですが、フォームの呼び出しを
Showからではなく、その前に別途フォーム固有のモジュールを呼んでおりそこで再びエラーに
なってしまいました。

フォーム呼び出し前にはどうしても前処理が必要なので、いちいちプロジェクトが
変わるたびに記述するのは面倒です。
とりあえず、フォームもすべてのプロジェクトにセットするようにします。
どうもありがとうです。

[ツリー表示へ]