DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーム間で変数を共有するには?

分類:[.NET]

お世話になります。
あるフォームで値を決定した変数を別のフォームで使う方法がわかりません。

よねKENさんの705のコメントも読ませていただき、いろいろやってみましたが、
やはり分かりません。

手元のテキストには、 Application("名称") = 値
としておいて、別のウェブフォームでその"名称" から呼び出すというような
ことが紹介されていたのですが...。

用語が正確でなくて申し訳ないのですが、私がやりたいのは、ウェブではなく、普通のフレーム同士の話です。
基本的な形が分かるようなサンプルでも見せていただけないでしょうか?
こんにちは、Ken-Koさん。ピラルクです。

> あるフォームで値を決定した変数を別のフォームで使う方法がわかりません。

"あるフォーム" は、Public Property として"変数"へのインターフェース
を実装する。
"別のフォーム"はそれにアクセスする。

しかし、"別のフォーム"は"あるフォーム"にまずアクセスできなければいけない。
それは、コンストラクタで渡してやったり、Ownerでとったり様々な方法がある
と思われます。
(↑たとえばの一例)

> 基本的な形が分かるようなサンプルでも見せていただけないでしょうか?

要求が漠然としすぎていて、
これが"基本的"と言えるほど絞り込めない状況です。
ピラルクさん、ありがとうございます。

> 要求が漠然としすぎていて、これが"基本的"と言えるほど絞り込めない状況です。

すいませんでした。なんとか、もうちょっと具体的に書いてみます。
例えば、今自分がやりたいことは、

Form5 の冒頭で
Public Class frmForm5
Inherits System.Windows.Forms.Form
Public myTest As Integer
Public strConnection As String = "Microsoft.Jet.OLEDB.4.0"
Public strSource As String = "C:\Documents and Settings\顧客管理.mdb"

...

strConnection = "Microsoft.Jet.OLEDB.4.0"
strSource = "C:\Documents and Settings\顧客管理.mdb"

という具合に、Form5 でどのデータベースにどうつなぐかを決定して、
その結果を、使って、

Dim frmForm2 As New frmForm2
frmForm2.Show()

という具合に呼び出した Form2 のほうで実際に接続する、という作業です。
...、まだ漠然としすぎているでしょうか?

ピラルクさんのお話によると、Form2 のほうで Form5 の変数を取ってくることと、
Form5 から渡す方法があるようですが...。
なんとかよろしくお願いいたします。
こんばんは、Ken-Koさん。ピラルクです。

> Form2 のほうで Form5 の変数を取ってくることと、
> Form5 から渡す方法があるようですが...。

これは、Object指向プログラミングにおけるクラスの
依存関係の問題です。再利用の可能性などを考慮して
渡し方を考えるのが理想的ですが、そういう責任を負
っていないのであれば、まぁ無理に難しく考える必要
もないと思います。

いつ接続情報が確定するのかという点が不明なので、
Form2は接続の情報を必要とした時に、はじめてForm5
へ(最新の)値をとりに行くという条件ならば、

'既にForm5でstrConnection,strSourceがPublicなので。

Private Sub Form2SomeProc() 
  Dim strLocalConnection As String = frmForm5.strConnection
  Dim strLocalSource As String = frmForm5.strSource
  ……

で取得できます。問題はfrmForm5をどう渡すかですが、
Form2のClassに、

Public frmForm5 As Form5

を追加して、Form2をNewしてShow()している所で、

Dim frmForm2 As New Form2

'↓追加
frmForm2.frmForm5 = Me

frmForm2.Show()

とすれば、とりあえずは(*1)渡せるはず。

*1:「とりあえず」というのは、依存関係や隠蔽の観点
   からして色々と宜しくないので。可読性も悪い。

で、VB6以前のbasモジュールでグローバル変数を用いて
いたようにもっとEasyにできないかということでしたら、
basモジュールに相当するClassを1つ作るという手もあ
ります。

Public Class SystemGlobalInfo
  Public Shared gstrConnection As String
  Public Shared strSource As String
End Class

SharedでClass変数にすることにより、Classからアクセス
するので、「どこかで渡す」必要がないところがEasy。

Form5がこれに設定し、
SystemGlobalInfo.gstrConnection = "xxxxxxx"

Form2がSystemGlobalInfo.gstrConnectionから読み出す。

※Propertyを使う方が本当はいいけど。
ピラルクさん、ありがとうございました。

> Public Class SystemGlobalInfo
> Public Shared gstrConnection As String
> Public Shared strSource As String
> End Class
>
> SharedでClass変数にすることにより、Classからアクセス
> するので、「どこかで渡す」必要がないところがEasy。
>
> Form5がこれに設定し、
> SystemGlobalInfo.gstrConnection = "xxxxxxx"
>
> Form2がSystemGlobalInfo.gstrConnectionから読み出す。

とりあえず、上の方法でやりました。

> これは、Object指向プログラミングにおけるクラスの
> 依存関係の問題です。再利用の可能性などを考慮して
> 渡し方を考えるのが理想的ですが、そういう責任を負
> っていないのであれば、まぁ無理に難しく考える必要
> もないと思います。

> ※Propertyを使う方が本当はいいけど。

> Form2のClassに、
>
> Public frmForm5 As Form5
>
> を追加して、Form2をNewしてShow()している所で、
>
> Dim frmForm2 As New Form2
>
> '↓追加
> frmForm2.frmForm5 = Me
>
> frmForm2.Show()
>
> とすれば、とりあえずは(*1)渡せるはず。
>
> *1:「とりあえず」というのは、依存関係や隠蔽の観点
> からして色々と宜しくないので。可読性も悪い。

こちらは、たしかに難点が多そうですね...。
私はエクセルVBAからはじめてVBに入ってきたのですが、
どうもまだ、オブジェクト指向についてよく理解していないようです。

Class の扱い方等、もっと勉強しようと思います。

ありがとうございました。また何かありましたら、よろしくお願いいたします。
すいません。「解決済み」マークを忘れました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板