• ベストアンサー

Property Letについて

TAGOSAKU7の回答

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

関連する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」になってしまいます また、初期化~プロパティ宣言間に、改行しても改行しなくても結果は同じです どうにか設定できる方法はありますでしょうか よろしくお願いします