ycllzhou 发表于 2014-10-14 18:21:33

谢谢了,一直没有搞明白

skg123 发表于 2015-10-31 17:39:05

学习了一下,也在上面修改了一下,通过读取文本录入数据(DEFUN c:test ( /)
;文本数据格式:
;钢管 123 65.8
;钢板 1232 78
;混凝土 121 34

; (setq gVar '( ("钢管"   "1724"    "65.8")
;             ("钢筋"   "26.23"   "4564.3")
;            ("模板"   "1853""9.7")
;         ("混凝土1" "449.2" "370")
   ;          ("混凝土2" "449.2" "380")
    ;         ("混凝土3" "454.2" "300")
   ;      ("混凝土4" "1002" "390")
      ;       ("混凝土5" "449.2" "390" )
;       ))


;;=================================
(setq gVar nil)
(if        (and (setq FILE        (getfiled "选择参数数据文件:名称 数量 单价"
                                  ""
                                  "txt"
                                  4
                        )
             )
             ;;读模式打开lsp文件
             (setq F1 (open FILE "r"))
)
        (progn
          ;;逐行读入
   (while (setq STR (read-line F1))
             (setq LST (read (strcat "(" STR ")")))
            (setq LST_s (list (mapcar 'vl-prin1-to-string LST)) )
;(setq LST_s (mapcar 'vl-prin1-to-string '(钢筋 2 3 4) ));这个对于汉字可行;返回("钢筋" "2" "3" "4" )
;(setq LST_Cc (mapcar 'itoa lst ));这个对于数字可行
          ;(setq LST_s (mapcar 'itoa 'LST) )
                (if (= (length LST) 3)(setq gVar (append LST_s gVar )));end if
             );end while
    );end progn
(close File)
);end if
(setq gVar (reverse gVar))
;;;;=================================

(setvar "CMDECHO" 0)
(if (null (vl-symbol-value 'dcl_getversionex))(loadRtime))

;; (Dcl_Project_Import (vl-get-resource "test.odcl"))   ;;程序打包时使用

   (dcl_Project_Load "test.odcl");;调试时使用,编译时屏蔽
   (dcl_FORM_SHOW test_Dtest)
       ;;控制交给对话框
   (dcl_Project_Unload "test")

Reture
)



(defun c:test_Dtest_OnInitialize (/)

(setq i (length gvar)) ;;默认数据的长度
;(setq i (length LST_CS)) ;;默认数据的长度
(Odcl_Grid_full_Fun i)
(Odcl_Grid_Set_Fun gvar)   ;;默认赋值
;(Odcl_Grid_Set_Fun LST_CS)   ;;默认赋值

;;初始化下拉列表
(dcl_Control_SetList test_Dtest_ComboBox1 '("1" "2" "3" "4" "5" "6" "7" "8" "9" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
(dcl_ComboBox_SetCurSel test_Dtest_ComboBox1 (- i 1))
)



(defun c:test_Dtest_Grid1_OnSelChanged (nRow nCol /)
(dcl_Control_SetText test_Dtest_TextBox1 (dcl_Grid_GetCellText test_Dtest_Grid1nRow nCol))
)





;;返回下拉列表的值,填充Grid
(defun c:test_Dtest_ComboBox1_OnSelChanged (ItemIndexOrCount Value /)
(setq i (atoi Value))
(Odcl_Grid_full_Fun i)
)


;;计算
(defun c:test_Dtest_Cmd2_OnClicked (/)

(setq na (dcl_Grid_GetRowCount test_Dtest_Grid1)) ;;行
(setq a 0)
(repeat na
         (dcl_Grid_SetCellText test_Dtest_Grid1 a 4 (rtos
            (* (atof (dcl_Grid_GetCellText test_Dtest_Grid1 a 2))
         (atof (dcl_Grid_GetCellText test_Dtest_Grid1 a 3)))))
          (setq a (+ a 1))
)
   (setq Reture (Odcl_Grid_Get_Fun))
)


;;填充Grid列表框函数
(defun Odcl_Grid_full_Fun(i / a b c)
(setq a 0)
(dcl_Grid_Clear test_Dtest_Grid1) ;;清除

(repeat i (Dcl_Grid_Addrow test_Dtest_Grid1 (itoa (setq a (+ a 1))) "") )
(setq b 1);;列
(repeat 4   ;;按列
       (setq a 0)
       (repeat i   
         (if (= b 1)(setq c 6)(setq c 9))
         (dcl_Grid_SetCellStyle test_Dtest_Grid1 a b c)
       (setq a (+ a 1))
   )(setq b (+ b 1))
)
)


;;给Grid赋值
(defun Odcl_Grid_Set_Fun( va / a b)
(setq a 0 ) ;;行
(repeat (length va)
   (setq b 0);;列
   (repeat (length (nth 0 va))
         (dcl_Grid_SetCellText test_Dtest_Grid1 a (+ b 1) (nth b (nth a va)))
         (setq b (+ b 1))
   )
    (setq a (+ a 1))
)
)


;;提取Grid数据
(defun Odcl_Grid_Get_Fun( / na nb a b ab sab)
(setq na (dcl_Grid_GetRowCount test_Dtest_Grid1)) ;;行
(setq nb (dcl_Grid_GetColumnCount test_Dtest_Grid1)) ;;列
(setq Sab '() ab '())
(setq a 0)
(repeat na
      (setq b 0)
      (repeat nb
             (setq ab (cons (dcl_Grid_GetCellText test_Dtest_Grid1 a b) ab))
             (setq b (+ b 1))
      )
   (setq Sab (cons (reverse ab) Sab))
   (setq a (+ a 1))
   (setq ab '())
)
(setq Sab (reverse Sab));reverse 函数是将表的顺序反向
)


;;关闭主窗口
(defun c:Untitled_dtest_cmd1_OnClicked (/)
(dcl_Form_Close test_Dtest)
)



;;禁止回车键关闭窗口,但会使窗口右上角的 x 关闭按钮失效
(defun c:test_Dtest_OnCancelClose (Reason /)
(/= Reason T)
)


;;加载 OpenDCL.xx.arx链接库文件
(defun loadRtime ( / acadversion arxname dclarxfile)
(setq acadversion (substr (getvar "acadver") 1 2))
(setq arxname (strcat "OpenDCL."acadversion".arx"))
(setq dclarxfile (findfile arxname))
(if (and (= (member arxname (arx) ) nil) (/= dclarxfile nil))
   (arxload dclarxfile)
   (alert (strcat "\n找不到" arxname "文件,请确认OpenDCL文件是否放在acad搜索路径中" ))
)
)


664571221 发表于 2016-1-7 13:16:08

这个怎么用

革天明 发表于 2016-4-12 21:39:39

yxp 发表于 2013-7-7 23:15 static/image/common/back.gif
初学,这是我的第一个练习的ODCL
新的odcl在这里
http://bbs.mjtd.com/thread-101970-1-1.html

请问单元格有没有某行(或者某个单无格被点击的事件或状态?

773786668 发表于 2016-4-27 21:17:00

学习谢谢楼主

anwil 发表于 2016-6-4 03:27:11

这插件很给力,谢谢分享。

人生华华 发表于 2017-8-29 19:06:22

楼主,请教一下,OPENDCL的表格   (dcl_Grid_SetCellText aaa_Form2_格1 2 1 "ddddffff")用这个无法赋值啊,。好像我打开对话框,默认表格是不可编辑的状态

pengfei2010 发表于 2017-10-4 20:18:39

感谢楼主的无私分享 谢谢

LIULISHENG 发表于 2018-4-14 08:50:46


学习了,顶楼主一个
页: 1 [2]
查看完整版本: 用grid控件实现简单的表格输入(源码)