>「Set/Letでプロパティに値を渡してあげている」という感じがします。
>どうでしょうか。
ズバリです。
>ここで新たな疑問が湧いてきました。
>「Getは値を取得する」とありましたが、取得とはどのような動きを指しているのでしょうか。取得と代入の違いがいまいち分っていません。
もっと疑問の生まれるような発言をしちゃいます。
主にProperty関係はユーザコントロールやクラスで使用するのですが、実際に簡単なものに触れてみましょう。
プロジェクトを作成してください。
プロジェクトウィンドウで右クリックして「追加」→「ユーザコントロール」を指定してください。
以下のコードをユーザコントロールにセットしてください。
-----------
Option Explicit
'おなじみのモジュール変数
Private m_Text As String
'Textプロパティの値の入力処理
Static Property Let Text(String1 As String)
m_Text = String1
End Property
'Textプロパティの値の出力処理
Static Property Get Text() As String
Text = m_Text
End Property
'プロパティの値を読む
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
m_Text = PropBag.ReadProperty("Text", "デフォルト文字")
End Sub
'プロパティの値を保持
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Text", m_Text
End Sub
-----------
このユーザコントロールはTextプロパティを持つようになりました。
#2のARCさんのサンプルは別にPropertyでなくてもいい事です。変数で済んじゃいます。
しかしReadPropertiesとWritePropertiesを使用することがPropertyを生かす事になります。
上記のコードを張ったユーザコントロールが作成できたら、ユーザコントロールのコードの書かれたモジュールとユーザコントロールのフォームを閉じて、フォーム1を開いてください。画面左側のツールボックスの中に、ユーザコントロールが登場します。それを選択して、貼り付けてください。テキストプロパティを持ったユーザコントロールがフォーム1に作成されます。
テキストプロパティに”ああああ”をセットして、プロジェクトを閉じてください。それからもう一度プロジェクトを開いてみてください。フォームの中のユーザコントロールに”ああああ”が保持されているはずです。
保持はWritePropertiesで行われています。
起動時にReadPropertiesが行われて、m_Textに”ああああ”がセットされます。
デザイン時にユーザコントロールを選択すると、プロパティウィンドウにユーザコントロールの一覧が出ますよね?それはProperty Get があるおかげで、表示されてるのです。
ためしにフォーム1にコマンドボタン1を作成し
Private Sub Command1_Click()
MsgBox UserControl1.Text
End Sub
として、F8を連打(ステップ実行)して見てください。
MsgBoxを表示するタイミングで、ユーザコントロールのProperty Get Textを通るはずです。
MsgBoxはUserControl1のテキストプロパティの内容を表示するために、テキストプロパティの内容を要求します。要するにテキストプロパティの取得をするわけです。
今度はフォーム1にコマンドボタン2を作成し
Private Sub Command2_Click()
UserControl1.Text = Now()
End Sub
としてステップ実行してみてください。
コマンドボタン2を押した時、テキストプロパティのセットですので Property Let Textを通ります。
これでユーザコントロールのm_Text変数が更新されていますので、今度はコマンドボタン1を押したらコマンド2を押した時間が表示されるはずです。
このプログラム中でセットした値は、WritePropertiesに反映されません。デザイン時に設定した値を保持します。
ですので、次回起動した時もテキストプロパティは"ああああ"という値を持っています。
もっと難解になったでしょうか?
>理解は進んだと感じていますがなんか混乱してきました(汗)。
>あきれずに教えてください!
プロパティの質問はC++に共通する部分があります。すごく奥の深いお題目です。用意に説明できるものでは無いと思ってます。ぼくも完全に極めているわけではないですが、バシバシ質問してください。
これは自己紹介にも書いているのですが、こうやって答える事が自分自身のスキルアップにつながると思ってます。
お互いがんばりましょう。
まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました。
このProperty Get/Let/Setはサンプルはあちこちに落ちてますが、説明が詳しく出てる書物は少ないので、わかりづらいと思います。
>しつこくてすみませんが
(・_・三・_・)ウウン
そんなこたぁありません。向上心があることはいい事です。そのしつこさが発展につながると思います。
ぼくもVBを覚える時には、今では恥ずかしくなってしまうような事をたくさん聞きまくってました。
>Getは代入と同じニュアンスでとらえてよろしいのですか?
>Set/Letに関してもオブジェクト変数に値をセットする感覚でしょうか?
ズバリです。
犬オブジェクトのプロパティに
「名前」
「首輪の有無」
「吠え方」
「おしっこの仕方」
「買主の名前」
があった時、
Set/Letで値やオブジェクトを代入
Getで値やオブジェクトを取得
します。
Set/Letの使い分けですが、型によって違います。
例えば普通のプログラム内で
Dim i As Long
Dim Frm As Form
などがあったとき、これらの変数は
i = 5
Set Frm = Form1
などとして使用します。
この使用方法と一緒で、
変数にオブジェクトを代入する時(普通のプログラムでSetが必要な型) → Set
変数に値を代入する時(普通のプログラムでSetが必要の無い型) → Let
として区別できます。
理解できたでしょうか?
まだわからなかったら、とことんお付き合いしますよ。
質問者
補足
>> まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました
ありがとうございました。
今、コントロール相手に格闘していますが、少しずつ理解ができるようになってきました。
本題のほうに入らせていただきます。
>変数にオブジェクトを代入する時(普通のプログラムでSetが必要な型) → Set
>変数に値を代入する時(普通のプログラムでSetが必要の無い型) → Let
これに関して僕なりの考えをいいますと、
「Set/Letでプロパティに値を渡してあげている」という感じがします。
どうでしょうか。
ここで新たな疑問が湧いてきました。
「Getは値を取得する」とありましたが、取得とはどのような動きを指しているのでしょうか。取得と代入の違いがいまいち分っていません。
理解は進んだと感じていますがなんか混乱してきました(汗)。
あきれずに教えてください!お願いします(深く深く礼)。
おおーレスがあったのですねー
気が付きませんでしたー
_(..)_ごめんなさい。。。
MSDNのサンプルを見てくれたのですねー
そしたら次の段階を説明します。
まず前提に・・・
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
これの意味はわかりますか?
構造体ですね。
これを宣言してると
Dim workRect As RECT
RECT構造をもったworkRect変数
として、プログラム内で宣言することができます。
ユーザーコントロール、クラスファイルは変数ではありません。
ユーザーコントロールはオブジェクトであり
クラスファイルはクラスとして使用します。
ちょっと難しいかも知れませんが、変数以外のものとして捕らえてください。
コントロールの一つにテキストボックスがありますよね?
あれにも属性があります。
Aiignment
Appearance
BackColor
Text
などです。
これらはテキストボックスの属性(プロパティ)を表したり、値をセットすることができます。
それが Property [Get][Set/Let]です。
イメージとしては
Private Type TextBox
Aiignment As Long
Appearance As Long
BackColor As Long
Text As String
End Type
こんな感じでしょうか?
しかしTextBoxは変数の構造ではなく、オブジェクトの構造ですので、こういう書き方ではダメなのです。
そこで値を取得する時は
Property [Get]
値をセットする時は
Property [Set/Let]
を使用した内部構造を作成しなければなりません。
大まかに言うと、変数でいう構造体みたいなものです。(大まか過ぎるかな?)
少しつかめました?
疑問があったらレスください。
フォームやクラスモジュールに、新たにプロパティを追加するときに使います。
例えば、管理者モードと利用者モードの二つのふるまい方をする入力フォームを作りたいとしましょう。
仕様としては、入力フォーム内部では、mMode という変数を参照して、mModeが0のときは利用者モードとしてふるまい、mModeが1のときは管理者モードとしてふるまうものとします。
入力フォーム外部から動作モードを切り替えるには、Modeプロパティに0か1かを指定する物とします。また、それ以外の値を指定したときは、エラーメッセージを表示するとします。
このような場合は、以下のようにプログラムを組みます。(コードを見たほうが説明するより分かりやすいと思うんで)
入力フォームのコード
'(Genaral)(Declarations)
Dim mMode As Long '動作モード
'Modeプロパティ
Property Let Mode(Mode_ As Long) 'Modeプロパティを設定したときの動作
Select Case Mode_
Case 0
mMode = 0 '利用者モードに切り替える
Case 1
mMode = 1 '管理者モードに切り替える
Case Else
'エラーメッセージを吐く
Msgbox "指定した動作モードは定義されていないです。"
End Select
End Property
Property Get Mode() As Long 'Modeプロパティを取得したときの動作
Mode = mMode 'Modeプロパティの値として、mMode変数の値を返す。
End Property
Sub Form_Initialize()
mMode=0 '動作モードの初期値は利用者モード
End Sub
Sub フォーム中のコード()
Select Case mMode
Case 0
'利用者モードのときのふるまいを記述
Case 1
'管理者モードのときのふるまいを記述
End Select
End Sub
+-+-+-+-+-+-+-+-
入力フォームを呼び出すコード(Visual Basic用のコード。VBA用のコードではない)
Sub 入力フォームを管理者モードで開く()
Load 入力フォーム 'フォームを準備
入力フォーム.Mode = 1 '管理者モードに切り替え
入力フォーム.Show 'フォームを表示
End Sub
尚、Property Let と Property Set は機能的には同じ物です。
Property Let は 変数をプロパティに指定するときに使い、Property Set はオブジェクトをプロパティに指定するときに使います。
Property Get は 変数であっても、オブジェクトであっても使えます。
お礼
大変ありがとうございます。 Getに関しては何とか理解できました。 本当に長い間付き合っていただきました。改めてお礼申し上げます。 あとは繰り返し自分でコードを書いてみて覚えるしかないと思います。 自分で使ってみて新たな疑問を作り出してまた改めて質問をさせていただきます。 その時はまたよろしくお願い致します。 本当にありがとうございました(深く深く礼)。