- UID
- 675574
- 积分
- 450
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2013-5-4
- 最后登录
- 1970-1-1
|
发表于 2013-5-8 21:00:43
|
显示全部楼层
本帖最后由 Gdlprfcu 于 2013-5-8 21:04 编辑
为了证明自己的想法,也做了一个TEXTBOX替换GRID输入方法,却发现了个至命问题:当行或列超出Grid控件的时候,我没法计算到单元格的准确位置,所以这种方法只能在控件能完全显示行和列的情况下使用,但这样就完全失去Grid控件真正作用了,LZ你另一帖所说的BUG你可以试下我的方法。
[pcode=lisp,true](if(setq dclpath(findfile "GridForm.lsp"))
(progn
(dcl_Project_Import (load dclpath))
)
(progn
(princ "找不到DCL文件,程序退出。")
(vl-exit-with-error "错误,找不到DCL文件")
)
)
(defun c:ShowForm(/ GetCellPos c:Form_OnCancelClose)
;;-----------获取单元格相对对话框的位置和尺寸函数---------------
(defun GetCellPos(Row Column /)
(setq gridpos(dcl_Control_GetPos Grid))
(setq Wide(dcl_Grid_GetColumnWidth Grid Column))
(setq High(dcl_Control_GetRowHeight Grid))
(setq x(car gridpos))
(setq n 0)
(repeat Column
(setq x(+ x (dcl_Grid_GetColumnWidth Grid n)))
(setq n(1+ n))
)
(setq x(+ x 3));有误差
(setq y(+(* Row High)High 10));有误差
(list x y Wide High)
)
;;----------------对话框初始化事件-------------
(defun c:Form_OnInitialize (/ n)
(setq n 0)
(repeat 20
(dcl_Grid_AddString Grid CellLabels "" )
(dcl_Grid_SetCellText Grid n 0 (itoa(1+ n)))
(setq n(1+ n))
)
)
;;----------------对话框取消关闭事件,作用:防止回车、Esc键关闭对话框-------------
(defun c:Form_OnCancelClose (Reason /)
(cond
((= Reason 1)
(setq *Cancel* t)
(dcl_Control_SetFocus Grid)
)
((and *EditColumn* *EditRow*(= Reason 0))
(dcl_Grid_SetCurCell Grid (1+ *EditRow*) *EditColumn*)
(dcl_Control_SetFocus Grid)
)
; ((and(>(car(setq lis(dcl_Grid_GetCurCell Grid)))0)(>(cadr lis)0))
; (dcl_Grid_SetCurCell Grid (1+ (car lis)) (cadr lis))
; )
)
t
)
;;-----------表格双击事件,作用:激活TextBox并设置焦点---------------
(defun c:Grid_On双击 (Row Column /)
(setq *EditRow* Row *EditColumn* Column)
(setq text(dcl_Grid_GetCellText Grid Row Column ))
(dcl_Control_SetText TextBoxName text )
(dcl_Control_SetVisible TextBoxName t)
(dcl_Control_SetEnabled TextBoxName t)
(dcl_TextBox_SetSel TextBoxName (setq n(strlen text)) (1+ n))
)
;;----------表格选择改变事件,作用:移动需要的控件到选择的单元----------------
(defun c:Grid_OnSelChanged (Row Column /)
(setq Cellpos(GetCellPos Row Column))
(dcl_Control_SetPos TextBoxName (car Cellpos)(cadr Cellpos)(caddr Cellpos)(cadddr Cellpos))
)
;;----------表格键盘按下事件,作用:按需激活TextBox并设置焦点、----------------
(defun c:Grid_OnKeyDown (Character RepeatCount Flags / lis)
; (dcl_MessageBox (strcat "按下的键码为" (itoa flags)) "提示")
(setq lis(dcl_Grid_GetCurCell Grid))
(if (and(>=(car lis)0)(>=(cadr lis)0))
(progn
(cond
((= Flags 28)
(dcl_Grid_SetCurCell Grid (1+ (car lis)) (cadr lis))
)
((and (/= Flags 331) (/= Flags 333)(/= Flags 328)(/= Flags 336));具体要排除的还有很多。。。。
; (or(and (> Flags 1)(< Flags 13))(and (> Flags 15)(< Flags 28)))
(setq *EditRow*(car lis)*EditColumn*(cadr lis))
(dcl_Control_SetText TextBoxName Character )
(dcl_Control_SetVisible TextBoxName t)
(dcl_Control_SetEnabled TextBoxName t)
(dcl_TextBox_SetSel TextBoxName 1 2)
)
)
)
)
)
;;----------TextBox失去焦点事件,作用:隐藏自身并把值返回给表格----------------
(defun c:TextBoxName_OnKillFocus (/)
(if (and *EditRow* *EditColumn*(not *Cancel*));不是按Esc键取消,就把值返回给Grid
(dcl_Grid_SetCellText Grid *EditRow* *EditColumn* (dcl_Control_GetText TextBoxName))
)
(setq *EditRow* nil *EditColumn* nil *Cancel* nil)
(dcl_Control_SetText TextBoxName "")
(dcl_Control_SetVisible TextBoxName nil)
(dcl_Control_SetEnabled TextBoxName nil)
(dcl_Control_SetFocus Grid)
)
;;----------TextBox键盘按下事件--------------------------------
(defun c:TextBoxName_OnKeyDown (Character RepeatCount Flags /)
; (dcl_MessageBox (strcat "按下的键码为" (itoa flags)) "提示")
(cond
((= Flags 331);向左
(dcl_Grid_SetCurCell Grid *EditRow* (1- *EditColumn*))
(dcl_Control_SetFocus Grid)
)
((= Flags 333);向右
(dcl_Grid_SetCurCell Grid *EditRow* (1+ *EditColumn*))
(dcl_Control_SetFocus Grid)
)
((= Flags 328);向上
(dcl_Grid_SetCurCell Grid (1- *EditRow*) *EditColumn*)
(dcl_Control_SetFocus Grid)
)
((= Flags 336);向下
(dcl_Grid_SetCurCell Grid (1+ *EditRow*) *EditColumn*)
(dcl_Control_SetFocus Grid)
);;缺点TAB键不能换列
)
)
;----------关闭按钮点击事件-----------------------
(defun c:GridForm_Form1_TextButton1_On点击 (/)
(dcl_Form_Close Form )
)
(dcl_form_show Form)
)
[/pcode]
|
|