【あらすじ】
前回、VBAフォーム、DB接続クラス化入門①でフォームを使用してDB接続する記事を投稿したが、今回は、プロパティ、メソッドについて解説したいと思う。
以下のソースのテキストボックスに入力された値をローカル変数に格納していたが、Property を使用して、プロパティ値を取得、メソッドの処理を以下のソースとは別に、例を用いていく。
前回までのソースは以下の通り
Option Explicit
'--------------------------------------------------------------------
'変数宣言
'--------------------------------------------------------------------
Private lstrId As String
Private lstrUser_name As String
Private lstrEmail As String
Private lstrStatus As String
Private lstrInsDatefrom As String
Private lstrInsDateTo As String
'--------------------------------------------------------------------
'機能:bbsへDB接続
'test_user_data_hedに登録されているテーブルデータをリストへ表示するためのトリガー
'--------------------------------------------------------------------
Public Sub select_cmd_Click()
Dim dbconnect As mysql_connect
Dim ladoRs As ADODB.Recordset 'ローカルレコードセット変数
Dim ConnectFlg As Boolean '接続成功: True 接続失敗:False
Dim lstrSQL1 As String 'ローカルsql格納変数
Dim lintroop As Integer 'ループ変数
'例外処理⇒以下の記述でエラーが発生した場合にはエラーメメッセージ表示
On Error GoTo ErrHandler_End
'------------------【プロパティを用いた記述にできる部分】---------------
lstrId = ID_txt.Text
lstrUser_name = UserName_txt.Text
lstrEmail = Email_txt.Text
lstrInsDatefrom = InsDate_from_txt.Text
lstrInsDateTo = InsDate_to_txt.Text
'--------------------------------------------------------------------
【そもそもプロパティ、メソッドとは?】
オブジェクトには
- プロパティ
- メソッド
がある。
プロパティとはオブジェクトの属性や状態を指す。
辞書で調べてみると、特質、特性、などとも書かれている。
メソッドはオブジェクトの動作を指す。
こちらも辞書で調べてみると、作法、方法、などと書かれている。
はっきり言って、これだけでは全くしっくりこないので、例を出して考えてみる。
どこかで見たことがある記憶もあるかもしれないが、ポケモンを例に出して、
プロパティ、メソッドを解説してみたいと思う。
初代御三家のヒトカゲ、ゼニガメ、フシギダネにはそれぞれ、「属性」「技」を持っている
これがプロパティだ。
- ヒトカゲのプロパティは「炎」
- ゼニガメのプロパティは「水」
- フシギダネのプロパティは「草」「毒」
上記に加え、それぞれ「技」を持っている
次に「攻撃」、これがメソッド。
- ヒトカゲのメソッドは
「ひっかく」「ひのこ」「なきごえ」など - ゼニガメのメソッドは
「体当たり」「みずでっぽう」「しっぽをふる」など - フシギダネのメソッドは
「体当たり」「やどりぎのたね」「つるのむち」など
上記で前述した動きを表すものになっている。
これをオブジェクト指向的にまとめると
ポケモンというクラスから、ヒトカゲ、ゼニガメ、フシギダネというインスタンスを作って、プロパティ(属性値、技)、メソッド(技の攻撃)を定義することなる。
コードにしてみると、こういうことではないだろうか。
(ソースではヒトカゲの例で解説したいと思います。)
'-----------------------------------------------------------
'ポケモンクラスオブジェクトの作成
'-----------------------------------------------------------
Dim objHitokage As Pokemon
Dim lAttribute As String 'ローカルで使用する属性変数
Dim lAttack As String 'ローカルで使用する攻撃変数
'ヒトカゲのインスタンス化(New演算子を使ってヒトカゲの実態を生成、ヒトカゲが産まれた)
Set objHitokage = New Pokemon
'Pokemonクラスの属性プロパティにアクセス(Attribute_txt.textには炎を入力したと仮定)
objHitokage._Attribute = Attribute_txt.text
'Pokemonクラスのプロパティから属性を取得
lAttribute = objHitokage._Attribute
'Pokemonクラスの技プロパティにアクセス(Skill_txt.textにはひのこを入力したと仮定)
objHitokage._Skill = Skill_txt.text
'Pokemonクラスのプロパティから技を取得
lAttack = objHitokage._Skill
'引数を持たないポケモンクラスの_Attackメソッドにアクセス。
Call objHitokage._Attack
以下の
ポケモンクラスではfrmのtextに入力された値をプロパティ側でセットする処理(プロパティ)
_Attackメソッドにfrmからアクセスして、ダメージを与える処理、要するに動作(メソッド)
の処理が行われる
'-----------------------------------------------------------
'ポケモンプロパティ値の設定変数
'-----------------------------------------------------------
Private mAttribute As String '属性
Private mSkill As String '技
_______________________________________________________________________
'-----------------------------------------------------------
'プロパティ設定
'-----------------------------------------------------------
'vstrvalには「炎」という値が入っていて、プロパティ属性:mAttributeに「炎」をセット
Public Property Let _Attriibute (ByVal vstrval As String)
mAttribute = vstrval
End Property
_______________________________________________________________________
'LetでmAttributeに「炎」がセットされた値をfrm側へ返す
Public Property Get _Attriibute () As String
_Attriibute = mAttribute
End Property
_______________________________________________________________________
'vstrvalには「ひのこ」という値が入っていて、プロパティ技:mSkillに「ひのこ」をセット
Public Property Let _Skill (ByVal vstrval As String)
mSkill = vstrval
End Property
_______________________________________________________________________
'LetでmSkillに「ひのこ」がセットされた値をfrm側へ返す
Public Property Get _Skill () As String
_Skill = mSkill
End Property
_______________________________________________________________________
'-----------------------------------------------------------
'メソッドの実行(引数がない場合)
'-----------------------------------------------------------
'_Attackメソッド(攻撃)がヒットしたらダメージを与えるか否かの動き
Public Sub _Attack()
Const low As Integer = 1 '乱数low
Const high As Integer = 3 '乱数high
Dim i As Integer '乱数値格納変数
Dim Damage As Integer 'ダメージ変数
'1~3までの乱数値を設定
i = Int((high - low + 1) * Rnd + low)
'乱数値が1だった場合は10ダメージ与える,それ以外の場合はミス判定とし、0ダメージとする
If i = 1 Then
Damage = 10
Else
Damage = 0
End If
End Sub
上記の記述でプロパティ値に属性、技をセットすることができた。
また、メソッドの処理では、ダメージを与えることができたが、引数を使用した書き方ではなかった為、ダメージを与えるのみの動きだったが、
以下の部分で、引数がある書き方にすると、呼び出し側では「Call」ではなく、objHitokage._Attackメソッドに対して、(lAttack)で引数、攻撃(ひのこ)を渡して、状態異常の判定を行うことができる。
技が「ひのこ」だった場合に、状態異常FlgがTureとなり火傷を負わせる、Falseであれば、通常のままという処理にしてみたいと思う。
lStatusFlgを新たに宣言。
Dim lStatusFlg As Boolean '状態異常フラグを新たに宣言
'frmから、_Attackメソッドに引数lAttack(ひのこに設定した)を渡す。
'True:火傷 False:通常
lStatusFlg = objHitokage._Attack(lAttack)
引数がある場合、先ほどと異なるのが、メソッド側では、Public Sub ⇒ Public Functionとなり、
(ByVal strAttack As String)で引数lAttackをもらい、As Boolean型で攻撃がひのこだった場合で、なおかつ攻撃が当たった場合には、火傷を負わせるという判定を行うメソッドにする。
'-----------------------------------------------------------
'メソッドの実行(引数がある場合)
'-----------------------------------------------------------
'_Attackメソッド(攻撃)がヒットした場合となおかつ、攻撃がひのこだった場合、火傷を
'負わせる
Public Function _Attack(ByVal strAttack As String) As Boolean
Const low As Integer = 1 '乱数low
Const high As Integer = 3 '乱数high
Dim i As Integer '乱数値格納変数
Dim Damage As Integer 'ダメージ変数
'一度初期化
_Attack = False
'1~3までの乱数値を設定
i = Int((high - low + 1) * Rnd + low)
'引数で渡ってきた技がひのこであり、なおかつ乱数値が1だった場合は、ダメージを与え、
'状態異常値にTrue(火傷のフラグ)を返す
If strAttack = "ひのこ" And i = 1 Then
Damage = 10
_Attack = True
Else
Damage = 0
_Attack = False
End If
End Sub
以上がポケモンを例にした、プロパティ、メソッドについての解説です。
処理自体は簡単なものを例として記載したつもりです。
まだまだ未熟ゆえわかりづらい点があったかと思いますm(_ _)m
ほとんどの方はなじみのあるポケモンを例に出すことで、イメージがしやすいかと思い、上記のような投稿をしてみましたが、ポケモンじゃなくても、FFでもドラクエでもイメージしやすいものであれば、なんでも良いと思う。
FFならジョブ、魔法、召喚獣など。
ドラクエなら職業、特技など。
以下はオブジェクト指向について参考にさせていただいたURLです。