• ベストアンサー

form1 から form2 へのデータの受け渡し方

まだまだ勉強中の初心者なのですが、お願いします。 今同プロジェクト内の form1 から form2 へデータを渡そうとしているのですが、 'form1 '------------------------------- Private Sub Command2_Click() Form2.m_Get.ites = 1 Form2.Show (1) End Sub 'form2 '-------------------------------- Public m_iGet As TES 'Module1 '-------------------------------- Type TES ites As Integer End Type 理想はこのようにform2の構造体へform1から値を代入したいのですが。 コンパイルエラー 定数、固定長文字列、配列、ユーザー定義型および Declareステートメントはオブジェクトモジュールの パブリックメンバとして使用できません。   ということはこの渡し方は無理なんですね。 配列も無理ですね。 なるべくグローバル変数でのやり取りはしたくはないのですが、、、。 何か他にいい方法ありますか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

お礼コメントに「C」の言葉があるということは、、、 勝手な推測ですが 「値の所有者をはっきりさせたいから」という理由では? オブジェクト指向を思うと、よくある考えですよね。 私も標準モジュールには、やたらと変数を書きません。 これはあくまで私感ですが、標準モジュールで2フォーム間の値を渡すためだけに、汎用性の乏しい変数を書きたく無い方です。 私の場合は、フォームのプロパティを作ってしまいます。これもまた構造体などは無理ですが、「値の所有者」を意識して当然と思っております。 話はそれましたが、どうしても構造体っぽいことをしたいのであれば、私もクラスをお勧めします。 'form1(フォーム) '------------------------------- Private Sub Command2_Click()   Load Form2   Form2.m_Get.ites = 1   Form2.Show vbModal End Sub 'form2(フォーム) '-------------------------------- Public m_Get As TES Private Sub Form_Load()   Set m_Get = New TES End Sub Private Sub Form_Unload(Cancel As Integer)   Set m_Get = Nothing End Sub 'TES(クラス) '-------------------------------- Public ites As Integer

anan23
質問者

お礼

ほほう!! こうゆう使い方があるんですね! なるほどです。 これがVBでのクラスですか?思ったより簡単なつくりみたいですね。 参考になります! ありがとうございました。

その他の回答 (6)

  • cc-to
  • ベストアンサー率0% (0/1)
回答No.7

私も、C++とおっしゃっているのと質問文のコードから、値の所有者、あるいはカプセル化をしたいのだと、推察しました。 そうであれば(そうでなくても)グローバル変数は極力使わないのはプログラミングの基本ですから、ANo.5さんのようなフォームに属するプロパティとして扱うか、フォームに非可視のテキストボックスなどを配置する方法もあります。 非可視のテキストボックスはあまり良い方法ではないかもしれませんが、そもそもクラスを定義してフォームに配置するのと、よく似ています。また、フォームに存在するテキストボックスを参照したらフォームがロードされるのは当然で、アンロードが必要になります。 ANo.4さんもおっしゃるように、質問文のコードでは、パラメーターを渡してフォームを開いているようですから(そして受け取って処理をする?)、やはり最もスマートなのはクラスでしょう。 パラメーターを渡す、開く、必要なら戻り値を返す、という処理を1度にできます。 簡単な例では、  『一定時間だけ入力ボックスを表示して、時間切れになったら閉じる』 というような機能を持つオブジェクト考えてみますと strRes = WaitInputBox("名前は?", 10000) と呼び出すと10000ミリ秒だけ返事を待つボックスを表示して、入力値をstrRes に戻す、というようなことも可能になります。 もちろんどこからでも呼び出せて、"名前は?"や 10000などの値はカプセル化されて渡すことができます。受け渡し方やShowなども意識する必要がなくなります(すなわちカプセル化ですが)。 ~~~~~~ ところで余計ですが、どの方法に賛成などという回答投稿は、あまりに不毛では…? 決して批判するつもりはありませんが…。 皆さんが情報を提供して、それらを参考にanan23さんが決めれば良いし、別に選ばれても選ばれなくても、絶対的な方法ではないわけですし、知識として今後の役にも立つでしょう。 私も必要ならグローバル変数を使うこともあります。 考え方も人それぞれ、最良な方法もケースバイケースです。視野は広く選択肢は多い方がいいわけです。狭い視野や固執した考えはプログラムやアイデアの障害になります。 ANo.3さん、ANo.4さん、ANo.5さんのように柔軟に考えたほうが今後の成長につながると思いますよ。

anan23
質問者

お礼

そんなこともできるんですか! 結構いろいろ使いかたがありそうですね。 勉強します。 確かにこの質問は私が今までした質問で一番回答が多いです。みなさん自分なりの流儀があるようですね。 私は今回はちょっと時間もあまりないのでとりあえずグローバルで、と考えております。 クラスは使えるとなかなか便利そうなのでおいおい勉強したいと思っています。 ありがとうございます。

  • takamoke
  • ベストアンサー率33% (30/89)
回答No.6

NO-2 さんに 一票

  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

> VBでのクラスってゆうのはユーザー定義型(構造体)のことですか? > C++みたいなクラスも定義できるのですか? VBでいうクラスというのは構造体(ユーザー定義型)などとは微妙に違っていて、オブジェクト指向っぽいことができる、というようなものです(かなり曖昧な説明ですが…)。 ↓ここなど参考になるのでは http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html グローバル変数を使わない方法ということで紹介しましたが、手軽なのは皆さんおっしゃるようにグローバル変数ですね。 とはいえ、C++的な考えをお持ちのようだと言うことと、確かにグローバル変数は可能なら避けた方が良いのは言うまでもありませんから、選択肢の一つとしてクラスもありなのは間違いないと思います。 ANo.3のかたも書かれているように、それなりに便利なものです。 なぜなら、今回のご質問からの推測に過ぎませんが、単に値を受け渡すだけでなく、呼び出し時にセットしてそれに応じて何らかの動作をさせたい、というコードに見えますので、クラスならセットされた値に応じてそれ自体が処理を行うことが可能になり、その意味ではスマートになるでしょう。 ちなみに、参照するとロードされるのはフォーム上に配置されたオブジェクトと同様ですので、アンロードを忘れなければ問題ありません。 そもそもオブジェクトはPublicになります。 あくまでも、詳細が解らないので、どちらかをすすめるという意味ではありません。参考になれば。

anan23
質問者

お礼

なるほど!たしかにC++やってたのでオブジェクト指向よりだったのですが、C++になれるとVBでのクラス化ってゆーのがピンとこないんですよね。URL参考にさせていただきます。ありがとうございます。

回答No.3

基本的にフォームモジュールでPublic宣言はしない方が良いです。その変数が参照されると、ロードしていないのにフォームがロードされた状態になり、全ての画面が閉じられても、アプリケーションが終了されない(タスクに残っている)状態になります。 学び始めたばかりなら、No.2の回答者のご意見が適切でしょう。但し、クラスのメリットもあるので、おいおい勉強していって下さいね。

anan23
質問者

お礼

そーなんですかっ! 知らなかった、、、。 おいおいですね。 ありがとうございます。

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.2

標準モジュールを作ってデータ受け渡し用の変数を用意するのがお手軽です。 #1の方の言うことももっともですが、元々中途半端なオブジェクト指向をちょっとだけ取り入れた言語なので、あまりクラスだのなんだのと凝るよりも、シンプルに作るのも大事だと思います。

anan23
質問者

お礼

早々な回答ありがとうございます。 やはりグローバルでってことがVBではスマートなんでしょうかね? 検証中、、、

  • taseki
  • ベストアンサー率66% (155/233)
回答No.1

値を保持するためだけのクラスを定義してしまってはどうですか? フォームモジュールでPublic宣言し、外から参照できると思います。

anan23
質問者

お礼

早々な回答ありがとうございます。 やはりグローバルでってことがVBではスマートなんでしょうかね? VBでのクラスってゆうのはユーザー定義型(構造体)のことですか? C++みたいなクラスも定義できるのですか? >値を保持するためだけのクラスを定義してしまう ということは結局構造体? 検証中、、、

関連するQ&A

  • Form間のデータ渡しについて

    申し訳ありません。VB.NET初心者です。 Form1から、ボタンAをクリックするとForm2がオープンします。 Form1から、ボタンBをクリックするとForm3がオープンします。 Form1では、Form2またはForm3で設定した値をそれぞれ演算に使おうとしています。 MicrosoftのHPからパクってForm1 - Form2間のデータの引渡しを行うことはできたの ですが、新規でForm3を作成して、Form1 - Form3間のデータの引渡しを行おうとする とForm3の立ち上がり時に "NullReferenceException はハンドルされませんでした"となり、 困ってしまいました。 使われている方から見ると簡単かもしれず 申し訳ありませんが、どなたか教えていただけないでしょうか。 ==================== Form1.vb ======================= Form1には、Label1、Label2、Button1、Button2があります。 Public Class Form1 Inherits System.Windows.Forms.Form Private m_form2 As Form2 Private m_form3 As Form3 Public Property LabelText() As String Get Return Label1.Text End Get Set(ByVal Value As String) Label1.Text = Value End Set End Property Public Property LabelText2() As String Get Return Label2.Text End Get Set(ByVal Value As String) Label2.Text = Value End Set End Property Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleYokusou.Click m_form2 = New Form2(Me) m_form2.ShowDialog() m_form2.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleHikito.Click m_form3 = New Form3() m_form3.ShowDialog() m_form3.Dispose() End Sub End Class ==================== Form2.vb ======================= Form2には、TextBox1、Button1があります。 Public Class Form2 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText = Me.TextBox1.Text End If End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If m_form1 Is Nothing = False Then Me.TextBox1.Text = m_form1.LabelText End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class ==================== Form3.vb ======================= Form3には、TextBox1、Button1があります。 Public Class Form3 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText2 = Me.TextBox1.Text End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.TextBox1.Text = m_form1.LabelText2 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class

  • vb6.0のFormの遷移がうまくいきません。

    Form1からForm2に移動するときのプログラム Private Sub Command5_Click() Form2.Show With Form1 .Enabled = False .Visible = False End With End Sub です。 Form2からForm1に移動するときのプログラム Private Sub Command1_Click() Form1.Show With Form2 .Enabled = False .Visible = False End With End Sub Form1からForm2に移動し、Form2からForm1に移動する 事は出来たのですが。もう一度、Form1からForm2に 移動しようとするとBeep音が鳴り移動できません。 なぜ、2回目は失敗するのでしょうか? プログラムに問題はありますか?

  • クリックした場所にFormを開く

    教えてください! VBでクリックした場所にFormを開くには、どうしたらいいですか? Private Sub Command3_Click() Frm.Show End Sub

  • VB2008 Formを関数の引数にする

    お世話になります VB2008で開発をしています Formを2つ作成し どちらも同じ名称のテキストBOX(TextBox1)コントロールを貼り付けています Publicの関数でそれぞれのFormに値をセットしたいのですが 「'TextBox1' は 'System.Windows.Forms.Form' のメンバではありません。」 とエラーが発生してしまいます 初歩的な質問で申し訳ありませんが ご助言頂けると助かります 宜しくお願い致します ソース: --------------------------------------------------- Module Module1 Public Sub Main() Dim Form1 As New Form1 Dim Form2 As New Form2 SetValue(Form1) SetValue(form2) End Sub Private Sub SetValue(ByVal obj As Form) obj.TextBox1 = "TEST" End Sub End Module ---------------------------------------------------

  • Form1.vbに書いた定数をModule1.vbでも使うには?

    Form1.vbには Public Class Form1Form Public Const 横幅 As Long = 1200 と書いています。 そして、 Module1.vbに Sub 共通_横幅() Form1Form.Width = 横幅 End Sub と書くと、 「名前 '横幅' は宣言されていません。」 となります。 Form1.vbの Public Class Form1Formの上に 「Public Const 横幅 As Long = 1200」 を移動しても 「名前空間のステートメントが無効です。」 となります。 どうすれば Form1.vbで宣言した定数をModule1.vbで使用することができるのでしょうか? スコープを「Public」にしただけではだめなのでしょうか? Class Form1Form.Width = 横幅 にしてもだめでした。 よろしくお願い致します。

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • ビジュアルベーシックのお絵かき掲示板

    まったくの初心者です。初歩的な質問で申し訳ありません。 カラーのところでクリックが実行できません。 なぜなのかよくわかりません。お暇なときご教授下さい。  そしてもう一つ質問ですが以下のコードを追加したいの ですがどこに挿入すればいいのですか。 →private sub image_click() ccolor = 7 end sub ここまでのコードを追加したいです。 ーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Command1_Click() Form1.Cls End Sub Private Sub Command2_Click() End End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Form1.DrawWidth = 3 If Button = 1 Then PSet (X, Y), QBColor(ccolor) End If End Sub Private Sub Label1_Click() cccolor = 14 End Sub Private Sub lavel2_click() cccolor = 0 End Sub Private Sub label3_click() ccolor = 9 End Sub Private Sub label4_click() ccolor = 12 End Sub Private Sub label5_click() ccolor = 10 End Sub

  • form2がボタンを押すと消えてしまう

    vb2010で、作成しています。form1から、form2を呼び出し、okボタンまたは、cancelボタンを押すと、無条件でform2が消えてしまいます。私がしたいのは、form2(パスワード入力ウィンドウ)でテキストボックスにパスワードを入力してokボタンを押して、それが正しい(1234)ときのみform2を消去することです。現在のところ、入力したパスワードが間違っていてもokボタンを押すと、form2は消えてしまいます。 form1側のコードとform2側のコードは以下です。お手数ですが御教示いただけると幸いです。 /////////Form1 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Form2() f.TextBox1.PasswordChar = "*"c '//入力文字をマスクする If f.ShowDialog(Me) = DialogResult.OK Then If f.TextBox1.Text = "1234" Then f.Dispose() End If End If End Sub End Class /////////Form2 Public Class Form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.OK End Sub Private Sub btncancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncancel.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.Cancel End Sub End Class

  • FORM1からFORM2にパラメータの引渡し

    Public class Form1 Private Sub Button1_Click(------------------) Dim textBox1 As String textBox1 = TextBox1.Text End Sub End Class Form1でボタンをクリックし、textBox1の値を モードレスで開いたForm2にtextBox1の値を渡したい と考えていますが、参考となるサイトがなく どのように書いたらいいのかわかりません…。 メソッド(textBox1) 'FORM1側 Public Sub メソッド(ByVal textBox1 As String) ' FORM2側 で出来ると思ったのですが、この場合モードレスで開いたとしても パラメータが渡せない?と思い…。 ヒントでもいいので、アドバイスをよろしくお願いします。

  • 他のFormのクリックイベント

    教えてください! 他のFormのクリックイベントを実行できますか? Form2のButton2をクリックした時に、Form1の「Button1_Click」を実行させることができますか? 出来るとしたら、Form2の「Button2_Click」にはどのように記載したらいいのでしょうか? [Form1]より Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ [Form2]より Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ End Sub 宜しくお願いします。

専門家に質問してみよう