C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.58025 の関連記事表示

<< 0 >>
■58025  MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 -(2011/03/24(Thu) 07:07:05)

    分類:[VB6 以前] 

    VB6SP6 WinXPです。

    Main_formと言うフォームを作成し、そこにMSFLEXGRIDを
    貼り付けています。
    rowsの値を同フォーム内プロシジャにて10と変更しています。
    別のフォームから、そのMSFLEXGRIDのrows値を参照すると
    フォーム側(?)プロパティで設定してある2と言う値で参照されます。
    これは、仕様なのでしょうか。
    それとも、自分のプログラミングにより、そのようになっているの
    でしょうか。
    そのフォームは、標準モジュールのプロシジャ外で以下のように
    指定し、
    Public main_form As main_form
    プロシジャ内で、以下のように使用しています。
    Set main_form = New main_form
    Load main_form
    main_form.Show
    この辺に問題がありますでしょうか・・・。
    お気付きの点がありましたら、よろしくお願いいたします。
親記事 /過去ログ97より / 関連記事表示
削除チェック/

■58032  Re[1]: MSFLEXGRIDのスコープ範囲
□投稿者/ 魔界の仮面弁士 -(2011/03/24(Thu) 09:56:21)
    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
    のようなコードが実行時エラーになるので、コードバグを検知しやすくなります。
記事No.58025 のレス /過去ログ97より / 関連記事表示
削除チェック/

■58036  Re[2]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 -(2011/03/24(Thu) 10:23:25)
    >  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
記事No.58025 のレス / END /過去ログ97より / 関連記事表示
削除チェック/

■58030  Re[1]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 -(2011/03/24(Thu) 09:39:58)
    No58025 (コアラ主任 さん) に返信
    > VB6SP6 WinXPです。
    >
    > Main_formと言うフォームを作成し、そこにMSFLEXGRIDを
    > 貼り付けています。
    > rowsの値を同フォーム内プロシジャにて10と変更しています。
    > 別のフォームから、そのMSFLEXGRIDのrows値を参照すると
    > フォーム側(?)プロパティで設定してある2と言う値で参照されます。
    > これは、仕様なのでしょうか。
    > それとも、自分のプログラミングにより、そのようになっているの
    > でしょうか。
    > そのフォームは、標準モジュールのプロシジャ外で以下のように
    > 指定し、
    > Public main_form As main_form
    > プロシジャ内で、以下のように使用しています。
    > Set main_form = New main_form
    > Load main_form
    > main_form.Show
    > この辺に問題がありますでしょうか・・・。
    > お気付きの点がありましたら、よろしくお願いいたします。
    >
    《自己回答》
    お騒がせ致しました。
    標準モジュールのプロシジャ外で指定していた
    以下の定義をコメントにしたところ、
    他のフォームからの参照も、同一フォームと
    同じ値を参照できるようになりました。
    「As main_form」が悪かったのだろうか・・・。

    > Public main_form As main_form

記事No.58025 のレス / END /過去ログ97より / 関連記事表示
削除チェック/

■58031  Re[2]: MSFLEXGRIDのスコープ範囲
□投稿者/ じゃんぬねっと -(2011/03/24(Thu) 09:52:35)
>
    No58030 (コアラ主任 さん) に返信
    > 《自己回答》
    > お騒がせ致しました。
    > 標準モジュールのプロシジャ外で指定していた
    > 以下の定義をコメントにしたところ、
    > 他のフォームからの参照も、同一フォームと
    > 同じ値を参照できるようになりました。
    > 「As main_form」が悪かったのだろうか・・・。

    「インスタンスとは何ぞや」 がわかれば当然の動作だということも理解できそうです。
    「マルチプル インスタンス」「フォームの既定のインスタンス」あたりがキーワードでしょう。

    # 見えにくい VB6 はこの手の事故が多いですねぇ...
記事No.58025 のレス / END /過去ログ97より / 関連記事表示
削除チェック/

■58035  Re[3]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 -(2011/03/24(Thu) 10:15:09)
    No58031 (じゃんぬねっと さん) に返信
    > ■No58030 (コアラ主任 さん) に返信
    >>《自己回答》
    >>お騒がせ致しました。
    >>標準モジュールのプロシジャ外で指定していた
    >>以下の定義をコメントにしたところ、
    >>他のフォームからの参照も、同一フォームと
    >>同じ値を参照できるようになりました。
    >>「As main_form」が悪かったのだろうか・・・。
    >
    > 「インスタンスとは何ぞや」 がわかれば当然の動作だということも理解できそうです。
    > 「マルチプル インスタンス」「フォームの既定のインスタンス」あたりがキーワードでしょう。
    >
    > # 見えにくい VB6 はこの手の事故が多いですねぇ...

    ご返答ありがとうございます。
    未だにVB6を使っているVB厨ですが、
    まだまだ、理解できていないところが
    たくさんあります。
    はやく、.netやVSにならなければ!
記事No.58025 のレス /過去ログ97より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -