まだまだ勉強中の初心者なのですが、お願いします。
今同プロジェクト内の 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.4
- 回答日時:
> VBでのクラスってゆうのはユーザー定義型(構造体)のことですか?
> C++みたいなクラスも定義できるのですか?
VBでいうクラスというのは構造体(ユーザー定義型)などとは微妙に違っていて、オブジェクト指向っぽいことができる、というようなものです(かなり曖昧な説明ですが…)。
↓ここなど参考になるのでは
http://homepage1.nifty.com/CavalierLab/lab/vb/cl …
グローバル変数を使わない方法ということで紹介しましたが、手軽なのは皆さんおっしゃるようにグローバル変数ですね。
とはいえ、C++的な考えをお持ちのようだと言うことと、確かにグローバル変数は可能なら避けた方が良いのは言うまでもありませんから、選択肢の一つとしてクラスもありなのは間違いないと思います。
ANo.3のかたも書かれているように、それなりに便利なものです。
なぜなら、今回のご質問からの推測に過ぎませんが、単に値を受け渡すだけでなく、呼び出し時にセットしてそれに応じて何らかの動作をさせたい、というコードに見えますので、クラスならセットされた値に応じてそれ自体が処理を行うことが可能になり、その意味ではスマートになるでしょう。
ちなみに、参照するとロードされるのはフォーム上に配置されたオブジェクトと同様ですので、アンロードを忘れなければ問題ありません。
そもそもオブジェクトはPublicになります。
あくまでも、詳細が解らないので、どちらかをすすめるという意味ではありません。参考になれば。
なるほど!たしかにC++やってたのでオブジェクト指向よりだったのですが、C++になれるとVBでのクラス化ってゆーのがピンとこないんですよね。URL参考にさせていただきます。ありがとうございます。
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さんのように柔軟に考えたほうが今後の成長につながると思いますよ。
そんなこともできるんですか!
結構いろいろ使いかたがありそうですね。
勉強します。
確かにこの質問は私が今までした質問で一番回答が多いです。みなさん自分なりの流儀があるようですね。
私は今回はちょっと時間もあまりないのでとりあえずグローバルで、と考えております。
クラスは使えるとなかなか便利そうなのでおいおい勉強したいと思っています。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
MFCアプリのコマンドラインでパ...
-
クラスの作成方法を教えてください
-
名前空間について
-
コンソールアプリでのクリップ...
-
既定のコンストラクタがない?
-
DataGridViewのセルに斜線を引...
-
DLLからEXEのクラスを呼び出す...
-
CViewクラスの切り替え
-
ダイアログ表示時にチェックボ...
-
MFC CSplitter内にコントロール...
-
C#で通常のbuttonコントロール...
-
VB2008: 継承の場合のコンスト...
-
[MFC] CWnd::MessageBoxの警告...
-
エディットコントロールでEnter...
-
Visual C++のアプリケーション...
-
ボタンのオーナードローについて
-
IncludeではなくClassで宣言す...
-
DateAdd関数について質問があり...
-
EXCEL VBAでのマッチング処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
MFCアプリのコマンドラインでパ...
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
【ASP.NET】 独自で作成したク...
-
派生クラスから基本クラスprote...
-
ダイアログクラスのコントロー...
-
C#で通常のbuttonコントロール...
おすすめ情報