明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 9295|回复: 41

[【不死猫】] [原创作品]模仿面向对象实现动态DCL代码生成器(开源)

    [复制链接]
发表于 2014-9-16 17:51 | 显示全部楼层 |阅读模式
本帖最后由 不死猫 于 2015-3-22 22:52 编辑

动态DCL的方法有很多,我曾经也发过3种制作的方案.
今天带来的是更加直观的模仿面向对象,为控件赋属性的方法.
定义函数如下:
(dcl-make 名称)
用于定义一个新的dcl控件
(dcl-put 控件 属性 值)
用于设置控件的属性
(dcl-get 控件 属性)
用于获取控件的属性
(dcl-add 控件 子控件)
用于把子控件添加到父控件上面

这几个函数源码在下面提供免费下载.
源码免币下载:

====================================
简单测试1[code="lisp] (defun c:tt1()
  (vl-load-com)
;定义控件并设置属性
  (setq dialog (dcl-make "dialog"))
  (dcl-put 'dialog "name" "test")
  (dcl-put 'dialog "label" "测试1")
  
  (setq button1 (dcl-make "button"))
  (dcl-put 'button1 "key" "button1")
  (dcl-put 'button1 "label" "点我")
  (dcl-put 'button1 "width" "20")
  (dcl-put 'button1 "height" "1")
;定义完成
  
;从内向外添加
  (dcl-add 'dialog 'button1)
  
;制作
  (setq dcl (dcl-convert dialog))
  (dcl-show dcl)
)[/code]执行结果:
简单测试2[code="lisp] (defun c:tt2()
  (vl-load-com)
;定义控件并设置属性
  (setq dialog (dcl-make "dialog"))
  (dcl-put 'dialog "name" "test")
  (dcl-put 'dialog "label" "test")
  
  (setq boxed_column1 (dcl-make "boxed_column"))
  (dcl-put 'boxed_column1 "label" "ok")
  
  (setq edit_box1 (dcl-make "edit_box"))
  (dcl-put 'edit_box1 "key" "editbox1")
  (dcl-put 'edit_box1 "label" "输入1")
  (dcl-put 'edit_box1 "width" "20")
  (dcl-put 'edit_box1 "height" "1")
  
  (setq edit_box2 (dcl-make "edit_box"))
  (dcl-put 'edit_box2 "key" "editbox2")
  (dcl-put 'edit_box2 "label" "输入2")
  (dcl-put 'edit_box2 "width" "20")
  (dcl-put 'edit_box2 "height" "1")
;定义完成
  
;从内向外添加
  (dcl-add 'boxed_column1 'edit_box1)
  (dcl-add 'boxed_column1 'edit_box2)
  (dcl-add 'dialog 'boxed_column1)
  
;制作
  (setq dcl (dcl-convert dialog))
  (dcl-show dcl)
)[/code]执行结果:
简单测试3[code="lisp] (defun c:tt3()
  (vl-load-com)
;定义控件并设置属性
  (setq dialog (dcl-make "dialog"))
  (dcl-put 'dialog "name" "test")
  (dcl-put 'dialog "label" "test")
  
  (setq boxed_column1 (dcl-make "boxed_column"))
  (dcl-put 'boxed_column1 "label" "ok")
  (setq boxed_row1 (dcl-make "boxed_row"))
  (dcl-put 'boxed_row1 "label" "列表")
  
  (setq edit_box1 (dcl-make "edit_box"))
  (dcl-put 'edit_box1 "key" "editbox1")
  (dcl-put 'edit_box1 "label" "输入1")
  (dcl-put 'edit_box1 "width" "20")
  (dcl-put 'edit_box1 "height" "1")
  
  (setq edit_box2 (dcl-make "edit_box"))
  (dcl-put 'edit_box2 "key" "editbox2")
  (dcl-put 'edit_box2 "label" "输入2")
  (dcl-put 'edit_box2 "width" "20")
  (dcl-put 'edit_box2 "height" "1")
  
  (setq edit_box3 (dcl-make "list_box"))
  (dcl-put 'edit_box3 "key" "list_box1")
  (dcl-put 'edit_box3 "width" "20")
  (dcl-put 'edit_box3 "height" "20")
;定义完成
  
;从内向外添加
  (dcl-add 'boxed_column1 'edit_box1)
  (dcl-add 'boxed_column1 'edit_box2)
  (dcl-add 'boxed_row1 'edit_box3)
  (dcl-add 'dialog 'boxed_column1)
  (dcl-add 'dialog 'boxed_row1)
  
;制作
  (setq dcl (dcl-convert dialog))
  (dcl-show dcl)
)[/code]执行结果
下面玩个小循环[code="lisp] (defun c:tt4()
;定义控件并设置属性
  (setq dialog (dcl-make "dialog"))
  (dcl-put 'dialog "name" "test")
  (dcl-put 'dialog "label" "测试4")
  (setq i 1 num 10)
  (repeat num
    (set (read (strcat "boxed_column" (itoa i))) (dcl-make "boxed_column"))
    (dcl-put (read (strcat "boxed_column" (itoa i))) "label" ":)")
    (setq i (1+ i))
  )

  (setq i 1)
  (repeat num
    (set (read (strcat "button" (itoa i))) (dcl-make "button"))
    (dcl-put (read (strcat "button" (itoa i))) "key" (strcat "button" (itoa i)))
    (dcl-put (read (strcat "button" (itoa i))) "label" (strcat "点我" (itoa i)))
    (dcl-put (read (strcat "button" (itoa i))) "width" "20")
    (dcl-put (read (strcat "button" (itoa i))) "height" "1")
    (setq i (1+ i))
  )
;定义完成
  
;从内向外添加
  (setq i 1)
  (repeat (1- num)
    (dcl-add (read (strcat "boxed_column" (itoa i))) (read (strcat "button" (itoa i))))
    (dcl-add (read (strcat "boxed_column" (itoa (1+ i)))) (read (strcat "boxed_column" (itoa i))))
    (setq i (1+ i))
  )
  (dcl-add 'dialog (read (strcat "boxed_column" (itoa i))))
  
;制作
  (setq dcl (dcl-convert dialog))
  (dcl-show dcl)
)[/code]执行结果:

源代码写了56行,就直接发了.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 6明经币 +11 金钱 +110 收起 理由
wangph + 1 + 50 神马都是浮云
spp_wall + 1 赞一个!
qjchen + 2 + 30 很给力!
zctao1966 + 1 很给力!
xiaxiang + 3 很给力!
Gu_xl + 3 + 30 很给力!

查看全部评分

发表于 2014-9-16 17:55 来自手机 | 显示全部楼层
猫老师又出精品了
 楼主| 发表于 2014-9-16 18:00 | 显示全部楼层
横向的控件制作  只需添加一个row即可[code="lisp] (defun c:tt22()
;定义控件并设置属性
        (setq dialog (dcl-make "dialog"))
        (dcl-put 'dialog "name" "test")
        (dcl-put 'dialog "label" "test")
       
        (setq boxed_column1 (dcl-make "boxed_column"))
        (dcl-put 'boxed_column1 "label" "ok")
        (setq row1 (dcl-make "row"))
       
        (setq edit_box1 (dcl-make "edit_box"))
        (dcl-put 'edit_box1 "key" "editbox1")
        (dcl-put 'edit_box1 "label" "输入1")
        (dcl-put 'edit_box1 "width" "20")
        (dcl-put 'edit_box1 "height" "1")
       
        (setq edit_box2 (dcl-make "edit_box"))
        (dcl-put 'edit_box2 "key" "editbox2")
        (dcl-put 'edit_box2 "label" "输入2")
        (dcl-put 'edit_box2 "width" "20")
        (dcl-put 'edit_box2 "height" "1")
;定义完成
       
;从内向外添加
        (dcl-add 'row1 'edit_box1)
        (dcl-add 'row1 'edit_box2)
        (dcl-add 'boxed_column1 'row1)
        (dcl-add 'dialog 'boxed_column1)
       
;制作
        (setq dcl (dcl-convert dialog))
        (dcl-show dcl)
)[/code]
 楼主| 发表于 2014-9-16 18:01 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-16 18:13 | 显示全部楼层
不错,很好的示例
发表于 2014-9-16 19:26 | 显示全部楼层
猫兄又鼓捣出新东西了
发表于 2014-9-16 19:55 | 显示全部楼层
哇!又有好东西了!支持。
发表于 2014-9-16 20:23 | 显示全部楼层
不错的思路
发表于 2014-9-16 20:44 | 显示全部楼层
支持一个!
发表于 2014-9-16 20:44 | 显示全部楼层
好东西都要玩隐藏。

点评

那就不隐藏好啦  发表于 2014-9-16 22:50
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2017-10-21 03:28 , Processed in 0.268992 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表