marting 发表于 2018-1-28 22:23:45

GRID实现类EXCEL的表格

下面是个GRID的例子,实现了,一个CELL输入完,回车,光标自动激活下一个CELL
到最后一个CELL,回车会自动增加行。像个EXCEL的样子了。







liuyj 发表于 2018-1-28 22:33:25

能增加列吗?

liunian0524 发表于 2018-1-29 08:03:57

感谢大师分享

liuyj 发表于 2018-1-29 17:51:26

试了一下,可以显示多列,但不能编辑,得修改程序。能不能再加个增加列的功能

newer 发表于 2018-1-29 18:00:34

liuyj 发表于 2018-1-29 17:51


对应用来说,列是程序定的,行是用户数据,你在ODCL设计里面设计好列就行了并相关调整下就行了。
不应该存在用户临时增加列的。

liuyj 发表于 2018-1-29 18:04:50

我想增加到4列,该修改哪些语句?

yangjian001 发表于 2018-1-30 08:34:59

回车会自动增加行

amw333 发表于 2018-1-30 09:09:51

liuyj 发表于 2018-1-29 18:04


个人感觉,改下面三句:
1、(dcl-Grid-AddColumns GrdTest/Form/Grd '(("" 2 30) ("A" 0 60) ("B" 0 60)))改为(dcl-Grid-AddColumns GrdTest/Form/Grd '(("" 2 30) ("A" 0 60) ("B" 0 60) ("C" 0 60)));;;增加了C列
2、(dcl-Control-SetColumnStyleList GrdTest/Form/Grd '(0 6 6))改为(dcl-Control-SetColumnStyleList GrdTest/Form/Grd '(0 6 6 6));;;为C列设置格式
3、(setq colCnt 3)改为(setq colCnt 4);;;把列数设为4

liuyj 发表于 2018-1-30 10:38:25

amw333 发表于 2018-1-30 09:09


修改成功,多谢!

newer 发表于 2018-1-30 11:29:04

liuyj 发表于 2018-1-30 10:38


把修改成功的完整的代码贴上来啊。

liuyj 发表于 2018-1-30 12:00:58

newer 发表于 2018-1-30 11:29



;;;模仿excel输入
(defun c:Grdtest (/                                   c:GrdTest/Form#OnCancelClose
                      c:GrdTest/Form#OnInitializec:GrdTest/Form#OnTimer
                      c:GrdTest/Form/BtnOk#OnClicked
                      c:GrdTest/Form/ChkAddRows#OnClicked
                      N_CurCell                           N_NextCell
                      addRowsP                           StyleList
                      ColumnCnt                           Collist
                     )
(defun sn:leftnthlst (n lst)
;;;返回一个表中的前n个元素的表
;;;示例:(sn:leftnthlst 2 '(1 2 3 4 5 6));返回表(1 2)
;;;如果输入的n值大于表长返回原表;小于1返回nil
    (vl-remove nil
             (mapcar '(lambda        (x)
                          (if (>= (setq n (1- n)) 0)
                          x
                          nil
                          )
                        )
                     lst
             )
    )
)
(defun c:GrdTest/Form#OnCancelClose (reason)
    (if        (zerop reason)
      (progn (cond ((not (print (dcl-GetFocus)))
                                        ; Workaround. Would not work if there are multiple grids.
                  (N_NextCell)
                   )
                   ((= (last (dcl-GetFocus)) "Grd") (N_CurCell))
             )
             T                                ; Prevent closing.
      )
    )
)
(defun c:GrdTest/Form#OnInitialize ()
    (setq addRowsP nil)
    (dcl-Control-SetValue GrdTest/Form/ChkAddRows 0)
    (dcl-Grid-AddColumns
      GrdTest/Form/Grd
      (append '(("" 2 30)) (sn:leftnthlst ColumnCnt Collist))
    )
    (dcl-Control-SetColumnStyleList
      GrdTest/Form/Grd
      (cons 0
          (repeat ColumnCnt (setq StyleList (cons 6 StyleList)))
      )
    )
    (mapcar '(lambda (num)
             (dcl-Grid-AddRow GrdTest/Form/Grd (list (itoa num)))
             )
          '(1 2 3 4)
    )
    (dcl-Form-StartTimer GrdTest/Form 0)
)
(defun c:GrdTest/Form#OnTimer        ()
    (dcl-Grid-StartCellEdit GrdTest/Form/Grd 0 1)
)
(defun c:GrdTest/Form/BtnOk#OnClicked        ()
    (dcl-Form-Close GrdTest/Form)
)
(defun c:GrdTest/Form/ChkAddRows#OnClicked (value)
    (setq addRowsP (= value 1))
)
(defun N_CurCell (/ cur)
    (setq cur (dcl-Grid-GetCurCell GrdTest/Form/Grd)) ; Format: (row col).
    (dcl-Grid-StartCellEdit
      GrdTest/Form/Grd
      (car cur)
      (cadr cur)
    )
)
(defun N_NextCell (/ colCnt cur rowCnt)
    (setq colCnt (1+ ColumnCnt))        ; Includes index column.
    (setq rowCnt (dcl-Grid-GetRowCount GrdTest/Form/Grd))
    (setq cur (dcl-Grid-GetCurCell GrdTest/Form/Grd)) ; Format: (row col).
    (if        (and addRowsP
             (= (car cur) (1- rowCnt))
             (= (cadr cur) (1- colCnt))
        )
      (dcl-Grid-AddRow
        GrdTest/Form/Grd
        (list (itoa (setq rowCnt (1+ rowCnt))))
      )
    )
    (if        (and (/= (car cur) -1) (/= (cadr cur) -1))
      (dcl-Grid-StartCellEdit
        GrdTest/Form/Grd
        (if (= (cadr cur) (1- colCnt))
          (rem (1+ (car cur)) rowCnt)
          (car cur)
        )
        (if (= (cadr cur) (1- colCnt))
          1
          (1+ (rem (cadr cur) colCnt))
        )
      )
    )
)
(setq        StyleList '()
        ColumnCnt (uint 1 "" "\n输入列数" 4)
        Collist          '(("A" 0 60)
                  ("B" 0 60)
                  ("C" 0 60)
                  ("D" 0 60)
                  ("E" 0 60)
                  ("F" 0 60)
                  ("G" 0 60)
                  ("H" 0 60)
                  ("I" 0 60)
                  ("J" 0 60)
                  ("K" 0 60)
                  ("L" 0 60)
                  ("M" 0 60)
                  ("N" 0 60)
                   )
)
(setvar 'cmdecho 0)
(vl-cmdf "_Opendcl")
(setvar 'cmdecho 1)
(dcl-Project-Load "GrdTest" T)
(dcl-Form-Show GrdTest/Form)
(princ)
)

先到N,足够用了,不够再加。但是怎么返回输入的二维表呢?opendcl实在是不太会

8142556 发表于 2018-1-30 12:03:06

很好的例子

amw333 发表于 2018-1-30 17:22:36

liuyj 发表于 2018-1-30 12:00


不知还有没有更好的方法:
1、获取指定单元格的值:(dcl-Grid-GetCellText GrdTest/Form/Grd Row Long] Column Long]);返回值为string
2、获取指定行的值:(dcl-Grid-GetRowCells GrdTest/Form/Grd Row Long]);返回值为List of Strings as (Cell0Label Cell1Label ...)
3、获取指定列的值:(dcl-Grid-GetColumnCells GrdTest/Form/Grd Column Long]);返回值为List of Strings as (Cell0LabelCell1Label ...)

被承包的东子 发表于 2018-5-3 15:47:00

实在是帮了我的大忙了{:1_12:}

wdmzslw 发表于 2018-6-25 21:03:29

请问marting老师,你这个表格中的列宽可以设置为固定,不允许调整么?
页: [1] 2
查看完整版本: GRID实现类EXCEL的表格