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

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

C# と VB.NET の入門サイト

Re[3]: MSFLEXGRIDのスコープ範囲


(過去ログ 97 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■58025 / inTopicNo.1)  MSFLEXGRIDのスコープ範囲
  
□投稿者/ コアラ主任 (32回)-(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
この辺に問題がありますでしょうか・・・。
お気付きの点がありましたら、よろしくお願いいたします。

引用返信 編集キー/
■58030 / inTopicNo.2)  Re[1]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 (34回)-(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


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

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

# 見えにくい VB6 はこの手の事故が多いですねぇ...
解決済み
引用返信 編集キー/
■58032 / inTopicNo.4)  Re[1]: MSFLEXGRIDのスコープ範囲
□投稿者/ 魔界の仮面弁士 (2141回)-(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
のようなコードが実行時エラーになるので、コードバグを検知しやすくなります。

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

ご返答ありがとうございます。
未だにVB6を使っているVB厨ですが、
まだまだ、理解できていないところが
たくさんあります。
はやく、.netやVSにならなければ!
引用返信 編集キー/
■58036 / inTopicNo.6)  Re[2]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 (36回)-(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

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -