VB : 6.0
FormShow.Bas のフォームを立ち上げる標準モジュールがあるのですが、
あるプロジェクトでは、Form1 は追加していて Form2 は追加していない
プロジェクトでコンパイルを掛けると、
Form2.Show の文で「変数が定義されていません。」とエラーが
返って来ます。
確かに Form2 はどこにも無いのでエラーになるのは分かるのですが、
どのように回避すればいいのでしょうか?
起動フォームの各プロシージャに、フォームを引数にしてしまう方法も
あるかと思いますが、できれば、違う方法がいいなと思い、質問させて頂きました。
宜しくお願いします。
<FormShow.Bas>
Public Sub gfncShowForm1()
Form1.Show
End Public
Public Sub gfncShowForm2()
Form2.Show
End Public
>標準モジュール
『標準モジュール』というのは、いわゆる、
各プロジェクト間で共通に使用している標準モジュールという意味ではなく
ファイルの追加のときに問われる標準モジュール(*.bas)のことですよね?
なぜ?Form2がないのにForm2.Showが必要なのか?
その辺の説明を詳細にされては?
>『標準モジュール』というのは、いわゆる、
>各プロジェクト間で共通に使用している標準モジュールという意味ではなく
>ファイルの追加のときに問われる標準モジュール(*.bas)のことですよね?
両方一緒に捉えて私は「標準モジュール」と認識しているのですが、、、^_^;
違っているのかなぁ〜。
みんなで使えるようにした(共通)のコード群。と言いますか。。。
>なぜ?Form2がないのにForm2.Showが必要なのか?
>その辺の説明を詳細にされては?
何と言いますか。
Aプロジェクト(VBP)では、gfncShowForm1関数を利用してForm1起動する場面がある。
Bプロジェクト(VBP)では、gfncShowForm2関数を利用してForm2起動する場面がある。
Cプロジェクト(VBP)では、gfncShowForm1関数を利用してForm1起動する場面があるり、
gfncShowForm2関数を利用してForm2起動する場面もある。
で、各プロジェクトに FormShow.Bas を追加しておけば、関数を投げるだけで利用できる。
※ すみません。例では単なるShowをしているだけですが、本当は複雑な処理をしています。^_^;
Form2が無いと起動しないという点だけみると、共通部品としてみるには、
若干、汎用性に欠けますよね。モジュールの設計を見直した方が良いかも。
本当に共通で使う部分(他のオブジェクトへの依存度が低いもの)と、
特定のプロジェクトでしか使わない部分とは、モジュールをわけるべきでは。
一応、Forms.Add メソッドで対応すると言う手もありますが、
Dim F As Form
Set F = Forms.Add("Form2")
F.Show
この場合、Form2.Show で呼び出される物とは、内容は同じですが
インスタンスは異なる事になります。このため、現在の開発スタイルが、
VB6で暗黙に作成されるフォームを利用した開発手法になっている場合、
見つけにくいバグを埋め込む可能性がありますので、避けた方が良いかと。
>みんなで使えるようにした(共通)のコード群
そうゆう位置づけでしたら、Dentalさんがいうとおり、
Form2という固定の名称のオブジェクトは使うべきではないですね。
標準モジュール内で処理が完結できるよう再設計が必要かと
簡単に修正するとしたら、
件の関数は、指定されたフォームを起動する。
というようにし、引数化してオプショナルをつけておくとか?
いろいろ手段はあるはずです。
>みんなで使えるようにした(共通)のコード群
そうゆう位置づけでしたら、Dentalさんがいうとおり、
Form2という固定の名称のオブジェクトは使うべきではないですね。
標準モジュール内で処理が完結できるよう再設計が必要かと
簡単に修正するとしたら、
件の関数は、指定されたフォームを起動する。
というようにし、引数化してオプショナルをつけておくとか?
いろいろ手段はあるはずです。
いなさん、Dentalさん、お付き合いありがとうございます。
お二方のご助言とログから<■ Form型のデータに引数を渡すには?>
http://madia.world.coocan.jp/vb/vb_bbs2/200309_03090039.html
http://madia.world.coocan.jp/vb/vb_bbs2/200309_03090076.html
参考してフォームをダイレクトで指定は無理っぽいことが分かりました。
小出しで申し訳ないですが、実は、Form.Show している前に
プロパティを介して値を送ってあげています。
Set F = Forms.Add("Form2")
F.KykGrp = gfncCLng(stcTori.GrpCode)
F.ToriKbn = gfncCLng(stcTori.ToriKbn)
'フォーム表示
F.Show
で確かにエラーは発生しないのですが、
この命令(フォームコレクションに追加すること)で Form_Load イベントが
走ってしまうんですね。(^^)
これではプロパティに値が入らないんです。(^^)
(当たり前ですね。ロードした後ですんでね。)
それで、やはりフォームオブジェクトを引数に持って対応しようと
するのですが、普通に引数を作ってその引数でShowしてあげるとちゃんと
起動されます。
>簡単に修正するとしたら、
>件の関数は、指定されたフォームを起動する。
>というようにし、引数化してオプショナルをつけておくとか?
とOptional付加した引数で規定値と申しますか、
Optional ByVal frm As Form = XXXXXX
XXXXXX の部分を教えて頂けませんでしょうか。
宜しくお願いします。<(_ _)>
今客先で、Air-H"からでして、
確か引数を省略したとき、IsMissing??だったかなぁ〜
が使えませんでしたっけ?
キーワードは、オプショナルとミッシングです、
それでヘルプで検索してみてください。
規定値って必ず指定しなければいけなかったんでしたっけ?
・Function foo(Optional ByVal hoge As Form = Nothing)
というのは想像できるんですけど、
・Function foo(Optional ByVal hoge As Form = 0)
などと…ヘンなのを初期値にできるみたいです(orz
で、TypeName()で見てみるとNothingでした。
※というかMSDNに書いて(ry
いなさん、ガッさん、ご回答ありがとうございます。
>今客先で、Air-H"からでして、
お忙しい所からご回答頂いているとは。(^^)
お疲れ様です。
すみません。ちょっと質問の仕方が悪かったです。^_^;
普通の規定値だと Nothing ということは知っていたのですが、
・gfncShowForm1プロシージャだと 起動 Form1 フォームと決まっていますし、
・gfncShowForm2プロシージャだと 起動 Form2 フォームと決まっていますので
例えば、Optional ByVal frm As Form = Form1 という風に規定で特定した
フォームをセットできないなかぁ〜と思ったのです。
しかし、やはりこれも無理っぽいので普通の引数にし、呼び出す方でフォームを
指定する方法にしました。(^^)
今までご回答くださった方々、有難う御座いました。
ツイート | ![]() |