こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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ステートメントはオブジェクトモジュールの
パブリックメンバとして使用できません。
 
ということはこの渡し方は無理なんですね。
配列も無理ですね。
なるべくグローバル変数でのやり取りはしたくはないのですが、、、。
何か他にいい方法ありますか?
よろしくお願いします。

投稿日時 - 2005-08-10 00:22:54

QNo.1570478

困ってます

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

お礼コメントに「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

投稿日時 - 2005-08-10 03:32:44

お礼

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

投稿日時 - 2005-08-11 02:06:05

ANo.5

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

私も、C++とおっしゃっているのと質問文のコードから、値の所有者、あるいはカプセル化をしたいのだと、推察しました。
そうであれば(そうでなくても)グローバル変数は極力使わないのはプログラミングの基本ですから、ANo.5さんのようなフォームに属するプロパティとして扱うか、フォームに非可視のテキストボックスなどを配置する方法もあります。

非可視のテキストボックスはあまり良い方法ではないかもしれませんが、そもそもクラスを定義してフォームに配置するのと、よく似ています。また、フォームに存在するテキストボックスを参照したらフォームがロードされるのは当然で、アンロードが必要になります。

ANo.4さんもおっしゃるように、質問文のコードでは、パラメーターを渡してフォームを開いているようですから(そして受け取って処理をする?)、やはり最もスマートなのはクラスでしょう。
パラメーターを渡す、開く、必要なら戻り値を返す、という処理を1度にできます。
簡単な例では、
 『一定時間だけ入力ボックスを表示して、時間切れになったら閉じる』
というような機能を持つオブジェクト考えてみますと

strRes = WaitInputBox("名前は?", 10000)

と呼び出すと10000ミリ秒だけ返事を待つボックスを表示して、入力値をstrRes に戻す、というようなことも可能になります。
もちろんどこからでも呼び出せて、"名前は?"や 10000などの値はカプセル化されて渡すことができます。受け渡し方やShowなども意識する必要がなくなります(すなわちカプセル化ですが)。

~~~~~~
ところで余計ですが、どの方法に賛成などという回答投稿は、あまりに不毛では…?
決して批判するつもりはありませんが…。
皆さんが情報を提供して、それらを参考にanan23さんが決めれば良いし、別に選ばれても選ばれなくても、絶対的な方法ではないわけですし、知識として今後の役にも立つでしょう。
私も必要ならグローバル変数を使うこともあります。
考え方も人それぞれ、最良な方法もケースバイケースです。視野は広く選択肢は多い方がいいわけです。狭い視野や固執した考えはプログラムやアイデアの障害になります。
ANo.3さん、ANo.4さん、ANo.5さんのように柔軟に考えたほうが今後の成長につながると思いますよ。

投稿日時 - 2005-08-10 13:41:16

お礼

そんなこともできるんですか!
結構いろいろ使いかたがありそうですね。
勉強します。

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

ありがとうございます。

投稿日時 - 2005-08-11 02:12:06

ANo.6

NO-2 さんに 一票

投稿日時 - 2005-08-10 10:06:34

ANo.4

> VBでのクラスってゆうのはユーザー定義型(構造体)のことですか?
> C++みたいなクラスも定義できるのですか?

VBでいうクラスというのは構造体(ユーザー定義型)などとは微妙に違っていて、オブジェクト指向っぽいことができる、というようなものです(かなり曖昧な説明ですが…)。
↓ここなど参考になるのでは
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html

グローバル変数を使わない方法ということで紹介しましたが、手軽なのは皆さんおっしゃるようにグローバル変数ですね。
とはいえ、C++的な考えをお持ちのようだと言うことと、確かにグローバル変数は可能なら避けた方が良いのは言うまでもありませんから、選択肢の一つとしてクラスもありなのは間違いないと思います。
ANo.3のかたも書かれているように、それなりに便利なものです。
なぜなら、今回のご質問からの推測に過ぎませんが、単に値を受け渡すだけでなく、呼び出し時にセットしてそれに応じて何らかの動作をさせたい、というコードに見えますので、クラスならセットされた値に応じてそれ自体が処理を行うことが可能になり、その意味ではスマートになるでしょう。

ちなみに、参照するとロードされるのはフォーム上に配置されたオブジェクトと同様ですので、アンロードを忘れなければ問題ありません。
そもそもオブジェクトはPublicになります。

あくまでも、詳細が解らないので、どちらかをすすめるという意味ではありません。参考になれば。

投稿日時 - 2005-08-10 02:42:09

お礼

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

投稿日時 - 2005-08-11 02:01:38

ANo.3

基本的にフォームモジュールでPublic宣言はしない方が良いです。その変数が参照されると、ロードしていないのにフォームがロードされた状態になり、全ての画面が閉じられても、アプリケーションが終了されない(タスクに残っている)状態になります。

学び始めたばかりなら、No.2の回答者のご意見が適切でしょう。但し、クラスのメリットもあるので、おいおい勉強していって下さいね。

投稿日時 - 2005-08-10 01:29:59

お礼

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

投稿日時 - 2005-08-11 01:57:08

ANo.2

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

投稿日時 - 2005-08-10 00:55:57

お礼

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

投稿日時 - 2005-08-10 01:27:01

ANo.1

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

投稿日時 - 2005-08-10 00:41:59

お礼

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

>値を保持するためだけのクラスを定義してしまう

ということは結局構造体?
検証中、、、

投稿日時 - 2005-08-10 01:31:44

あなたにオススメの質問