sql >> データベース >  >> RDS >> Access

MS-Accessの基本クラスと派生オブジェクト

    はじめに。

    Microsoft Access Class Moduleに関する以前の投稿をまだご覧になっていない場合は、続行する前にそれらを確認してください。リンクは以下のとおりです。

    1. MS-AccessクラスモジュールとVBA。
    2. MS-AccessVBAクラスオブジェクト配列。

    ClsArea クラスは別のクラスオブジェクトの基本クラスとして実行できます。基本クラスによって実行された計算は、新しいオブジェクトの計算の一部として使用できます。たとえば、何かの体積を計算するオブジェクトの一部にすることができます。

    dbl dblLength およびdblWidth Get / Letのプロパティプロシージャ名 プロシージャは、クラスオブジェクトが倍精度の数値で長さと幅の値を期待していることを示しているにすぎません。同様に、プロパティプロシージャ名をQuantityとUnitPriceに変更すると、最初の値に2番目の値を掛けると、あるアイテムの合計価格がわかります。

    これは、ClsAreaクラスを基本クラスとして使用できることを意味します。たとえば、合計価格*税額を計算するための税率、または合計価格*割引率を使用して割引額を見つけるなど、最初の値に2番目の値を掛けた結果が必要な場合はいつでも等々。

    単純なクラスモジュールを開発しましたが、他の多くの派生クラスの一部にすることができます。可能性はあなたの想像力と創造性に開かれています。

    ClsAreaクラスは、長さと幅のプロパティのみを使用して、マテリアル、部屋、または同様のアイテムの面積を計算します。三角形または円の面積は計算されません。ただし、ストレージ容量を見つけるために部屋、倉庫のボリュームを計算する新しいクラスオブジェクトの一部にすることができます。そのためには、部屋の高さ、倉庫など、もう1つの値が必要です。

    ボリュームクラス:ClsVolume。

    新しいクラスモジュールClsVolume、を作成しましょう ClsAreaを基本クラスとして使用します。クラスモジュールを挿入し、その名前を変更します ClsVolumeのプロパティ 。次のコードを入力するか、コピーしてクラスモジュールに貼り付けます。

    Option Compare Database
    Option Explicit
    
    Private p_Area As ClsArea
    Private p_Height As Double
    
    Private Sub Class_Initialize()
        Set p_Area = New ClsArea
    End Sub
    
    Private Sub Class_Terminate()
        Set p_Area = Nothing
    End Sub
    
    Public Property Get dblHeight() As Double
        dblHeight = p_Height
    End Property 
    
    Public Property Let dblHeight(ByVal dblNewValue As Double)
       Do While Val(Nz(dblNewValue, 0)) <= 0
          dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0)
        Loop
        p_Height = dblNewValue
    End Property
    
    Public Function Volume() As Double
    
    If (p_Area.Area() > 0) And (p_Height > 0) Then
        Volume = p_Area.Area * p_Height
    Else
        MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume"
    End If
    
    End Function
    

    ClsVolumeクラスオブジェクトのコードはまだ完成していません。コードを1行ずつ調べてみましょう。プライベートプロパティとして宣言された3行目p_Area ClsAreaクラスオブジェクトの。

    次の行は、 p_Heightという名前の私有財産を宣言しています データ型Doubleの。

    Class_Initialize()およびClass_Terminate()サブルーチン。

    次の2つのサブルーチン( Initialize() およびTerminate() )ここでは非常に重要です。

    Initialize() ClsAreaオブジェクトを実行してインスタンス化します ClsVolumeクラスを使用してインスタンス化するときにメモリ内に 標準モジュールプログラムのオブジェクト。

    ステートメントを実行すると、 Set ClsVolume =Nothing 標準モジュールプログラムで、メモリからClsVolumeオブジェクトをクリアするには、 Terminate() サブルーチンが実行され、ClsAreaオブジェクトが占有していたメモリスペースが解放されます。

    プロパティGetdblHeight プロシージャは、 p_Heightから値を返します 呼び出し側プログラムの所有物。

    プロパティLetdblHeight プロシージャは、 NewValueに渡された値を検証します パラメータを設定し、それをプライベートプロパティ p_Heightに割り当てます 。

    Public Function Volume()は、 p_Area.Area()を呼び出して、ボリュームを計算します。 関数と返された面積の値にp_Heightを掛けて、次の式でボリュームを計算します。ボリューム=p_Area.Area*p_Height。ただし、このステートメントを実行する前に、検証チェックを実行して、p_Area.Area()関数がゼロより大きい値を返すことを確認します。これは、p_Area.dblLength、p_Area.dblWidthプロパティに有効な値があり、p_Heightプロパティ値がより大きいことを示します。ゼロ。

    注: 以来、 p_Area クラスClsAreaのオブジェクトは、プライベートとして定義されています ClsVolumeクラスのプロパティプロパティ( strDesc、)を作成する必要があります dblLength、 dblWidth およびArea() 関数) Get / Letのために外の世界に見える 操作とエリア値を返します。つまり、ClsVolumeクラスモジュールのClsAreaクラスオブジェクトのstrDesc、dblLength、dblWidthプロパティ、およびArea()関数のGet/Letプロパティプロシージャも定義する必要があります。

    Let/Getプロパティプロシージャ。

    次のプロパティを追加しますGet/ Let 手順とArea() ClsVolumeクラスモジュールコードへの機能:

    Public Property Get strDesc() As String
       strDesc = p_Area.strDesc
    End Property
    
    Public Property Let strDesc(ByVal NewValue As String)
       p_Area.strDesc = NewValue
    End Property
    
    Public Property Get dblLength() As Double
       dblLength = p_Area.dblLength
    End Property
    
    Public Property Let dblLength(ByVal NewValue As Double)
       p_Area.dblLength = NewValue
    End Property
    
    Public Property Get dblWidth() As Double
       dblWidth = p_Area.dblWidth
    End Property
    
    Public Property Let dblWidth(ByVal NewValue As Double)
       p_Area.dblWidth = NewValue
    End Property
    
    Public Function Area() As Double
        Area = p_Area.Area()
    End Function
    
    

    strDesc()プロパティプロシージャGet/Letコード行を確認してください。プロシージャ名の使用法strDesc 別の名前を使用したい場合は、単に選択の問題です。ただし、ClsAreaクラスで使用した元のプロパティ名はstrDescです。ここでその元の名前を使用すると、元のClsAreaクラスオブジェクトとの関係が思い出されます。

    次のGetdblLength()プロパティプロシージャでは、 =の右側の式 p_Area.dblLengthに署名します ClsAreaクラスオブジェクトに格納されているdblLength値を読み取り、呼び出し元のプログラムに戻ります。

    Letプロパティプロシージャは、NewValue変数のパラメータ値をClsAreaクラスオブジェクトのp_Area.dblLengthプロパティに割り当てます。ここでは、NewValueパラメーター変数で受け取った値に対して検証チェックを実行していません。検証チェックは、値を p_Area.dblLength に割り当てるときに、ClsAreaクラス自体の中で実行されます。 プロパティ。

    同様に、Get/Letプロパティプロシージャもp_Area.dblWidthプロパティに追加されます。

    次に、 p_Area.Area() 関数は、ClsVolumeクラスオブジェクトを介して呼び出し元のプログラムに表示されます。

    ClsVolume派生クラスモジュールコード。

    ClsVolumeクラスモジュールの完成したコードを以下に示します。

    Option Compare Database
    Option Explicit
    
    Private p_Area As ClsArea
    Private p_Height As Double
    
    Private Sub Class_Initialize()
    
    ‘Open ClsArea Object in Memory with the name p_Area
        Set p_Area = New ClsArea 
    
    End Sub
    
    Private Sub Class_Terminate()
    
    ‘Removes the Object p_Area from Memory
        Set p_Area = Nothing ‘
    End Sub
    
    Public Property Get dblHeight() As Double
        dblHeight = p_Height
    End Property
    
    Public Property Let dblHeight(ByVal dblNewValue As Double)
    
    Do While Val(Nz(dblNewValue, 0)) <= 0
          dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0)
        Loop
         p_Height = dblNewValue
    
    End Property
    
    Public Function Volume() As Double
    
    If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then
        Volume = p_Area.Area * Me.dblHeight
    Else    
    
    MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume"
    End If
    
    End Function
    
    ‘ClsArea Class Property Procedures and Method are exposed here
    
    Public Property Get strDesc() As String
       strDesc = p_Area.strDesc
    End Property 
    
    Public Property Let strDesc(ByVal NewValue As String)
       p_Area.strDesc = NewValue
    End Property
    
    Public Property Get dblLength() As Double
       dblLength = p_Area.dblLength
    End Property
    
    Public Property Let dblLength(ByVal NewValue As Double)
       p_Area.dblLength = NewValue
    End Property
    
    Public Property Get dblWidth() As Double
       dblWidth = p_Area.dblWidth
    End Property
    
    Public Property Let dblWidth(ByVal NewValue As Double)
       p_Area.dblWidth = NewValue
    End Property
    
    Public Function Area() As Double
        Area = p_Area.Area()
    End Function

    「これは二重の作業です。何らかの方法で、ClsVolumeクラスでClsAreaプロパティプロシージャを繰り返すこれらの手順をスキップできると便利です」のように、あなたは今考えていることを知っています。または、ClsArea自体にdblWidthプロパティを追加し、そこからArea()メソッドとVolume()メソッドを実行することもできますよね?

    ここで重要なのは、基本クラスオブジェクトが別のクラスオブジェクトの設計の一部になる方法です。

    再利用可能なクラスモジュールオブジェクトを設計するというアイデア全体を忘れないでください クラスオブジェクトを使用するメインプログラムは単純であり、クラスオブジェクトに組み込まれている複雑さは隠されたままです。

    はい、コンパクトなコードでも複数の方法で実行できます。後で調べますが、とりあえず、元の計画を続けましょう。

    ClsVolumeクラスを使用するメインプログラム。

    標準モジュールのメインプログラムで新しいClsVolumeクラスをテストしてみましょう。サンプルコードを以下に示します。

    Public Sub TestVolume()
    Dim vol As ClsVolume
    
    Set vol = New ClsVolume
    
    vol.strDesc = "Warehouse"
    vol.dblLength = 25
    vol.dblWidth = 30
    vol.dblHeight = 10
    
    Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume"
    
    With vol
        Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume()
    End With
    End Sub
    

    印刷ラインがなくても、メインプログラムがいかにシンプルであるかがわかりますか?

    コードをコピーして標準モジュールに貼り付けます。 Ctrl + Gキーを押して、デバッグウィンドウがまだ開いていない場合は表示します。コードの途中をクリックして、 F5を押します。 コードを実行するためのキー。デバッグウィンドウの出力例を以下に示します。

    Description   Length        Width         Height        Area          Volume
    Warehouse      25            30            10            750           7500 
    

    説明長さ幅高さ面積体積
    倉庫253010 750 7500

    検証はパフォーマンステストをチェックします。

    テストを実行して、基本クラスのClsAreaクラスの入力値検証チェックが、ClsVolumeクラスを介して値が渡されたときに機能することを確認します。 Area()関数とVolume()関数でもいくつかの検証チェックを実行しました。

    1つずつ試してみましょう:

    まず、ClsVolumeクラスを介してClsArea.dblLengthプロパティに負の値を渡します。エラーメッセージをトリガーし、DoWhile…Loop内でInputbox()関数を開いて、正しい値を入力する必要があります。

    1. Vol.dblLength =25の行の値25を置き換えます。 、– 5 F5を押します コードを実行するためのキー。

    検証チェックはエラーをトリガーし、ゼロより大きい値を要求します。 0より大きい値を入力します。その後、行の値25を復元し、–5を置き換えます。

    2.次のように、行の先頭にコメント記号(‘)を挿入して、行Vol.dblHeight =10を無効にします。‘Vol.dblHeight =10 。変更後、F5キーを押してコードを実行します。

    プロパティに渡される入力値がないため、Vol.Volume()関数は、3つのプロパティ(dblLength、dblWidth、およびdblHeight)すべてにVolume関数を実行するための値が含まれている必要があることを示すエラーを生成します。

    同様に、Vol.Area()関数のパフォーマンスも確認できます。

    データ印刷関数を作成し、ClsVolumeオブジェクトをパラメーターとして関数に渡して、デバッグウィンドウに値を出力できます。

    メインプログラムの変更されたコード。

    両方のプログラムで変更されたコードを以下に示します。

    Public Sub TestVolume()
    Dim Vol As ClsVolume
    
    Set Vol = New ClsVolume
    
    Vol.strDesc = "Warehouse"
    Vol.dblLength = 25
    Vol.dblWidth = 30
    Vol.dblHeight = 10
    
    Call CVolPrint(Vol)
    
    Set Vol = Nothing
    
    End Sub
    
    Public Sub CVolPrint(volm As ClsVolume)
    
       Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume"  
    With volm
        Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume
    End With
    
    End Sub
    
    

    来週は、より少ないコードでボリュームクラスオブジェクトを構築します。

    このトピックのすべてのページのリンク。

    1. MS-AccessクラスモジュールとVBA
    2. MS-AccessVBAクラスオブジェクト配列
    3. MS-Accessの基本クラスと派生オブジェクト
    4. VBA基本クラスと派生オブジェクト-2
    5. 基本クラスと派生オブジェクトのバリアント
    6. Ms-Accessレコードセットとクラスモジュール
    7. アクセスクラスモジュールとラッパークラス
    8. ラッパークラスの機能変換
    9. Ms-Accessおよびコレクションオブジェクトの基本
    10. Ms-Accessクラスモジュールとコレクションオブジェクト
    11. コレクションオブジェクトとフォームのテーブルレコード
    12. 辞書オブジェクトの基本
    13. 辞書オブジェクトの基本-2
    14. 辞書オブジェクトのキーとアイテムの並べ替え
    15. 辞書からフォームへのレコードの表示
    16. クラスオブジェクトをディクショナリアイテムとして追加
    17. フォームのクラスオブジェクトディクショナリアイテムを更新する


    1. Postgresに向けた取り組み-XL9.5

    2. SQL Server(T-SQL)で数値を通貨としてフォーマットする方法

    3. Hyper-V内で動的メモリを使用する場合のリスク

    4. phpMyAdminで外部キーを設定しますか?