2009年1月18日星期日

DCL对话框开关控件(toggle)的赋值技巧

灵活利用LISP的EVAL函数,在对对话框的开关控件(toggle)赋值时可以大大简化程序设计。尤其是如果结合用LISP程序生成DCL文件技术,我们就可以生成选项不定的开关控件并对其进行控制(这一点,留待以后在叙述)。如下图所示的多选开关对话框,在程序中利用(SETQ str "abcdefghxyz")语句,并结合(SET_TILE (EVAL letter) "1")语句,完成了初始赋值。只要改变字符串str(当然也可以用表),就可以得到不同的效果。


对应的DCL文件如下,如果该DCL文件用lisp程序生成,则label、key甚至label的数量都可以根据需要动态改变。

letter : dialog {

label= "Letter";

fixed_height = true;

: boxed_column {

letter = " ";

: row {

fixed_width = true;

: toggle { label= "A"; key= "letter_a"; width = 5; }

: toggle { label= "B"; key= "letter_b"; width = 5; }

: toggle { label= "C"; key= "letter_c"; width = 5; }

: toggle { label= "D"; key= "letter_d"; width = 5; }

: toggle { label= "E"; key= "letter_e"; width = 5; }

: toggle { label= "F"; key= "letter_f"; width = 5; }

: toggle { label= "G"; key= "letter_g"; width = 5; }

: toggle { label= "H"; key= "letter_h"; width = 5; }

: toggle { label= "I"; key= "letter_i"; width = 5; }

: toggle { label= "J"; key= "letter_j"; width = 5; }

: toggle { label= "K"; key= "letter_k"; width = 5; }

: toggle { label= "L"; key= "letter_l"; width = 5; }

: toggle { label= "M"; key= "letter_m"; width = 5; }

: toggle { label= "N"; key= "letter_n"; width = 5; }

}

: row {

fixed_width = true;

: toggle { label= "O"; key= "letter_o"; width = 5; }

: toggle { label= "P"; key= "letter_p"; width = 5; }

: toggle { label= "Q"; key= "letter_q"; width = 5; }

: toggle { label= "R"; key= "letter_r"; width = 5; }

: toggle { label= "S"; key= "letter_s"; width = 5; }

: toggle { label= "T"; key= "letter_t"; width = 5; }

: toggle { label= "U"; key= "letter_u"; width = 5; }

: toggle { label= "V"; key= "letter_v"; width = 5; }

: toggle { label= "W"; key= "letter_w"; width = 5; }

: toggle { label= "X"; key= "letter_x"; width = 5; }

: toggle { label= "Y"; key= "letter_y"; width = 5; }

: toggle { label= "Z"; key= "letter_z"; width = 5; }

}

}

ok_cancel;

}



;Lisp程序:

(DEFUN c:test (/ str char label)

(SETQ str "abcdefghxyz") ;

(SETQ DCL_ID (LOAD_DIALOG "test"))

(NEW_DIALOG "letter" dcl_id)

(WHILE (/= str "")

(SETQ char (STRCASE (SUBSTR str 1 1) T)

str (SUBSTR str 2)

letter (STRCAT "letter_" char)

)

(SET_TILE (EVAL letter) "1")

)

(ACTION_TILE "access" "(done_dialog 1)")

(START_DIALOG)

)

0 评论:

Template Designed by Douglas Bowman - Updated to New Blogger by: Blogger Team
Modified for 3-Column Layout by Hoctro