フォームがプロジェクトに追加されていない時のコードの書き方

解決


ミルキースター  2005-04-12 20:29:55  No: 120832

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


いな  2005-04-12 20:40:33  No: 120833

>標準モジュール

『標準モジュール』というのは、いわゆる、
各プロジェクト間で共通に使用している標準モジュールという意味ではなく
ファイルの追加のときに問われる標準モジュール(*.bas)のことですよね?

なぜ?Form2がないのにForm2.Showが必要なのか?
その辺の説明を詳細にされては?


ミルキースター  2005-04-12 21:04:55  No: 120834

>『標準モジュール』というのは、いわゆる、
>各プロジェクト間で共通に使用している標準モジュールという意味ではなく
>ファイルの追加のときに問われる標準モジュール(*.bas)のことですよね?

  両方一緒に捉えて私は「標準モジュール」と認識しているのですが、、、^_^;
違っているのかなぁ〜。

  みんなで使えるようにした(共通)のコード群。と言いますか。。。

>なぜ?Form2がないのにForm2.Showが必要なのか?
>その辺の説明を詳細にされては?

  何と言いますか。

  Aプロジェクト(VBP)では、gfncShowForm1関数を利用してForm1起動する場面がある。
  Bプロジェクト(VBP)では、gfncShowForm2関数を利用してForm2起動する場面がある。
  Cプロジェクト(VBP)では、gfncShowForm1関数を利用してForm1起動する場面があるり、
                          gfncShowForm2関数を利用してForm2起動する場面もある。

  で、各プロジェクトに FormShow.Bas を追加しておけば、関数を投げるだけで利用できる。

  ※ すみません。例では単なるShowをしているだけですが、本当は複雑な処理をしています。^_^;


Dental  2005-04-12 21:34:06  No: 120835

Form2が無いと起動しないという点だけみると、共通部品としてみるには、
若干、汎用性に欠けますよね。モジュールの設計を見直した方が良いかも。

本当に共通で使う部分(他のオブジェクトへの依存度が低いもの)と、
特定のプロジェクトでしか使わない部分とは、モジュールをわけるべきでは。

一応、Forms.Add メソッドで対応すると言う手もありますが、
    Dim F As Form
    Set F = Forms.Add("Form2")
    F.Show
この場合、Form2.Show で呼び出される物とは、内容は同じですが
インスタンスは異なる事になります。このため、現在の開発スタイルが、
VB6で暗黙に作成されるフォームを利用した開発手法になっている場合、
見つけにくいバグを埋め込む可能性がありますので、避けた方が良いかと。


いな  2005-04-12 22:27:20  No: 120836

>みんなで使えるようにした(共通)のコード群

そうゆう位置づけでしたら、Dentalさんがいうとおり、
Form2という固定の名称のオブジェクトは使うべきではないですね。
標準モジュール内で処理が完結できるよう再設計が必要かと

簡単に修正するとしたら、
件の関数は、指定されたフォームを起動する。
というようにし、引数化してオプショナルをつけておくとか?

いろいろ手段はあるはずです。


いな  2005-04-12 22:27:21  No: 120837

>みんなで使えるようにした(共通)のコード群

そうゆう位置づけでしたら、Dentalさんがいうとおり、
Form2という固定の名称のオブジェクトは使うべきではないですね。
標準モジュール内で処理が完結できるよう再設計が必要かと

簡単に修正するとしたら、
件の関数は、指定されたフォームを起動する。
というようにし、引数化してオプショナルをつけておくとか?

いろいろ手段はあるはずです。


ミルキースター  2005-04-12 22:58:01  No: 120838

いなさん、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 の部分を教えて頂けませんでしょうか。

  宜しくお願いします。<(_ _)>


いな  2005-04-13 03:13:39  No: 120839

今客先で、Air-H"からでして、

確か引数を省略したとき、IsMissing??だったかなぁ〜
が使えませんでしたっけ?

キーワードは、オプショナルとミッシングです、
それでヘルプで検索してみてください。

規定値って必ず指定しなければいけなかったんでしたっけ?


ガッ  2005-04-13 06:23:55  No: 120840

・Function foo(Optional ByVal hoge As Form = Nothing)
というのは想像できるんですけど、
・Function foo(Optional ByVal hoge As Form = 0)
などと…ヘンなのを初期値にできるみたいです(orz
で、TypeName()で見てみるとNothingでした。

※というかMSDNに書いて(ry


ミルキースター  2005-04-13 18:04:39  No: 120841

いなさん、ガッさん、ご回答ありがとうございます。

  >今客先で、Air-H"からでして、
お忙しい所からご回答頂いているとは。(^^)
お疲れ様です。

  すみません。ちょっと質問の仕方が悪かったです。^_^;

  普通の規定値だと Nothing ということは知っていたのですが、
・gfncShowForm1プロシージャだと 起動 Form1 フォームと決まっていますし、
・gfncShowForm2プロシージャだと 起動 Form2 フォームと決まっていますので

例えば、Optional ByVal frm As Form = Form1 という風に規定で特定した
フォームをセットできないなかぁ〜と思ったのです。

  しかし、やはりこれも無理っぽいので普通の引数にし、呼び出す方でフォームを
指定する方法にしました。(^^)

  今までご回答くださった方々、有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加