不死猫 发表于 2014-1-2 12:31:53

关于Grid表格控件不支持回车响应的替代方案

在grid表格控件上面如果某个表格设置为string则在用户编辑后回车无响应,必须点击其他表格触发selectchange才能触发函数的替代方案是:
在该string表格上面添加一个editbox控件,利用editbox的editchange事件来响应编辑,虽然稍麻烦一点,需要做动态添加和删除,但是效果比原来的文字编辑功能强大很多.
目前该事件建议已经提交给作者 不知道什么时候能采纳更新.

gdslqs 发表于 2014-1-3 09:04:33

猫老师有没有专门的odcl教材啊,你的淘宝上?

masterlong 发表于 2015-10-10 12:53:02

老猫具体是怎么实现的
能发个范例吗
实验了好久没成功啊
一个是卡在无法设置文本编辑控件覆盖选定的表格
另一个是选定表格后的“焦点”不能转移

masterlong 发表于 2015-10-11 12:38:58

详细说明一下
请老猫看看思路方面哪里存在问题

第一个问题
点击grid的某一个表格
如果表格本身没有出现滚动条
或者滚动条在顶部的时候
鼠标点击表格时
可以控制textbox控件完全覆盖选定的表格
滚动条不在顶部时
通过获取鼠标的实时位置
也能计算得到选定表格的“区域”
从而改变textbox以覆盖表格
但是当滚动条滑动时
因为textbox控件是“静止”的
所以选定的表格就显露了出来
这个问题严格来说
可以通过限制grid的行数不让滚动条出现来解决

遇到的第二个问题
当鼠标已经选定表格进入编辑模式以后
无法将焦点转移
这才是最头疼的地方
不能进入textbox进行编辑
其它的一切都无从谈起

masterlong 发表于 2015-10-11 14:40:03

本帖最后由 masterlong 于 2015-10-11 14:41 编辑

ok
终于解决了焦点转移的问题

(defun c:ystm/ystm/预设列表#OnSelChanged (Row Column /)
      (if (and (= row -1) (= column -1))                                                                           ;;注1
                ()
                (progn
                        .....                                                                                                          ;;注2                     
                        (dcl-Grid-SetCurCell ystm/ystm/预设列表 -1 -1)                                       ;;注3
                        (dcl-Control-SetBackColor ystm/ystm/隐藏文本编辑控件 2)
                        (dcl-Control-SetText ystm/ystm/隐藏文本编辑控件 "1234567")
                        (dcl-TextBox-SetSel ystm/ystm/隐藏文本编辑控件 2 5)
                )
      )
)

注1
if语句在之前不成功代码中是不存在的
不成功的代码只有progn内的语句但不包括“注3”

注2
省略号代表的是控制textbox控件覆盖选定单元格的代码

注3
我注意到在以前的某个程序里
在grid中可以将焦点在不同的单元格之间进行切换
于是想到如果将焦点设置到(-1 -1)单元格会出现什么情况
实验之后发现
增加“注3”之后的程序得到了执行
并且焦点从grid转移出去了
但同时出现“错误: 参数值错误: 非负: -1”的错误提示
经过分析得到如下判断:
“注3”语句本身是可以正确执行的
“注3”之后的语句也没有错误
这样唯一可能出错的地方就只有“注2”了
首先“注2”在row、column不等于-1的情况下执行了一次
然后是“注3”执行
这时又触发了一次OnSelChanged事件
而这一次事件被安排在第一次事件完全结束以后
第2次事件中row=column=-1不符合“注2”的参数要求
于是出现了错误提示
根据以上判断增加了if语句
实验结果符合预期
至此grid焦点转移的问题得到解决
由此也说明一点
以前不成功的代码中焦点实际也转移了
但是odcl的运行机制又将焦点“拉”了回来
导致看起来“焦点无法转移”


不知道老猫具体是怎样处理的
或许压根不需要这样“曲线救国”
有空的时候介绍一下呀

masterlong 发表于 2015-10-21 13:08:16

通过对odcl提供的范例的研究
发现odcl的grid其实是可以实现回车响应的
但是设置并不是直接在grid中进行
而是在form中实现

具体方式如下
form属性中设置OnCancelClose事件
(defun c:ystm/Form1#OnCancelClose (Reason /)
      (dcl_Grid_CancelCellEdit ystm/form1/格1)
      (/= Reason 1)
)

这样在grid中输入回车就可以结束编辑
此时“焦点”停留在当前“表格”
需要注意的是
事件代码中最后一句(/= Reason 1)是必须的
原因是odc需要根据事件的返回值作不同的处理

说一句个人的看法
这种方式确实实现了回车相应
但还是有局限性的
因为只有模式和无模式窗体可以设置OnCancelClose事件
其它的窗体如control bars没有该事件
有没有类似的方法
也可以在control bars得到回车响应呢
没试过估计很可能是不行

在上一贴里采用的方式
再搭配textbox控件中的键盘监视事件
现在可以支持“↑↓ Tab”
跟excel一样方便
最重要的是不受窗体类型的限制
等有时间做一个完整的范例
放上来供大家参考

zark 发表于 2016-3-12 22:55:17

masterlong 发表于 2015-10-21 13:08 static/image/common/back.gif
通过对odcl提供的范例的研究
发现odcl的grid其实是可以实现回车响应的
但是设置并不是直接在grid中进行


厉害,可惜Palettes没有ONCANCELCLOSE事件

革天明 发表于 2016-7-5 13:47:44

masterlong 发表于 2015-10-21 13:08 static/image/common/back.gif
通过对odcl提供的范例的研究
发现odcl的grid其实是可以实现回车响应的
但是设置并不是直接在grid中进行


请问Grid中的单元格如何才能编辑吗?我只有在偶尔情况下能编辑,但找到不到规律
(dcl_Grid_SetCellStyle YTMgcbz_Form1_grid1 i 0 6)
我设置的是文字类型
页: [1]
查看完整版本: 关于Grid表格控件不支持回车响应的替代方案