• ベストアンサー

Property Letについて

このようなステートメントがたくさんあります。 これはいったい何をしているのでしょうか? Property Get と Property Setについても同様に分りません。 どなたか教えていただけないでしょうか。

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

理解困難ですか? 些細な事でも、わからなかったら遠慮なく聞いてくださいね。 Property関係を熟知するVBプログラマは、ぼくの周りにも少ないです。 流れがわかっていても、どうやったら効果的/有効的になるかがわかってないのです。だから、そういう人はPropertyを使用しようともしません。 むやみやたらにPropertyを使用するのはお奨めしないけど、たくさんのサンプルプログラムを作成し、慣れない関数を多用し、研究する努力が必要だと思います。 Propertyを使用しなくても済む部分をPropertyを使用してみるとかするのもいいと思います。 作成した後、本当にPropertyは必要なのか、Propertyを使用することによって、プログラミング的に効果的であったかなどの検証をして学ぶと、より早く身に着くと思います。 むずかしい分野ですが、がんばってくださいね。

saruno
質問者

お礼

大変ありがとうございます。 Getに関しては何とか理解できました。 本当に長い間付き合っていただきました。改めてお礼申し上げます。 あとは繰り返し自分でコードを書いてみて覚えるしかないと思います。 自分で使ってみて新たな疑問を作り出してまた改めて質問をさせていただきます。 その時はまたよろしくお願い致します。 本当にありがとうございました(深く深く礼)。

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

>「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++に共通する部分があります。すごく奥の深いお題目です。用意に説明できるものでは無いと思ってます。ぼくも完全に極めているわけではないですが、バシバシ質問してください。 これは自己紹介にも書いているのですが、こうやって答える事が自分自身のスキルアップにつながると思ってます。 お互いがんばりましょう。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました。 この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 として区別できます。 理解できたでしょうか? まだわからなかったら、とことんお付き合いしますよ。

saruno
質問者

補足

>> まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました ありがとうございました。 今、コントロール相手に格闘していますが、少しずつ理解ができるようになってきました。 本題のほうに入らせていただきます。 >変数にオブジェクトを代入する時(普通のプログラムでSetが必要な型) → Set >変数に値を代入する時(普通のプログラムでSetが必要の無い型) → Let これに関して僕なりの考えをいいますと、 「Set/Letでプロパティに値を渡してあげている」という感じがします。 どうでしょうか。 ここで新たな疑問が湧いてきました。 「Getは値を取得する」とありましたが、取得とはどのような動きを指しているのでしょうか。取得と代入の違いがいまいち分っていません。 理解は進んだと感じていますがなんか混乱してきました(汗)。 あきれずに教えてください!お願いします(深く深く礼)。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

おおーレスがあったのですねー 気が付きませんでしたー _(..)_ごめんなさい。。。 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] を使用した内部構造を作成しなければなりません。 大まかに言うと、変数でいう構造体みたいなものです。(大まか過ぎるかな?) 少しつかめました? 疑問があったらレスください。

saruno
質問者

補足

ありがとうございます。 だんだん理解が進んできました。 もう少し聞きたいのですが、 Getは代入と同じニュアンスでとらえてよろしいのですか? Set/Letに関してもオブジェクト変数に値をセットする感覚でしょうか? しつこくてすみませんが、宜しくお願い致します。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

フォームやクラスモジュールに、新たにプロパティを追加するときに使います。 例えば、管理者モードと利用者モードの二つのふるまい方をする入力フォームを作りたいとしましょう。 仕様としては、入力フォーム内部では、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 は 変数であっても、オブジェクトであっても使えます。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

主にユーザコントロールやクラスを作成するときに使用するのですが、フォームでも使用可能です。 デザイン画面でプロパティウィンドウってありますよね。 あれにオリジナルのプロパティを追加するものだと思ってください。 MSDNにサンプルも入ってますよ。デバッグした方がつかめるかも? ぼくのマシンでは \Program Files\Microsoft Visual Studio\MSDN\2000OCT\1041\SAMPLES\VB98\ にサンプルがあります。その中でもDatAwareって言うのが一番わかりやすいと思います。 ちなみにMSDNのバージョンによって2000OCT\1041ではないと思いますので、注意してください。 もしサンプルがなかったらMSDNのCDに入ってると思います。SAMPLESでCD内を検索したら見つかると思います。 ユーザーコントロールやクラスファイルの存在するサンプルには、全てProperty [Let/Get]があるはずです。

saruno
質問者

補足

ありがとうございます。 サンプルでデバック実行してみました。 なんとなくわかったような分らないような感じです。 >>ユーザーコントロールやクラスファイルの存在するサンプルには、全て     Property [Let/Get]があるはずです これの理由を教えていただきませんでしょうか。 申し訳ありません。お願い致します。

関連するQ&A

  • Property Let Property Get について

    こんにちは。 <Class1> Private myData(10) as String というクラスがあります。 Property Let とProperty Get を使って myData()の任意の位置のデータを Let/Get したいのですが どうやったら出来ますか? 教えてください。 よろしくお願いします。

  • 「ByRef」のヘルプが見たい

    「ByRef」の意味が分からないので、「ByRef」にカーソルをあてて、F1を押したら、 ------------------------------------ ByRef キーワード キーワード ByRef は、次の構文で使用します。 Call ステートメント Declare ステートメント Function ステートメント Property Get ステートメント Property Let ステートメント Property Set ステートメント Sub ステートメント ------------------------------------ と出て、ByRefの説明は見れないのですが、 どうやったらヘルプでByRefの説明を見る事が出来ますか? WEBじゃなくて、オフィスのヘルプで見る方法を教えてください。

  • プロパティープロシージャーについて

    簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数がPrivate strnameだったりするので そこへアクセスするためにプロパティプロシージャーを使っているというところまでは 判ったような気がしますが、 getとsetの関係がわかりません。 まず、 1.何をGetしているのか 2.なぜGetが先に来るのか、 3.Setの前にGetのReturnで返してますが実態は何を返しているのでしょうか?普通に考えると逆のような気がします。 根本がわかっていないのだと思いますが、どなたかお教え願います。 呼ぶ方 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim person As New Class1() person.Name = TextBox1.Text person.Birthday = DateTimePicker1.Value.Date MessageBox.Show(person.Name & "さんの年齢は" & person.GetAge()) End Sub クラスの方。 Public Class Class1 Private strname As String Private datBirthday As Date Public Property Name() As String Get Return strname End Get Set(ByVal pro_name As String) strname = pro_name End Set End Property Public Property Birthday() As Date Get Return datBirthday End Get Set(ByVal pro_birthday As Date) datBirthday = pro_birthday End Set End Property Public Function GetAge() As Integer Return Int(DateTime.Today.Subtract(Birthday).Days / 365.25) End Function End Class

  • プロパティについて

    長年他の言語をやってきまして、VB.NETでピンと来ていない点があります。どなたかご教授ください。 あるクラスのプロパティとセッターゲッターについて2通りの 書き方ができると思っています。 以下の1、2の違いはありますでしょうか?入門書やネット上を検索 すると1の例で記述されますが、経験上2のような書き方をしてしまうため気になっております。 1. Private _hoge As Integer = 0 Public Property Hoge() As Integer  Get   Return _hoge  End Get  Set(ByVal Value)   _hoge = Value  End Set End Property 2. Private _hoge As Integer = 0 Public Function getHoge() As Integer  Return _hoge End Function Public Sub setHoge(ByVal val As Integr)  _hoge = val End Sub

  • VBA プロパティについて

    仕事で必用になり、プログラミングを学んでいる者です。 VBAでの基本的なことですが、教えていただきたいことがあります。 例えば・・・ Cells(i, j).value = "あああ" のようなステートメントがあったとき Cells(i, j) の部分をオブジェクト .value の部分をプロパティと考えていいですか? もしそうだとすると、 Cells(i, j).Interior.ColorIndex = i のようなステートメントは Cells(i, j) オブジェクト .Interior プロパティ .ColorIndex プロパティのプロパティ?? ということになるのでしょうか? ちょっと概念が整理できていません。 よろしくお願い致します。

  • C#でインターフェースのプロパティのアクセス修飾子

    お世話になります。 C#でインターフェースに定義した抽象プロパティで、アクセシビリティまで設定したいです。 例として抽象プロパティHelloのgetをpublic、setをinternalに設定したい場合、次の様に書くと怒られます。 string Hello { get; internal set; } ←"アクセシビリティ修飾子をインターフェイスのアクセサーで使用することはできません。" 抽象プロパティにsetを定義せず、サブクラスでinternalを設定して実装する分には怒られませんが、 この場合はサブクラスに対してsetの実装を強制できませんし、 当然API(インターフェース)型変数からsetの実装を呼び出せません。 全てのクラスはAPIからのみ利用させたいと考えていて、 かつプロパティのset、getで設定したいアクセス修飾子が異なる様な場合、 プロパティを使用せず自前でアクセッサを作るしか無いのでしょうか? 何かおいしい逃げ方がありましたらご教示いただけるとありがたいです。 宜しくお願いします。

  • cellsプロパティ列名をアルファベットに変える

    ●質問の主旨 cellsプロパティで表された列名をアルファベットに 変えるためにはどのようなコードを使えばよいでしょうか? 例)cells(4,5)→E列 ●質問の補足 cellsプロパティで取り出された行数を Rangeプロパティを表したいと考えております。 上記の例を使うと、 Range("cells(4,5)→E列 & 4")というプロパティを作成し、 Setステートメントを使用した「Rangeオブジェクト」に したいと考えております。 ご存知のかたご教示よろしくお願い申し上げます

  • プロパティのアクセス修飾子

    オート・インプリメント・プロパティで、 Property Prop2 As String = "Empty" と書いた場合の、Propertyのアクセス修飾子はPublicになるのでしょうか? あるVBの記述で、 Private CurrentValue As Integer Private Property Current As Integer Get Return CurrentValue End Get Set(ByVal value As Integer) CurrentValue = value    その他諸々の記述   End Set End Property というのがあるのですが、外部から、 Current += 1 などのようにアクセスしています。 この場合、Property Current As Integer のアクセス修飾子がPrivateになっているのですが、 Public とした場合と何が違うのでしょうか? ちなみに両方でやってみましたが、動作は変わりませんでした。 御経験のある方、御教示願えたらと思います。

  • ユーザーコントロールに選択プロパティを出す?

    VB.NET2005のWEBユーザーコントロールでプロパティを作り、それをコントロールを配置したときのプロパティウィンドウから選択させたいのですが、書籍やネット等を調べてもわかりませんでした。。。現状のソースは Public Property TEST() As String Get Return "" End Get Set(ByVal value As String) if value = 1 then me.close end if End Set End Property です。 これでプロパティウィンドウにTESTという項目はでますが、値を入力しないといけません。よくあるBackColorのプロパティのようにリストから選択できるようにしたいのですがどうしたらいいでしょうか? それともカスタムコントロールでないとできないのでしょうか?

  • VB2010 のユーザコントロールのプロパティ

    お世話になっております Windows7、VB2010 Expless で開発しております 後にVS2010のVBに移行する予定です ユーザコントロールでテキストボックスを作っております そこで、初期値を設定しようと思い設定をしたのですが反映されません Imports System.ComponentModel <DefaultValue(True)> Public Property Chk_Num() As Boolean Set(ByVal value As Boolean) If (value = True) Then blnChk_Num = value Else blnChk_Num = value End If End Set Get Return blnChk_Num End Get End Property <System.ComponentModel.DefaultValueAttribute(1)> Public Property Chk_ZenHankaku() As Integer Set(ByVal value As Integer) If (value >= 0 And value <= 2) Then '0以上2以下 blnChk_ZenHankaku = value Else 'マイナス、または3以上の場合は0にする blnChk_ZenHankaku = 0 End If End Set Get Return blnChk_ZenHankaku End Get End Property どちらの方法でも、Booleanの場合は「False」、Integerの場合は「0」になってしまいます また、初期化~プロパティ宣言間に、改行しても改行しなくても結果は同じです どうにか設定できる方法はありますでしょうか よろしくお願いします