| > Public mainForm As Form2 > のように、別の名前に変更しておく事をおすすめします。 > ■No58032 (魔界の仮面弁士 さん) に返信 > ■No58025 (コアラ主任 さん) に返信 >>それとも、自分のプログラミングにより、そのようになっているの >>でしょうか。 > だと思います。 > > 未初期化のフォームが自動ロードされてしまっているのでしょう。 > > >>別のフォームから、そのMSFLEXGRIDのrows値を参照すると >>フォーム側(?)プロパティで設定してある2と言う値で参照されます。 > Rows をセットする際に、フォームと MSFlexGrid の hWnd プロパティを > Debug.Print してみてください。 > > そして、Rows が 2 になってしまっている所でも、同様に > それらの hWnd プロパティを参照してみてください。 > > もしも「セットした時」と「参照した時」がそれぞれ同一のフォームだとすれば、 > hWnd 値は同じものになるはずです。それらが違う値になってしまうようであれば、 > 別のフォームとコントロールを参照していることを意味します。 > > >Public main_form As main_form > 変数名と型名が同じになっているのが、混乱の要因かと思われます。 > また、フォームがアンロードされた時には、変数名に Nothing を代入する事を > 忘れないようにしてください。そうしないと、自動ロードの危険性が高まります。 > > Dim f As Form3 > Set f = New Form3 > Load f > Debug.Print ObjPtr(f), f.hWnd '元のフォーム > f.Caption = "New Caption" 'Captionを変更する > f.Show vbModal > Unload f 'アンロードしてあるが、 > 'Set f = Nothing 'Nothing はセットしていないし、 > 'Set f = New Form3 '新たなインスタンスもセットしていない > > MsgBox f.Caption 'この時点で自動ロードされてしまう > Debug.Print ObjPtr(f), f.hWnd '別のフォームになっている > > > 上記の場合、ObjPtr(f) が一致する事からもわかるように、 > オブジェクトとしては同一のインスタンスですが、 > f.hWnd は別物であるため、自動ロードされた > 別のフォームになってしまう事がうかがえます。 > > >> Set main_form = New main_form >> Load main_form > New して使う事を前提にしている場合、暗黙のForm変数にアクセスできないようにするため、 > > 'Form2(呼ばれる側) > Option Explicit > Private Sub Form_Initialize() > Set Form2 = Nothing '暗黙の変数を消しておく > End Sub > > のようにしておくと良いでしょう。こうすれば、 > Set f = New Form2 > Load f > f.Show > のようなコードは正常に実行できますが、 > Load Form2 > Form2.Show > のようなコードが実行時エラーになるので、コードバグを検知しやすくなります。
ご丁寧なご回答ありがとうございます。
> 未初期化のフォームが自動ロードされてしまっているのでしょう。 そうだったのですね。
>Public main_form As main_form > 変数名と型名が同じになっているのが、混乱の要因かと思われます。 > また、フォームがアンロードされた時には、変数名に Nothing を代入する事を > 忘れないようにしてください。そうしないと、自動ロードの危険性が高まります。 はい、ちょくちょく、やっているので今後、気をつけたいと思います。 hWnd 値の確認は、他のプログラミングにも、役立つと思いますので、 提示いただいた検証を実施したいと思います。 ありがとうございました。 m(__)m
|