|
■No58025 (コアラ主任 さん) に返信
> それとも、自分のプログラミングにより、そのようになっているの
> でしょうか。
だと思います。
未初期化のフォームが自動ロードされてしまっているのでしょう。
> 別のフォームから、そのMSFLEXGRIDのrows値を参照すると
> フォーム側(?)プロパティで設定してある2と言う値で参照されます。
Rows をセットする際に、フォームと MSFlexGrid の hWnd プロパティを
Debug.Print してみてください。
そして、Rows が 2 になってしまっている所でも、同様に
それらの hWnd プロパティを参照してみてください。
もしも「セットした時」と「参照した時」がそれぞれ同一のフォームだとすれば、
hWnd 値は同じものになるはずです。それらが違う値になってしまうようであれば、
別のフォームとコントロールを参照していることを意味します。
> Public main_form As main_form
変数名と型名が同じになっているのが、混乱の要因かと思われます。
Public mainForm As Form2
のように、別の名前に変更しておく事をおすすめします。
また、フォームがアンロードされた時には、変数名に 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
のようなコードが実行時エラーになるので、コードバグを検知しやすくなります。
|