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

アクセスクラスモジュールとラッパークラス

    はじめに。

    特定のアプリケーションに同様の値のセットを使用するために、特定のクラスモジュールを複数回インスタンス化する必要がある場合があります。

    たとえば、ClsAreaクラスモジュールは、Roomsのカーペット面積を計算するために設計されており、同様のアプリケーションの候補です。部屋に何枚の床タイルを置く必要があるかを知りたいとすると、床の寸法値に加えて、タイルの長さと幅の値も入力できるはずです。 FloorとTileはどちらも入力と同様のプロパティ値を持っているため、ClsAreaクラスモジュールの2つのインスタンスを使用できます。1つはFLOOR領域用で、もう1つはTILE領域用です。床面積/タイル面積は、特定の部屋のタイルの総数を示します。

    同じクラスモジュールの2つのインスタンス。

    これを行うには、ルームが1つしかない場合に、標準モジュールプログラムでClsAreaクラスモジュールの2つの異なるインスタンスを作成します。

    Public Sub FloorTiles()
    Dim FLOOR As ClsArea
    Dim TILES As ClsArea
    Dim flrArea As Double, tilearea As Double
    Dim lngTiles As Long
    
    Set FLOOR = New ClsArea
    Set TILES = New ClsArea
    
    FLOOR.strDesc = "Bed Room1"
    FLOOR.dblLength = 25
    FLOOR.dblWidth = 15
    flrArea = FLOOR.Area()
    
    TILES.strDesc = "Off-White"
    TILES.dblLength = 2.5
    TILES.dblWidth = 1.25
    tilearea = TILES.Area()
    
    lngTiles = flrArea / tilearea
    
    Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc
    
    Set FLOOR = Nothing
    Set TILES = Nothing
    
    End Sub

    オブジェクトの配列の処理。

    しかし、タイルのサイズや色が異なる複数の部屋の配列に上記の方法を適用する必要がある場合はどうなりますか?その答えは、同じ ClsAreaの2つのインスタンスを使用して新しいクラスモジュールを作成することです。 クラス、フロアの1つのインスタンス もう1つはタイル用です プロパティ。両方のインスタンスは新しいクラスモジュールにラップされています。

    やってみましょう。

    1. データベースを開き、コード編集ウィンドウ(ALT + F11)を表示します。
    2. クラスモジュールを選択します 挿入から メニュー。
    3. 名前を変更します ClsTilesへのプロパティ値 。
    4. 次のVBAコードをコピーしてClsTilesクラスモジュールに貼り付け、コードを保存します。
      Option Compare Database
      Option Explicit
      
      Private pFLOOR As ClsArea
      Private pTILES As ClsArea
      
      Private Sub Class_Initialize()
          Set pFLOOR = New ClsArea
          Set pTILES = New ClsArea
      End Sub
      
      Private Sub Class_Terminate()
          Set pFLOOR = Nothing
          Set pTILES = Nothing
      End Sub
      
      Public Property Get Floor() As ClsArea
       Set Floor = pFLOOR
      End Property
      
      Public Property Set Floor(ByRef NewValue As ClsArea)
        Set pFLOOR = NewValue
      End Property
      
      Public Property Get Tiles() As ClsArea
        Set Tiles = pTILES
      End Property
      
      Public Property Set Tiles(ByRef NewValue As ClsArea)
        Set pTILES = NewValue
      End Property
      
      Public Function NoOfTiles() As Long
         NoOfTiles = pFLOOR.Area() / pTILES.Area()
      End Function
      

      pFLOORとpTILESの両方のインスタンスは、ClsTilesクラスオブジェクトのプライベートプロパティとして宣言されています。

      Class_Initialize() ClsTiles の場合、サブルーチンはメモリ内の両方のオブジェクトをインスタンス化します クラスモジュールは、ユーザープログラムでインスタンス化されます。

      Class_Terminate() ClsTilesクラスモジュールインスタンスがユーザープログラムでNothingに設定されている場合、サブルーチンは両方のインスタンス(pFLOORとpTILES)をメモリから削除します。

      入手 およびセット プロパティプロシージャを使用すると、ClsTilesクラスオブジェクトで、pFLOORインスタンスとの間でそれぞれ値を取得および割り当てることができます。

      次のGetandSet Property Procedureは、ClsAreaクラスのpTILESインスタンスで同じ操作を許可します。

      新しい関数NoOfTiles()を追加しました 新しいクラスモジュールでは、床面積とタイルの寸法に基づいてタイルの数を計算します。

      新しいクラスモジュールClsTilesで、プログラムを作成し、同じクラスオブジェクトの複数のインスタンスの使用法を学びましょう。

    5. 次のVBAコードをコピーして標準モジュールに貼り付けます。
      Public Sub TilesCalc()
      Dim FTiles As ClsTiles
      Dim TotalTiles As Long
      
      Set FTiles = New ClsTiles
      
      FTiles.Floor.strDesc = "Warehouse"
      FTiles.Floor.dblLength = 100
      FTiles.Floor.dblWidth = 50
      
      FTiles.Tiles.dblLength = 2.5
      FTiles.Tiles.dblWidth = 1.75
      
      TotalTiles = FTiles.NoOfTiles()
      
      Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles"
      Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles
      
      End Sub
       
    6. デバッグウィンドウを開いたまま(CTRL + G)にして、テストデータを印刷します。
    7. VBAコードの途中をクリックして、 F5を押します。 コードを実行するためのキー。結果はデバッグウィンドウに出力されます。

      高層ビルの複数の部屋または複数の階の部屋のタイル要件を計算する場合は、上記のプログラムを何度も実行し、値を書き留める必要がありますが、これは実際には非常に困難です。

      複数の部屋のタイル要件を見つける。

      次に、 ClsTiles の配列を使用して、複数の部屋のタイル要件を見つける別のプログラムを作成しましょう。 キーボードから直接プロパティ値を入力してオブジェクトを作成します。

    8. 次のVBAコードをコピーして標準モジュールに貼り付けます。
      Public Sub TilesCalc2()
      Dim tmpFT As ClsTiles
      Dim FTiles() As ClsTiles
      Dim j As Long, L As Long, H As Long
      
      For j = 1 To 3
         Set tmpFT = New ClsTiles
            'Floor dimension
          With tmpFT.Floor
            .strDesc = InputBox(Str(j) & ") Floor Desc", , 0)
            .dblLength = InputBox(Str(j) & ") Floor Length", , 0)
            .dblWidth = InputBox(Str(j) & ") Floor Width", , 0)
          End With
          
          'Tile Dimension
          With tmpFT.Tiles
            .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0)
            .dblLength = InputBox(Str(j) & ") Tile Length", , 0)
            .dblWidth = InputBox(Str(j) & ") Tile Width", , 0)
          End With
         
         ReDim Preserve FTiles(1 To j) As ClsTiles
         Set FTiles(j) = tmpFT
         
         Set tmpFT = Nothing
      Next
      
      'Take Printout
      L = LBound(FTiles)
      H = UBound(FTiles)
      
      Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles"
      For j = L To H
        With FTiles(j)
         Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles
        End With
      Next
         
      'Remove all objects from memory
      For j = L To H
         Set FTiles(j) = Nothing
      Next
        
      End Sub
      
      
    9. デバッグウィンドウを開いたままにして、そこに出力を印刷します。
    10. 前と同じようにコードを実行し、3つの部屋の床とタイルの寸法の値を入力します。

    上記のコードからわかるように、RoomディメンションとTileディメンションの両方の値が、同じクラスオブジェクト配列インスタンスに並べて配置されます。

    上記のプログラムは、For内の3セットの値に対してのみ実行されるデモです。 。 。次のループ。条件付きブレークコードがプログラムを終了するまで、必要な回数だけ実行される条件付きループで変更できます。

    プログラムを変更して、データ値と計算結果の各セットを将来の参照用にテーブルに保存することができます。

    ラッパークラス コンテナです 他のクラスのインスタンス、データ構造、または他のオブジェクトのインスタンスコレクションのクラス。ここでは、同じクラスObjectの2つのインスタンスを保持するために使用しました。

    このトピックのすべてのリンクのリスト。

    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. PostgreSQLのカスタムトリガーベースのアップグレード

    2. oracle PL / SQLIPv6cidrの範囲IPを計算する方法

    3. PHPでwhileループと同じIDデータをリストするにはどうすればよいですか?

    4. Windows上のODBCアプリケーションをZohoCRMに接続します