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

VBA基本クラスと派生オブジェクト-2

    はじめに。

    先週、クラスClsAreaを基本クラスとして使用して、派生クラスClsVolumeオブジェクトを作成しました。基本クラスのプロパティと関数をオブジェクトユーザープログラムに公開するために、派生クラスにプロパティプロシージャを作成しました。このメソッドでは、派生クラスでも基本クラスのすべてのプロパティプロシージャを繰り返す必要があります。ここでは、基本ClsAreaクラスのプロパティプロシージャを繰り返さずに、同じ派生ClsVolumeクラスを作成する方法について説明します。

    Getの使用法を学びました としましょう クラスのプロパティプロシージャ。クラスで使用されるもう1つのプロパティプロシージャがあります:セット プロパティ手順。プロパティの設定プロシージャは、オブジェクトを同じタイプのクラスオブジェクトに直接割り当てます。

    先に進む前に、このトピックの以前のページにアクセスしてください。まだアクセスしていない場合は、以下のリンクを参照してください。

    • MS-AccessクラスモジュールとVBA
    • MS-AccessVBAクラスオブジェクト配列
    • MS-Accessの基本クラスと派生オブジェクト

    ClsVolumeクラス、変身。

    先週作成した同じClsVolumeクラスモジュールの別のバリアントを、ベースクラスとしてClsAreaを使用し、異なるアプローチで、より少ないコードで作成します。

    新しいクラスモジュールを作成し、そのNameプロパティ値を ClsVolume2に変更します 。

    次のコードをコピーしてクラスモジュールClsVolume2に貼り付け、モジュールを保存します。

    Option Compare Database
    Option Explicit
    'Method two-1
    Private p_Height As Double
    Private p_Area As ClsArea
    
    Public Property Get dblHeight() As Double
        dblHeight = p_Height
    End Property
    
    Public Property Let dblHeight(ByVal dblNewValue As Double)
        p_Height = dblNewValue
    End Property
    
    Public Function Volume() As Double
        Volume = p_Area.dblLength * p_Area.dblWidth * p_Height
    End Function
    

    ‘新しい入手 およびセット ClsAreaオブジェクトのプロパティプロシージャPublicプロパティGetCArea()As ClsArea Set CArea =p_AreaEnd PropertyPublic Property Set CArea(ByRef AreaValue As ClsArea)Set p_Area =AreaValueEnd Property

    コンパイルを選択します デバッグからのプロジェクト名 すべてのVBAプロジェクトコードにエラーがないことを確認するために、データベース内のVBAコードをコンパイルするためのメニュー。他のVBAプログラムでエラーが発生した場合は、エラーを追跡して修正し、プロジェクトを再コンパイルしてください。そうしないと、オブジェクトのプロパティと機能のリストを表示するVBAIntelliSenseが機能しません。これにより、オブジェクトプロパティへの値の割り当て/オブジェクトプロパティからの値の取得が妨げられることはありません。ただし、学習中は、コーディングのアシスタントとして、オブジェクトのプロパティがポップアップしてリストを表示することを確認することが重要です。


    Get / Set Get/Letプロパティプロシージャの代わりに。

    ClsVolumeクラスの最後のバージョンで作成されたClsAreaのすべてのプロパティプロシージャを省略し、 Get / Setに置き換えました。 Get / Letの代わりにプロパティプロシージャ 。 p_Areaを宣言した宣言エリアを確認してください ClsAreaクラスオブジェクトとして宣言されています。

    オブジェクトがこのように宣言されている場合、通常、上記のコードのClass_Initialize()プロシージャでこのオブジェクトのインスタンスを作成する必要があります。ここでは、ユーザープログラムで実行し、そのプロパティに適切な値を入力してから、最終的な計算フェーズの前にClsVolume2クラスに渡して、それらの値を使用する予定であるため、ここでは実行しませんでした。

    Set CArea()に注意してください 手順。 ByRefパラメータAreaValueはClsAreaオブジェクトとして宣言されています。 Property Set CArea(ByRef AreaValue as ClsArea)に渡されると、ClsAreaクラスオブジェクトを受け入れます。 、オブジェクト変数 AreaValue、 p_Areaに割り当てます ClsVolume2のプロパティ オブジェクト。

    Get CArea() プロパティプロシージャは、オブジェクトを呼び出し元のプログラムに返します。

    以前のプログラムでは、オブジェクトの個々の要素(長さ、幅、高さ)のプロパティプロシージャを割り当て/返す作成しました。 値To/ From 彼ら。ここでの違いは、オブジェクト全体をパラメータとしてSetプロシージャに渡すことです。このオブジェクトのプロパティ値(たとえばlblHeight)を取得するには、 CArea.dblLengthとしてアドレス指定する必要があります。 。 取得/設定 プロパティプロシージャ名CArea メインプログラムで宣言されると、メインオブジェクトの子オブジェクトになり、それらのプロパティプロシージャには、オブジェクトアドレスVol.CArea.dblLengthから直接アクセスできます。

    標準モジュールのテストプログラム。

    標準モジュールで小さなプログラムを作成して、新しい派生クラスオブジェクトClsVolume2をテストします。

    プロジェクトに新しい標準モジュールを挿入します。次のコードをコピーしてモジュールに貼り付け、コードを保存します。

    Public Sub SetNewVol2_1()
    'Method 1/2
    Dim Vol As New ClsVolume2
    
    'ClsArea Object instantiated and passed to the
    'Property Procedure Set CArea in ClsVolume2.
    
    Set Vol.CArea = New ClsArea 'declare and instantiate the object in one statement
    
    Stop
    
    Vol.CArea.strDesc = "Bed Room"
    Vol.CArea.dblLength = 90
    Vol.CArea.dblWidth = 10
    
    Vol.dblHeight = 10 'assign height to ClsVolume2
    
    Stop
    
    Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume"
    Debug.Print Vol.CArea.strDesc, Vol.CArea.dblLength, Vol.CArea.dblWidth, Vol.CArea.Area, Vol.dblHeight, Vol.Volume
    
    Set Vol.CArea = Nothing
    Set Vol = Nothing
    
    End Sub
    
    

    行ごとのコードレビュー。

    上記のVBAコードを簡単に見てみましょう。最初の行は、Vol。という名前でクラスClsVolume2をインスタンス化します。 次の2つのコメント行の後、設定 Vol.CAreaのステートメント プロパティプロシージャが呼び出され、新規を渡します インスタンス化されたClsArea パラメータとしてのオブジェクト。

    停止を入れました 次の行のステートメントで、プログラムを一時停止して、オブジェクトがセットにどのように割り当てられているかを確認します。 CArea 物体。どのように?すぐにそれを探求しますか?

    次の4行は、ClsAreaオブジェクトとClsVolume2オブジェクトのHeightプロパティに値を割り当てます。

    次の停止 プログラムに一時停止を作成して、値がメモリにどのように保持されているかをメモリで検査できるようにします。

    次の行は、次の行に出力される値のデバッグウィンドウの見出しを出力します。

    次の行は、オブジェクトプロパティの値をメモリからデバッグウィンドウに出力します。

    次の停止ステートメントまでコードを実行する

    コードを実行し、メモリを調べて、Stopステートメントを配置した各段階で何が起こっているかを確認しましょう。

    1. コードの途中をクリックして、 F5を押します。 コードを実行し、最初の停止ステートメントでプログラムを一時停止します。
    2. ローカルウィンドウを選択します 表示から コードウィンドウの下に新しいウィンドウを開き、ClsAreaオブジェクトとClsVolume2オブジェクト、それらのプロパティ、およびそれらのメンバープロパティプロシージャがメモリにどのように保持されているかを表示するメニュー。 ローカルウィンドウのサンプル画像 以下に示します。

      ローカルウィンドウ 表示。



    3. 他のWindowsのサイズ変更ハンドルを上にドラッグして高さを下げ、ローカルを表示するためのスペースを増やします。 窓。デバッグウィンドウを閉じて、当面はCtrl+Gを使用して後で必要になったときに元に戻します。

      Locals で、すべてのオブジェクトとそのプロパティをグラフィカルに表示できます。 窓。プラス[+]記号の付いた名は、プログラムの実行元である標準モジュールの名前を示します。

      Volという名前の次のプラス[+]記号 はメモリ内のClsVolume2インスタンス化されたオブジェクトです。

    4. [+]記号をクリックして展開し、詳細を表示します。

      次のレベルのオブジェクトとプロパティが見つかります。

      [+] CArea このオブジェクトが次のレベルのプロパティとその値を持っていることを示します。

      dblHeight Get property Procedureは、VolObjectのすぐ下にあります。

      [+] p_Area ClsAreaとして宣言された私有財産です ClsVolume2クラスのクラス。

      p_Height ClsVolume2で宣言されたプライベートプロパティでもあります。

    5. プラスをクリックします[+] オブジェクトを展開してプロパティと値を表示する記号。

      [+] CAreaの拡張 Set CArea()プロパティプロシージャに渡したClsAreaオブジェクトのビューを提供します。

      [+] p_Areaの拡張 プライベートとして宣言されたClsAreaプロパティのビューを提供します。

      p_Areaに注意してください ClsVolume2クラスオブジェクトのプライベートプロパティとそのすべての要素には、 CAreaからのみアクセスできます。 オブジェクトプロパティ取得/設定 外の世界への手続き。

      [ローカル]ウィンドウの2番目の列には、オブジェクトプロパティに割り当てられた値が表示され、現在は値が表示されていません。

      3番目の列には、データ型またはオブジェクトクラスのモジュール名が表示されます。

    6. F5キーを押してプログラムをさらに実行し、次のStopステートメントで一時停止するまで、オブジェクトプロパティにいくつかの値を割り当てます。プログラムは次の停止で一時停止します 声明。値の変更については、ローカルウィンドウを確認してください。

    CAreaの内部 値が90、10の最初の2行をオブジェクト化し、値が「BedRoom」の最後のstrDescが Getです。 プロパティ手順。 p_Desc、p_Length、およびp_widthは、 Setを介して割り当てられた値です。 p_Areaへのプロパティ手順 ClsVolume2クラスオブジェクトのプロパティ。

    p_Area ClsVolume2のプライベートプロパティとして宣言されたClsAreaクラスのオブジェクトは、その Get / Setで表示されます。 プロパティプロシージャと割り当てられた値。

    タイプを確認してください [-] CAreaの列 および[-]p_Area 両方のオブジェクトはClsArea基本クラスから派生しています。

    ClsAreaクラスオブジェクトとClsVolume2クラスオブジェクトの使用方法が異なります。

    来週は、同じ2つのオブジェクトを使用して別のアプローチを試します。自分で試してみたい場合は、ここに自分で試してみる手がかりがあります。

    1. 標準モジュールプログラムで、ClsVolume2クラスとClsAreaクラスを2つの異なるオブジェクトとしてインスタンス化します。
    2. 両方のオブジェクトプロパティに値を割り当てます。
    3. ClsAreaインスタンス化されたオブジェクトをCAreaに割り当てます 値をデバッグウィンドウに出力する前の、ClsVolume2クラスオブジェクトのオブジェクト。

    この例では、ClsVolumeクラスモジュールで行ったようにGet / Letプロパティプロシージャを繰り返さなくても、上記の例で行ったのと同じ結果を得ることができます。

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

    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. クラスオブジェクトをディクショナリアイテムとして追加
    18. フォームのクラスオブジェクトディクショナリアイテムを更新する


    1. mysqlのWHERE句でエイリアスを使用できますか?

    2. SQLでHAVING句を使用する方法

    3. 空またはnull値をチェックするための最良の方法

    4. SQLServerでのデータベーススキーマの使用