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

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

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

Re[1]: オブジェクト参照


(過去ログ 62 を表示中)

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

■35526 / inTopicNo.1)  オブジェクト参照
  
□投稿者/ みちる (6回)-(2009/05/08(Fri) 09:11:51)

分類:[.NET 全般] 

環境VB2005

今フォームが二つ、モジュールが二つあるプロジェクトを開発しています。
form1のコマンドボタンが押下されるとモジュールに作った
関数へとび、そこでform1のラベルやテキストやスプレッドシートなどに
入った値をいろいろと使用し、テキストファイルを出力するという
動きなのですが、プログラムをステップ実行する際に
値の動きを見たく、イミディエイトウィンドウに
たとえばlabelの値を参照したい時は
?form1.Label1.Textと打ち込むのですが、
【非共有メンバを参照するには、オブジェクト参照が必要です。】
と表示されてしまいます。

プログラム上でform1.Label1.Textはちゃんと取得できているようなので
動きには問題はないのですが・・・・。後々、動作に影響が
出てくることなのかどうかが気になるんです。

参照をしたほうがいいのかと思い、関数で
Dim Form1 As New Form1としたのですが、
そうすると、逆にフォームロード時にセットした値が
すべて初期値になってしまっています。
フォーム間、フォームとモジュールをまたいでの値の参照などは
Dim Form1 As New Form1だけでは足りないのでしょうか?

初心者な質問ですが、アドヴァイスよろしくお願いします。
引用返信 編集キー/
■35529 / inTopicNo.2)  Re[1]: オブジェクト参照
□投稿者/ kazuto (2回)-(2009/05/08(Fri) 09:47:13)
kazuto さんの Web サイト
こんにちは。
ボタン押下後に呼び出されるモジュール内ではフォームのインスタンスが正しく渡されていますか?

> プログラム上でform1.Label1.Textはちゃんと取得できているようなので

プログラム上とはモジュール内の事を指しているのでしょうか?
であるならばイミデイトウィンドウでも正しく値の参照は行えるはずです。


> 参照をしたほうがいいのかと思い、関数で
> Dim Form1 As New Form1としたのですが、
> そうすると、逆にフォームロード時にセットした値が
> すべて初期値になってしまっています。

質問の内容からして、ボタン押下を行ったフォームの情報がモジュールの関数内で必要だと思いますが、
Dim Form1 As New Form1
としてしまうとForm1の別のインスタンスを作ってしまうので、ボタン押下を行ったフォームのインスタンスではありません。
よって初期化されているように感じているのではないでしょうか?


> フォーム間、フォームとモジュールをまたいでの値の参照などは
> Dim Form1 As New Form1だけでは足りないのでしょうか?

単純にボタン押下時に呼ぶモジュールの関数に、引数としてフォームのインスタンスを渡して使用すれば大丈夫だと思います。
引用返信 編集キー/
■35530 / inTopicNo.3)  Re[2]: オブジェクト参照
□投稿者/ なちゃ (276回)-(2009/05/08(Fri) 10:10:03)
多分既定のフォームインスタンスを使っちゃってるんでしょう。
#正確な言い方忘れちゃいましたが

イメディエイトウィンドウでは既定のインスタンス機能が効かないってことですかね。

出来ればフォームを渡すより、必要なデータを詰めたデータクラスのようなもので
やり取りする方がまだおすすめなんですが、今の状態では難しそうですね…

引用返信 編集キー/
■35540 / inTopicNo.4)  Re[3]: オブジェクト参照
□投稿者/ streetw (4回)-(2009/05/08(Fri) 16:22:57)
フォームの既定のインスタンスはMy.Formsで参照できるので、
イミディエイトウィンドウでは
? My.Forms.Form1.Label1.Text
とすればいいみたいです。

> 後々、動作に影響が
> 出てくることなのかどうかが気になるんです。

イミディエイトウィンドウに
既定のインスタンスへの配慮がないだけだと思うので、
心配されなくていいと思います〜
引用返信 編集キー/
■35559 / inTopicNo.5)  Re[4]: オブジェクト参照
□投稿者/ みちる (7回)-(2009/05/09(Sat) 10:44:26)
返信が遅くなってしまい、申し訳ありません。

>プログラム上とはモジュール内の事を指しているのでしょうか?

はい、そうです。モジュール上でテキストの値を変数に入れて、それをメッセージボックスで表示させるようにしたら
ちゃんと表示されたので。。。。

もう一度、試してみましたが、やはりイミディエイトウィンドウでの表示は出来なかったです。。。

>単純にボタン押下時に呼ぶモジュールの関数に、引数としてフォームのインスタンスを渡して使用すれば大丈夫だと思います。

出来ました!!!ありがとうございます。
でもやはり、フォームの数が多かったりする場合は、

>出来ればフォームを渡すより、必要なデータを詰めたデータクラスのようなもので
やり取りする方がまだおすすめなんですが

このようなやり方を勉強していったほうがいいのでしょうね。
まだまだです。。。アドバイスありがとうございます。

>? My.Forms.Form1.Label1.Text

これも、今後の開発の参考になりそうです。

拙い説明でアドバイスを下さった皆様、本当にありがとうございます。
解決済み
引用返信 編集キー/
■36124 / inTopicNo.6)  Re[1]: オブジェクト参照
□投稿者/ たろう (2回)-(2009/05/21(Thu) 12:54:23)
No35526 (みちる さん) に返信

'Windows フォーム デザイナで生成されたコード
Public Sub New()
〜〜〜
End Sub

の次に以下を追加

Private Shared m_vb6FormDefInstance As Form1
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As Form1
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
m_InitializingDefInstance = True
m_vb6FormDefInstance = New Form1
m_InitializingDefInstance = False
End If
DefInstance = m_vb6FormDefInstance
End Get
Set(ByVal Value As Form1)
m_vb6FormDefInstance = Value
End Set
End Property

以上


【使用例】Form1.DefInstance.TextBox1 = ""

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -