まだまだ勉強中の初心者なのですが、お願いします。
今同プロジェクト内の 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
ほほう!!
こうゆう使い方があるんですね!
なるほどです。
これがVBでのクラスですか?思ったより簡単なつくりみたいですね。
参考になります!
ありがとうございました。
No.7
- 回答日時:
私も、C++とおっしゃっているのと質問文のコードから、値の所有者、あるいはカプセル化をしたいのだと、推察しました。
そうであれば(そうでなくても)グローバル変数は極力使わないのはプログラミングの基本ですから、ANo.5さんのようなフォームに属するプロパティとして扱うか、フォームに非可視のテキストボックスなどを配置する方法もあります。
非可視のテキストボックスはあまり良い方法ではないかもしれませんが、そもそもクラスを定義してフォームに配置するのと、よく似ています。また、フォームに存在するテキストボックスを参照したらフォームがロードされるのは当然で、アンロードが必要になります。
ANo.4さんもおっしゃるように、質問文のコードでは、パラメーターを渡してフォームを開いているようですから(そして受け取って処理をする?)、やはり最もスマートなのはクラスでしょう。
パラメーターを渡す、開く、必要なら戻り値を返す、という処理を1度にできます。
簡単な例では、
『一定時間だけ入力ボックスを表示して、時間切れになったら閉じる』
というような機能を持つオブジェクト考えてみますと
strRes = WaitInputBox("名前は?", 10000)
と呼び出すと10000ミリ秒だけ返事を待つボックスを表示して、入力値をstrRes に戻す、というようなことも可能になります。
もちろんどこからでも呼び出せて、"名前は?"や 10000などの値はカプセル化されて渡すことができます。受け渡し方やShowなども意識する必要がなくなります(すなわちカプセル化ですが)。
~~~~~~
ところで余計ですが、どの方法に賛成などという回答投稿は、あまりに不毛では…?
決して批判するつもりはありませんが…。
皆さんが情報を提供して、それらを参考にanan23さんが決めれば良いし、別に選ばれても選ばれなくても、絶対的な方法ではないわけですし、知識として今後の役にも立つでしょう。
私も必要ならグローバル変数を使うこともあります。
考え方も人それぞれ、最良な方法もケースバイケースです。視野は広く選択肢は多い方がいいわけです。狭い視野や固執した考えはプログラムやアイデアの障害になります。
ANo.3さん、ANo.4さん、ANo.5さんのように柔軟に考えたほうが今後の成長につながると思いますよ。
そんなこともできるんですか!
結構いろいろ使いかたがありそうですね。
勉強します。
確かにこの質問は私が今までした質問で一番回答が多いです。みなさん自分なりの流儀があるようですね。
私は今回はちょっと時間もあまりないのでとりあえずグローバルで、と考えております。
クラスは使えるとなかなか便利そうなのでおいおい勉強したいと思っています。
ありがとうございます。
No.4
- 回答日時:
> VBでのクラスってゆうのはユーザー定義型(構造体)のことですか?
> C++みたいなクラスも定義できるのですか?
VBでいうクラスというのは構造体(ユーザー定義型)などとは微妙に違っていて、オブジェクト指向っぽいことができる、というようなものです(かなり曖昧な説明ですが…)。
↓ここなど参考になるのでは
http://homepage1.nifty.com/CavalierLab/lab/vb/cl …
グローバル変数を使わない方法ということで紹介しましたが、手軽なのは皆さんおっしゃるようにグローバル変数ですね。
とはいえ、C++的な考えをお持ちのようだと言うことと、確かにグローバル変数は可能なら避けた方が良いのは言うまでもありませんから、選択肢の一つとしてクラスもありなのは間違いないと思います。
ANo.3のかたも書かれているように、それなりに便利なものです。
なぜなら、今回のご質問からの推測に過ぎませんが、単に値を受け渡すだけでなく、呼び出し時にセットしてそれに応じて何らかの動作をさせたい、というコードに見えますので、クラスならセットされた値に応じてそれ自体が処理を行うことが可能になり、その意味ではスマートになるでしょう。
ちなみに、参照するとロードされるのはフォーム上に配置されたオブジェクトと同様ですので、アンロードを忘れなければ問題ありません。
そもそもオブジェクトはPublicになります。
あくまでも、詳細が解らないので、どちらかをすすめるという意味ではありません。参考になれば。
なるほど!たしかにC++やってたのでオブジェクト指向よりだったのですが、C++になれるとVBでのクラス化ってゆーのがピンとこないんですよね。URL参考にさせていただきます。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラスのアドレスを引数として...
-
既定のコンストラクタがない?
-
エディットコントロールでEnter...
-
ダイアログクラスのコントロー...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
MFCのドラッグ&ドロップについて
-
[MFC] CWnd::MessageBoxの警告...
-
vba sendKeysを送る相手のソフ...
-
モーダレスなメッセージボック...
-
.NET Frameworkのクラスのみで...
-
CViewクラスの切り替え
-
form1 から form2 へのデータの...
-
FriendとPublicの違い。。。
-
不要になった、普通の構造体の処理
-
C#で定数クラスをシングルトン...
-
C++ protectedにアクセス不可
-
リストコントロールをウィンド...
-
派生クラスのメンバを基底クラ...
-
コンソールアプリでのクリップ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
C++ protectedにアクセス不可
-
エディットコントロールでEnter...
-
このコンパイルエラーの意味に...
-
イベントにAddHandlerされてい...
-
DataGridViewのセルに斜線を引...
-
ダイアログクラスのコントロー...
-
【ASP.NET】 独自で作成したク...
-
OnInitDialog()の関数の組み込み方
-
C#で通常のbuttonコントロール...
-
MFCアプリのコマンドラインでパ...
-
MFCのCListCtrlでスクロールを検出
-
MFCのドラッグ&ドロップについて
-
正規表現 [^/]+ の意味を教えて
-
エディットコントロールのイベ...
-
関数の呼び出し元の検索
おすすめ情報