すいません。クラスからのフォーム参照についてですが・・・
Form_Initialize() でクラスを初期化しているのですが、
Set clsDB = New clsDB で Class_Initialize() が実行されます。
クラスの初期化時にフォームのインスタンスを作成しています。
Set frmMain = New F_Main で Form_Initialize() がまた呼ばれ、永久ループしてしまいます。
クラスからのフォーム参照する場合、フォームのインスタンスはいつ作成するのがいいのでしょうか??
'フォーム F_Main
Private Sub Form_Initialize()
Set clsDB = New clsDB
End Sub
' クラス clsDB
Private Sub Class_Initialize()
Set frmMain = New F_Main
End Sub
もう一例。
フォームロードにクラスの関数を呼び出す。
クラスの関数はフォームを参照している。
このとき Set hForm1 = New Form1 とした時に、フォームロードイベントが起こる。
ロード時にクラスの関数を呼び出しているので、永久ループになってしまう。
フォームロード時にクラスの関数を呼ばずに、別の場所で呼び出せばいいのですが、適当なイベントがありません。
どうすればよいでしょうか?
そもそも相互参照というか相互に呼び出しがあるコーディングは控えるべきです。今回の無限ループ以外に思わぬ落とし穴がたくさんあるはず。
コードから察するにVB6.0でしょうか?クラスとフォームが同一プロジェクト内にあるのかどうかわかりませんが、以下同一プロジェクト内にある場合について思いつく事を述べてみます。
クラスからフォーム、と決まっているならフォームにクラスを変数として持たせフォームのインスタンスを作成した時に自身をセットしてやるのがこの場合いいのではないかと思うのですが。逆もまた然り。定まっていない時は標準モジュールか何かにクラスとフォームを変数として持たせるとか。
#はずしてる可能性大。コード書く暇ないので実際にコード組んでの検証はしてません。
なんか話が矛盾していませんか?
クラスからフォームのインスタンスを作成するなら
スタートアップをF_Mainにしたのでは意味がないのような気がしますが。
F_Mainから別のフォームのインスタンスを作成するのなら分かる気がしますけど。
'フォーム F_Main
Private Sub Form_Initialize()
Set clsDB = New clsDB
End Sub
' クラス clsDB
Private Sub Class_Initialize()
Set frmMain = New F_Sub
End Sub
とか
まあ、自ら永久ループを作成して質問したくて書いたんだろうけど
だいたいこの手のはなしは最初の仮定が理屈にあってないことが多いですね。
下の方の記述も見て何やら思いついたのでもうひとつ。
クラスからフォームを参照するのではなく、クラスの関数に引数としてフォームやコントロールを参照渡しで渡す方がいいのかも。
#もっともプログラムがどんな仕様かにも寄るのですけどね。
#絶対にクラスからフォームを参照しフォームからクラスを参照する様な仕様に
#なっているのなら私の知識ではお手上げかも。
>クラスの関数に引数としてフォームやコントロールを参照渡しで渡す方がいいのかも。
この方法でやってみたいと思います。那岐さんありがとうございました。
ツイート | ![]() |