ダイアログ機能説明


概要

AcadRemoconでは、独自のダイアログをコードから簡単に作成することが出来ます。

使用出来るすべてのコントロールを配置したダイアログを下に示します。

※「OK」ボタンと「キャンセル」ボタンは自動的に追加されます。それぞれのコントロール名は「cmdOK」と「cmdCancel」です。

 

 

基本的な使用例(VBScript)

 

↓コード

Set Acad = CreateObject("AcadRemocon.Body")
Acad.dlLoad "ダイアログサンプル" 'ダイアログ開始
Acad.dlAddLabel "", "開始番号"
Acad.dlAddText "txtStart", "123"
Acad.dlShow 'ダイアログ表示
Do
    Acad.dlWaitEvent CtrlName 'イベント発生待ち
    Select Case CtrlName
        Case "cmdOK"
            Txt = Acad.dlGetProperty("txtStart", "Text")
            Exit Do
        Case "cmdCancel": Exit Do
    End Select
Loop While True
Acad.dlUnload 'ダイアログ終了
If CtrlName = "cmdOK" Then MsgBox "開始番号は「" & Txt & "」です。"

 

↓実行イメージ

 

 

 

推奨コード(VBScript)

 

↓コード

特徴1)ダイアログ構築部をサブルーチン化し、メインルーチンの可読性を向上させています。

特徴2)イベント処理ルーチンを分け、コントロールの初期化処理にも使っています。

特徴3)エラールーチンにdlUnloadメソッドを記述し、エラーメッセージがダイアログの背面に隠れないようにしています。

Dim Acad
Call Main

Private Sub Main()
    'AcadRemocon作成
    Set Acad = CreateObject("AcadRemocon.Body")
    
    'バージョンチェック
    If Not Acad.CheckVersion("200") Then Exit Sub
    
    'ダイアログ作成&表示
    DialogCreate
    
    '設定値取得
    Acad.GetIniVal Keta, "Keta", "DialogSample"
    Acad.GetIniVal Colo, "Colo", "DialogSample"
    
    '初期値設定(値を設定後、イベントルーチンを呼び出してコントロールを初期化する)
    Acad.dlSetProperty "chkKeta", "Value", Keta
    Acad.dlSetProperty "lstColo", "ListIndex", Colo
    DialogEvent "chkKeta", Keta, -1
    DialogEvent "lstColo", "", Colo
    
    'イベント監視ループ
    Do
        'イベント発生待ち
        Acad.dlWaitEvent CtrlName, CtrlValue, CtrlListIndex
        
        'イベント処理
        Select Case DialogEvent(CtrlName, CtrlValue, CtrlListIndex)
            Case vbOK: Exit Do
            Case vbCancel: Exit Sub
        End Select
    Loop While True
    
    'コントロールの値取得(ダイアログのアンロード前に行う)
    Keta = Acad.dlGetProperty("chkKeta", "Value")
    Colo = Acad.dlGetProperty("lstColo", "ListIndex")
    
    'ダイアログアンロード
    Acad.dlUnload
    
    '設定値保存
    Acad.PutIni Keta, "Keta", "DialogSample"
    Acad.PutIni Colo, "Colo", "DialogSample"
End Sub

'ダイアログ作成&表示
Sub DialogCreate()
    Acad.dlLoad "ダイアログサンプル" 'ダイアログ開始
    Acad.dlAddCheck "chkKeta", "桁を揃える", Keta, 16, 1
    Acad.dlIncCurrentX 4
    Acad.dlAddLabel "", "桁数", 4, -1, True
    Acad.dlAddText "txtKeta", "0", 11, 4, True
    Acad.dlAddLabel "", "色", 16, 1
    'アイテム値を利用して色名に対応した数値を格納
    Acad.dlAddList "lstColo", "黒|赤|緑|黄|青|マゼンタ|シアン|白", 0, 16, 8, 0, "0|255|65280|65535|16711680|16711935|16776960|16777215"
    Acad.dlShow 'ダイアログ表示
End Sub

'ダイアログイベント処理
Function DialogEvent(CtrlName, CtrlValue, CtrlListIndex)
    'コントロール名で区別
    Select Case CtrlName
        'OKボタン
        Case "cmdOK"
            '桁数に1以上の値が入っていればOK
            If Acad.dlGetValue("txtKeta") >= 1 Then DialogEvent = vbOK: Exit Function
            
            'メッセージ表示
            Acad.dlShowMessage "桁数には1以上の数値を入力して下さい", vbExclamation + vbOKOnly

        'キャンセルボタン
        Case "cmdCancel": DialogEvent = vbCancel: Exit Function
    
        '桁揃えチェックボックス
        Case "chkKeta"
            '桁数テキストボックスの無効化
            If CtrlValue = 0 Then
                Acad.dlSetProperty "txtKeta", "Enabled", False
                
            '桁数テキストボックスを有効化
            Else
                Acad.dlSetProperty "txtKeta", "Enabled", True
            End If
            
        '色リストボックス
        Case "lstColo"
            'アイテム値を取得
            BC = Acad.dlGetProperty("lstColo", "ItemData", CtrlListIndex)
            
            '背景色と前景色を設定
            Acad.dlSetProperty "lstColo", "BackColor", BC
            Acad.dlSetProperty "lstColo", "ForeColor", &HFFFFFF - BC
    End Select
    
    '再度イベント待ち
    DialogEvent = vbRetry
End Function

'エラー処理
Sub Er()
    'ユーザーによるキャンセル
    If Acad.ErrNumber = vbObjectError + 1000 Then
        'ここにキャンセル時の処理を追加
    Else
        'エラー表示が隠れないようにダイアログアンロード
        Acad.dlUnload
        
        'エラー内容表示
        Acad.ShowError
    End If
End Sub

 

↓実行イメージ

動作1)色を選択すると、リストボックスの背景色が選択した色と同じになります。

動作2)「桁を揃える」チェックボックスのチェックを外すと、「桁数」テキストボックスの背景色がグレーになり編集不可になります。

動作3)「桁数」テキストボックスに1以下の数値を入力して「OK」をクリックするとエラーメッセージを表示します。

動作4)正常終了時に「桁を揃える」チェックボックスと「色」リストボックスの状態を保存します。

  

 

 

ちょっとテクニックを使ったコード(VBScript)

 

↓実行イメージ

テク1)dlCallMethodを使って、リストボックスに動的にプレビューを表示させています。

テク2)「OK」ボタンを非表示にし、「キャンセル」ボタンを「終了」に書き換えています。

テク3)改行量は一番右端のコントロールの値が採用されることと、幅が0のコントロールは非表示になることを利用してコントロールを2列に配置しています。

 

↓コード

Dim Acad
Call Main

Private Sub Main()
    'AcadRemocon作成
    Set Acad = CreateObject("AcadRemocon.Body")
    
    'バージョンチェック
    If Not Acad.CheckVersion("200") Then Exit Sub
    
    'ダイアログ作成&表示
    DialogCreate
    
    'コントロールの初期値でプレビュー実行
    DialogEvent "txtStart", "", -1
    
    'イベント監視ループ
    Do
        'イベント発生待ち
        Acad.dlWaitEvent CtrlName, CtrlValue, CtrlListIndex
        
        'イベント処理
        If DialogEvent(CtrlName, CtrlValue, CtrlListIndex) = vbCancel Then Exit Sub
    Loop While True
    
    'ダイアログアンロード
    Acad.dlUnload
End Sub

'ダイアログ作成&表示
Sub DialogCreate()
    Acad.dlLoad "プレビューサンプル" 'ダイアログ開始
    Acad.dlAddLabel "", "開始値", 12, -1
    Acad.dlAddLabel "", "プレビュー", 12, 1
    Acad.dlAddText "txtStart", "1", 10, -1, True
    Acad.dlIncCurrentX 8
    Acad.dlAddList "lstPrev", "", 0, 16, 12, -1
    Acad.dlSetProperty "lstPrev", "TabStop", False 'Tabによるフォーカス移動を無効に
    Acad.dlAddText "", "", 0 '改行のためのダミーコントロール
    Acad.dlAddLabel "", "終了値", 12, 1
    Acad.dlAddText "txtEnd", "5", 10, 4, True
    Acad.dlSetProperty "cmdOK", "Visible", False
    Acad.dlSetProperty "cmdCancel", "Text", "終了"
    Acad.dlShow 'ダイアログ表示
End Sub

'ダイアログイベント処理
Function DialogEvent(CtrlName, CtrlValue, CtrlListIndex)
    'コントロール名で区別
    Select Case CtrlName
        'キャンセルボタン
        Case "cmdCancel": DialogEvent = vbCancel: Exit Function
    
        'テキストボックス
        Case "txtStart", "txtEnd"
            '開始値と終了値を得る
            ST = Acad.vbVal(Acad.dlGetProperty("txtStart", "Text"))
            ED = Acad.vbVal(Acad.dlGetProperty("txtEnd", "Text"))
                
            'プレビュー開始
            Cnt = 0
            Acad.dlCallMethod "lstPrev", "Clear"
            For i = ST To ED
                Cnt = Cnt + 1
                If i = ED Or Cnt < 9 Then
                    Acad.dlCallMethod "lstPrev", "AddItem", i
                ElseIf Cnt = 9 Then
                    Acad.dlCallMethod "lstPrev", "AddItem", "途中省略・・・"
                End If
            Next
            
            '最後の項目を選択
            Acad.dlSetProperty "lstPrev", "ListIndex", Acad.dlGetProperty("lstPrev", "ListCount") - 1
    End Select
    
    '再度イベント待ち
    DialogEvent = vbRetry
End Function

'エラー処理
Sub Er()
    'ユーザーによるキャンセル
    If Acad.ErrNumber = vbObjectError + 1000 Then
        'ここにキャンセル時の処理を追加
    Else
        'エラー表示が隠れないようにダイアログアンロード
        Acad.dlUnload
        
        'エラー内容表示
        Acad.ShowError
    End If
End Sub

 

 

補足(Enterキーの扱い)

 

通常は「OK」ボタンがデフォルトボタンにしてありますので、フォーカスがどのコントロールにあっても「Enterキー押し下げ」=「OKボタンクリック」になります。

ただしマルチラインテキストを1個でも配置した場合は「OK」ボタンのデフォルト設定は解除されます。

また「dlLoad」メソッドの「TabByEnter」引数をTrueにした場合、Enterキーはテキストボックス間のフォーカス移動になりますので、同じく「OK」ボタンのデフォルト設定は解除されます。