コントロールとユーザ フォームのイベントを処理する

イベントは、ユーザがユーザ フォーム上のコントロールを操作した結果だけでなく、事前定義されたアクションがユーザ フォームに対して発生したときにもトリガされます。

[AutoCAD Objects]フォルダを開くと(すでに開いている場合もあります)、図面のアイコンと ThisDrawing という名前が表示されます。[フォーム]フォルダを開くと(すでに開いている場合もあります)、フォームのアイコンと、今作成したフォームの名前 gpDialog が表示されます。

プロジェクト エクスプローラ ウィンドウを使用する

次の手順では、プロジェクト エクスプローラ ウィンドウを使用する方法を学習します。

  1. VBA IDE で、メニュー バーから[表示]メニュー [プロジェクト エクスプローラ ウィンドウ]を選択するか、[Ctrl]+[R]を押して、プロジェクト エクスプローラ ウィンドウを表示します。
  2. プロジェクト エクスプローラ ウィンドウで、編集するモジュールをダブルクリックします。

    コード ウィンドウでコード モジュールが開き、フォーム エディタ ウィンドウでユーザ フォームが開きます。

  3. フォームのイベントに関連するコードを編集するには、ユーザ フォームを選択して右クリックします。[コードを表示]を選択します。
  4. または、プロジェクト エクスプローラ ウィンドウの一番上に表示されるツールをクリックして、プロジェクト エクスプローラ ウィンドウでのモジュールの表示方法をコントロールすることもできます。

既存のコードを修正する

次の手順では、ThisDrawing モジュールの既存のコードを更新します。

  1. [プロジェクト]ウィンドウで ThisDrawing モジュールをダブルクリックします。
  2. コード ウィンドウの[General Declarations]セクション(一番上)で、次のコード文を更新します。
    Public trad As Double         ' Updated
    Public tspac As Double        ' Updated
    Public tsides As Integer      ' Add
    Public tshape As String       ' Add

    変数は、ユーザ フォームのコードからアクセスして修正できるように、Public として設定する必要があります。tsides 変数はポリゴン タイルの辺数を保持し、tshape 変数は選択されたタイルの形状(円形またはポリゴン)を保持します。

  3. gpuser サブルーチンに進みます。
  4. 次の行の前にアポストロフィを追加します。
    trad = ThisDrawing.Utility.GetDistance(sp, "Radius of tiles: ")
    tspac = ThisDrawing.Utility.GetDistance(sp, "Spacing between tiles: ")

    アポストロフィを追加すると、コード文がコメントになるので、コードの実行は許可されなくなり、プロジェクトにコードを保持できるようになります。コードは、次のようになっているはずです。

    ' trad = ThisDrawing.Utility.GetDistance(sp, "Radius of tiles: ")
    ' tspac = ThisDrawing.Utility.GetDistance(sp, "Spacing between tiles: ")
  5. 前の手順でコメントにしたコード文の後ろに、次のコード文を追加します。
    ' Load and display the Garden Path user form
    Load gpDialog 
    gpDialog.Show
  6. gardenpath マクロに進みます。
  7. gardenpath マクロの前に次のサブルーチンを追加します。このサブルーチンは、円形タイルまたはポリゴン タイルを描画します。
    ' Draw the tile with the designated shape
    Sub DrawShape(pltile)
      Dim angleSegment As Double
      Dim currentAngle As Double
      Dim angleInRadians As Double
      Dim currentSide As Integer
      Dim varRet As Variant
      Dim aCircle As AcadCircle
      Dim aPolygon As AcadLWPolyline
      ReDim points(1 To tsides * 2) As Double
    
      ' Branch based on the type of shape to draw
      Select Case tshape
        Case "Circle"
          Set aCircle = ThisDrawing.ModelSpace.AddCircle(pltile, trad)
        Case "Polygon"
          angleSegment = 360 / tsides
          currentAngle = 0
    
          For currentSide = 0 To (tsides - 1)
            angleInRadians = dtr(currentAngle)
            varRet = ThisDrawing.Utility.PolarPoint(pltile, angleInRadians, trad)
            points((currentSide * 2) + 1) = varRet(0)
            points((currentSide * 2) + 2) = varRet(1)
            currentAngle = currentAngle + angleSegment
          Next currentSide
    
          Set aPolygon = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
          aPolygon.Closed = True
      End Select
    End Sub
  8. drow サブルーチンに進みます。
  9. drow サブルーチン内に、次のコード文の 2 つのオカレンスを配置します。
    Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad)
    コード文のオカランスをコメント化し、この文の下に下記を追加して、適切なタイルの形状を描きます。
    DrawShape pltile       ' Updated
  10. プロジェクトを保存します。

イベント ハンドラを追加する

次の手順では、gpDialog ユーザーフォームにコードを追加して、フォームのコントロールの動作とユーザ フォームがロードされたときに起こることを定義します。

  1. [プロジェクト]ウィンドウで gpDialog ユーザ フォームを右クリックして、[コードを表示]を選択します。
  2. コード ウィンドウで、左側の[オブジェクト]ドロップダウン リストをクリックし、gp_poly を選択しす。

  3. [プロシージャ]ドロップダウン リストから、[クリック]を選択します(既定で選択されていない場合)。
  4. 追加した Private Sub gp_poly_Click プロシージャに、次のコード文を入力します。
    gp_tsides.Enabled = True
      ThisDrawing.tshape = "Polygon"

    このコードは、gp_tsides テキスト ボックスを有効にし、ThisDrawing モジュールの tshape 変数を文字列 Polygon に設定します。

  5. gp_circ オブジェクトの Click プロシージャを追加し、次のコード文を入力します。
    gp_tsides.Enabled = False
      ThisDrawing.tshape = "Circle"

    このコードは、gp_tsides テキスト ボックスを無効にし、ThisDrawing モジュールの tshape 変数を文字列 Circle に設定します。

  6. accept オブジェクト([OK]ボタン)に Click プロシージャを追加します。
    Private Sub accept_Click()
      If ThisDrawing.tshape = "Polygon" Then
        ThisDrawing.tsides = CInt(gp_tsides.text)
        If (ThisDrawing.tsides < 3#) Or (ThisDrawing.tsides > 1024#) Then
          MsgBox "Enter a value between 3 and " & _
                 "1024 for the number of sides."
          Exit Sub
        End If
      End If
    
      ThisDrawing.trad = CDbl(gp_trad.text)
      ThisDrawing.tspac = CDbl(gp_tspac.text)
    
      If ThisDrawing.trad < 0# Then
        MsgBox "Enter a positive value for the radius."
        Exit Sub
      End If
    
      If (ThisDrawing.tspac < 0#) Then
        MsgBox "Enter a positive value for the spacing."
        Exit Sub
      End If
    
      GPDialog.Hide
    End Sub

    このコードは、ユーザがタイルの形状としてポリゴンを選択し、ポリゴンの有効な辺数を指定したかどうかをテストします。テキスト ボックスに入力された半径と間隔の値は変数 tradtspac に保存されます。条件文も、tradtspac の値が 0 (ゼロ)でないことを確認するために使用されます。

    値が取得され、検証された後、gpDialog.Hide 文によってフォームが非表示にされ、最初にフォームを呼び出したサブルーチンにコントロールが戻されます。

  7. cancel オブジェクト([キャンセル]ボタン)に Click プロシージャを追加します。
    Private Sub cancel_Click()
      Unload Me
      End
    End Sub

    このイベント ハンドラは、フォームをロード解除し、マクロ全体を終了します。

  8. UserForm オブジェクトに Initialize プロシージャを追加します。
    Private Sub UserForm_Initialize()
      gp_circ.Value = True
      gp_trad.Text = ".2"
      gp_tspac.Text = ".1"
      gp_tsides.Text = "5"
      gp_tsides.Enabled = False
      ThisDrawing.tsides = 5
    End Sub

    このイベント ハンドラは、ユーザ フォームがセッションで初めてロードされたときに実行されます。

  9. プロジェクトを保存します。

ダイアログ ボックスをテストする

次の手順では、gpDialog ユーザ フォームに追加したコードをテストします。

  1. [管理]タブ [アプリケーション]パネル [VBA マクロ実行]をクリックします。 検索
  2. [マクロ]ダイアログ ボックスで、ThisDrawing.gardenpath マクロを選択し、[実行]をクリックします。
  3. プロンプト 「歩道の始点:」 に対して、2, 2 と入力します。
  4. プロンプト 「歩道の終点:」 に対して、9, 8 と入力します。
  5. プロンプト 「歩道の 1/2 幅:」 に対して、2 と入力します。
  6. [庭園の歩道]ダイアログ ボックスで、[ポリゴン]をクリックします。

  7. [タイルの半径]テキスト ボックスに .5 と入力します。
  8. [タイルの間隔]テキスト ボックスに .05 と入力します。
  9. [辺の数]テキスト ボックスに、8 と入力します。
  10. [OK]をクリックします。