GRID实现类EXCEL的表格
下面是个GRID的例子,实现了,一个CELL输入完,回车,光标自动激活下一个CELL到最后一个CELL,回车会自动增加行。像个EXCEL的样子了。
能增加列吗? 感谢大师分享 试了一下,可以显示多列,但不能编辑,得修改程序。能不能再加个增加列的功能 liuyj 发表于 2018-1-29 17:51
对应用来说,列是程序定的,行是用户数据,你在ODCL设计里面设计好列就行了并相关调整下就行了。
不应该存在用户临时增加列的。
我想增加到4列,该修改哪些语句? 回车会自动增加行 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 amw333 发表于 2018-1-30 09:09
修改成功,多谢!
liuyj 发表于 2018-1-30 10:38
把修改成功的完整的代码贴上来啊。
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实在是不太会
很好的例子 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 ...)
实在是帮了我的大忙了{:1_12:} 请问marting老师,你这个表格中的列宽可以设置为固定,不允许调整么?
页:
[1]
2