找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3721|回复: 11

[分享] Grid接收方向和回车键的完美解决

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2013-5-7 06:52:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
感谢 GdlprfcuXDSoft  的帮助!

表格控件 Grid 对方向和回车键的控制终于完美解决
用两个通用函数就行了,欢迎大家一起来找茬并完善。

[pcode=lisp,true]


;;******************************************************************
;; 通用函数1: Grid_OnselChanged
;; 功能: 获取当前单元格的样式、屏幕位置设置 textbox 的跟随
;; 参数:
;;   <GrName> 控件 Grid 表格对象名称
;;   <R> 表格 GrName 的当前行
;;   <C> 表格 GrName 的当前列
;;   <TxtName> 控件 TextBox 对象名称
;; 返回: 单元格符合 GrTxtstyle 的样式要求时返回 t 否则返回 nil
;; 示例:
;; (Grid_OnselChanged test_Form1_Grid1 Row Column test_Form1_TextBox1)
;; BUG: 当 grid 列宽发生改变,textbox 的位置无法同步,原因是 openDCL 未提供列宽改变事件
(defun Grid_OnselChanged(GrName R C TxtName / tem RangePosit TextPosit textPosX textPosY)
(setq *Close-Main-Windows* t)
(setq RangeStyle (nth C (dcl_Control_GetColumnStyleList GrName)))
(setq tem (assoc RangeStyle GrTxtstyle))
(if tem (progn
   (dcl_Control_SetVisible TxtName t)
   ;;输入样式的同步
   (dcl_Control_SetFilterStyle TxtName (cadr tem))
   ;;单元格 Range 位置和大小与 textbox 同步
   (setq RangePosit (dcl_Control_GetPos GrName)
         TextPosit  (dcl_Control_GetPos TxtName)
         RangeWidth (dcl_Grid_GetColumnWidth GrName C)
         textPosX (+ (car RangePosit) (Colum-list-sum GrName C))
         textPosY (+ (cadr RangePosit) (* (+ R 1) 24)))
   (dcl_Control_SetPos TxtName (+ textPosX 3) (- textPosY 3) RangeWidth 24)
   ;;单元格内容与 textbox 同步
   (dcl_Control_SetText TxtName (dcl_Grid_GetCellText GrName R C))
   (dcl_Control_SetFocus TxtName)
))
)
;;end
;;******************************************************************


;;******************************************************************
;; 通用函数2: text-control-key
;; 功能: 根据按下的方向键操作文本框和表格
;; 参数:
;;   <GrName> 控件 Grid 表格对象名称
;;   <TxtName> 控件 TextBox 对象名称
;;   <code> TextBox 接收到的按键代码
;; 返回: 无
;; 样例: (Text-Control-Key test_Form1_Grid1 test_Form1_TextBox1 Flags)
(defun Text-Control-Key(GrName TxtName code / Cmax Rmax RCrange ss tem nR nC)
  (setq Cmax (dcl_Grid_GetColumnCount GrName)
        Rmax (dcl_Grid_GetRowCount GrName)
        RCrange (dcl_Grid_GetCurCell GrName) ;;当前单元格位置
        ss (dcl_Control_GetText TxtName))
  (dcl_Grid_SetCellText GrName (car RCrange) (cadr RCrange) ss)
  (if (setq tem (assoc code KeyCode))
  (progn
     ;;以下根据方向键计算单元格新的位置
      (setq nR (+ (car RCrange)  (nth 2 tem))
            nC (+ (cadr RCrange) (nth 3 tem)))
      ;;当单元格超过表格范围时,单元格指针停止移动
      (if (>= nR (- Rmax 1))(setq nR (- Rmax 1)))
      (if (< nR 0)(setq nR 0))
      (if (>= nC Cmax)(setq nC Cmax))
      (if (< nC 1)(setq nC 1))
      ;;当textbox 内容变化时更新单元格 Range
      (dcl_Grid_SetCurCell GrName nR nC)
      (Grid_OnselChanged GrName nR nC TxtName)
  ))
)
;;end
;;******************************************************************

;;按下方向键的回调事件,需自行修改控件名
(defun c:test_Form1_TextBox1_OnKeyDown (Character RepeatCount Flags /)
  (Text-Control-Key test_Form1_Grid1 test_Form1_TextBox1 Flags) ;;通用函数2
)

;;按下回车键的回调事件,需自行修改控件名
(defun c:test_Form1_TextBox1_OnReturnPressed (/ fx)
(setq fx (dcl_ComboBox_GetCurSel test_Form1_ComboBox1))
(text-control-key test_Form1_Grid1 test_Form1_TextBox1 (car (nth fx KeyCode))) ;;通用函数2
)
[/pcode]

附件Lsp和Odcl代码下载:
[sell]
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:test.rar 
下载次数:55  文件大小:5.51 KB 
下载权限: 不限 以上  [免费赚D豆]


[/sell]


888.jpg

评分

参与人数 2威望 +1 D豆 +10 贡献 +1 收起 理由
XDSoft + 5 + 1 有始有终奖!
牢固 + 1 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-5-7 07:23:16 | 显示全部楼层
恭喜恭喜{:soso_e196:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-7 09:08:30 | 显示全部楼层
恭喜楼主,虽然10个豆,不贵不贵。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-7 09:22:50 | 显示全部楼层
楼主,能说明下具体的技巧和程序设计时候遇到的难处理的地方最后如何处理的,那样更好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-7 12:12:09 | 显示全部楼层
未命名1.jpg

为何不用失去焦点事件把它隐藏掉?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2013-5-7 17:45:10 | 显示全部楼层
本帖最后由 yxpxa 于 2013-5-7 18:04 编辑

感谢各位老大的关注!

因为通用函数1中的以下这两句。
29.    (dcl_Control_SetText TxtName (dcl_Grid_GetCellText GrName R C))
30.    (dcl_Control_SetFocus TxtName)
第一句是把当前单元格的内容读入 textbox ,第二句是设置 textbox 的焦点。
问题是,当鼠标单击 grid 时, 第一句执行了,第二句却不执行,百思不得其解。

所以如果用 textbox 失去焦点判断,鼠标单击时,textbox也是没有焦点的。
如果找到了这个 bug 就设置 text_OnKillFocus 时 textbox 的隐藏.


XDSoft 发表于 2013-5-7 09:22
楼主,能说明下具体的技巧和程序设计时候遇到的难处理的地方最后如何处理的,那样更好。

我以为,有通用函数了,有需要的人应该一看就明白。
那就再啰嗦两句:
1 在自己的程序里添加三个控件 Gride、 textbox、ComboBox
2 增加 Grid1_OnSelChanged 事件,调用通用函数1
3 增加 TextBox1_OnKeyDown 事件,调用通用函数2
4 增加 TextBox1_OnReturnPressed 事件,调用通用函数2
第三个控件 ComboBox 也不是必须的,比如可以将回车键以向下的方式固定调用,即 fx=1,如下
(text-control-key test_Form1_Grid1 test_Form1_TextBox1 (car (nth 1 KeyCode)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-7 21:46:25 | 显示全部楼层
yxpxa 发表于 2013-5-7 17:45
感谢各位老大的关注!

因为通用函数1中的以下这两句。

看来是你用的方法不对,我刚为了证明我的想法,也写一个,完全能解决你所说的BUG,但差不多写好的时候却发现了个至命问题:当行或列超出Grid控件的时候,我没法计算到单元格的准确位置,所以这种方法只能在控件能完全显示行和列的情况下使用。
未命名2.jpg

未命名3.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2013-5-8 02:07:58 | 显示全部楼层
本帖最后由 yxpxa 于 2013-5-8 02:46 编辑
Gdlprfcu 发表于 2013-5-7 21:46
看来是你用的方法不对,我刚为了证明我的想法,也写一个,完全能解决你所说的BUG,但差不多写好的时候却发 ...

有滚动条时的确无法读取单元格的真正位置,这真是一个让人沮丧的bug !!!
要不,到官网去问问软件的作者,看他有啥好办法。

我现在就想解决函数1 中那句得不到焦点的问题。
Gdlprfcu 兄,能个指个明路否
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-8 21:17:58 | 显示全部楼层
本帖最后由 Gdlprfcu 于 2013-5-8 21:19 编辑
yxpxa 发表于 2013-5-8 02:07
有滚动条时的确无法读取单元格的真正位置,这真是一个让人沮丧的bug !!!
要不,到官网去问问软件的作 ...

其实我是来找茬的:lol,模仿想完美是不可能做到的,想真完美只能学ObjectARX啦
我不知你是怎么做的,或者你可以看下我的做法,已在你以前发的帖回复里:http://bbs.xdcad.net/forum.php?mod=viewthread&tid=667813&page=1&extra=
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-30 15:17:05 | 显示全部楼层
最近在研究GRID控件
对我很有用的资料:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-31 15:18:23 | 显示全部楼层
正在学习grid控件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2015-1-24 21:26:48 | 显示全部楼层
谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-27 12:54 , Processed in 0.456823 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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