DCL
DCL (Dialog Control Language)はダイアログ ボックスを作成するものである。
ダイアログ ボックスは、ダイアログ コントロール言語(DCL)で書かれた ASCII ファイルで定義し、主に LISP プログラムで利用する。 ボタンや編集ボックスなどのダイアログ ボックスの要素を「タイル」と呼び、各タイルのサイズと機能は、個々のタイルの属性でコントロールする。 ダイアログ ボックスのサイズと各部のレイアウトは、最小限の位置情報を使用して自動的に設定される。
AutoCAD の Visual LISP では、ダイアログ ボックスを表示するためのツールを備えている。 AutoCAD互換CADの中でAutoLISP互換を謳っているものは大抵、DCLによるダイアログ表示もサポートされている。 参考:バージョン履歴とサポートAPI
LISPからダイアログボックスを使用する一般的な手順
- load_dialog で DCL ファイルをロードする。
- new_dialog で、表示するダイアログ ボックスを呼び出す。(この時、new_dialog が返す値を必ずチェックし、呼び出しが失敗していないか確認する。失敗した状態で start_dialog を呼び出すと、予測できない結果になる可能性がある。)
- ダイアログのタイル値やリスト、イメージなどの設定を初期化したり、action_tile タイルの挙動を設定したりする。この時使用するダイアログ関数は set_tile、mode_tile、start_list、add_list、end_list、start_image、vector_image、fill_image、slide_image、end_image、client_data_tile となる。
- start_dialog でダイアログを呼び出す。この時点でコントロールがダイアログ ボックスに切り替わる。
- (ユーザの操作により アクション(コールバック)内からユーザ入力を処理する。get_tile、get_attr、set_tile、mode_tile などが処理される。
- ユーザが終了ボタン(あるいは終了処理)を選択したときに done_dialog が呼び出される。これにより、start_dialog が値を返す。ここで、unload_dialog を呼び出し、DCL ファイルをロード解除する。
- 参考: LISPのダイアログ ボックス関数
サンプルコード <syntaxhighlight lang="lisp" line>
; ALLCONTROL.DCL 内の allct_dlg というダイアログを読み込み表示するサンプル
(defun viewdcl ( / dcl_id)
(setq dclfile "ALLCONTROL.DCL") (setq dcl_id (load_dialog dclfile)) (if (new_dialog "allct_dlg" dcl_id) (progn ; ダイアログの挙動・設定を記述 ation_tile mode_tile set_tile など
(start_dialog) ; ダイアログ表示 (unload_dialog dcl_id) ; ダイアログのアンロード ) (princ (strcat "error:" dclfile "ファイルがみつかりません。")) )
) </syntaxhighlight>
- DCL ファイルには複数のダイアログを保存しておくことが出来るので、メモリに余裕があればすべてのダイアログ ボックスを一度にロードしておき、特定のダイアログ ボックスを逐次 new_dialog にて呼び出すことができる。厳しいメモリ環境を考慮するなら複数の DCL ファイルを作成し、load_dialogと unload_dialog を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログで消費されるメモリなどたかが知れてるので、ロードしたままでも問題にはなりにくいと思われる。
タイルの種類
タイルの種類は、以下の通り。(すべて小文字な点に注意)
- 標準のボタン (サブアセンブリ)
- 定義済みのアクティブ タイル
-
- button
- edit_box
- list_box
- multi_edit_box *intellicad only
- popup_list
- radio_button
- toggle
- slider
- image_button
- 文字クラスタ
DCLファイルの雛形
ひな形です。 dcl_settings の行はDCLの監査機能を有効にしています。
<syntaxhighlight lang="lisp" line> dcl_settings : default_dcl_settings { audit_level = 3; } // HELLO.DCL
hello : dialog {
label = "サンプル ダイアログ ボックス"; : text { label = "Hello, world"; } : button { key = "accept"; label = "OK"; is_default = true; fixed_width=true; alignment=centered; }
} </syntaxhighlight>
タイルの属性
タイルの属性は、以下の通り。
全体の属性 | |
---|---|
属性名 | 適用タイル |
alignment fixed_height fixed_width height width |
すべてのタイル |
アクションタイルの属性 | |
---|---|
属性名 | 適用タイル |
action is_enabled is_tab_stop key mnemonic |
button; edit_box; image_button; list_box; popup_list; radio_button; slider; toggle; radio_column; radio_row |
タイルクラスタの属性 | |
---|---|
属性名 | 適用タイル |
children_alignment children_fixed_height children_fixed_width |
row; column; radio_row; radio_column; boxed_row; boxed_column; boxed_radio_row; boxed_radio_column. |
特定のタイルで使用する属性 | |
---|---|
属性名 | 適用タイル |
allow_accept | edit_box; image_button; list_box |
aspect_ration | image; image_button. |
big_increment | slider. |
color | image; image_button. |
edit_limit | edit_box. |
edit_width | edit_box; popup_list. |
fixed_width_font | edit_box; popup_list. |
initial_focus | dialog. |
is_bold | text. |
is_cancel | button. |
is_default | button. |
label | boxed_row; boxed_column; boxed_radio_row; boxed_radio_column; button; dialog; edit_box; list_box; popup_list; radio_button; text; toggle. |
layout | slider. |
list | list_box; popup_list. |
max_value | slider. |
min_value | slider. |
multiple_select | list_box. |
password_char | edit_box. |
small_increment | slider. |
tabs | list_box; popup_list. |
tab_truncate | list_box; popup_list |
value | text; all active tiles (except buttons and image_buttons). |
互換CADでのDCL表示サンプル
以下は同じDCLファイルを各互換CADで表示したサンプルである。 見て分かるように、同じDCLでも解釈が異なるため、各コントロールの左右やレイアウトは全く同じにはならない。