作为一个业余玩了十几年从未分享过的易语言的新手,跟大家分享一下论坛里暂时找不到直接解决方法的高级表格固定列或固定行的另类解决思路。
之所以说是新手,是因为工作跟技术完全不相关,纯属业余喜好,一年就写一两个功能非常简单的爬虫抓数据相关的小程序,所以大部分的代码基础知识都不懂没使用过,所以可能连新手刚学一两个月状态都不如。
我自己的原始需求:使用高级表格显示日期范围内的商品销量(行显示不同商品,列显示商品属性和日期)要求:1、固定商品的图片和统计等信息,拉滚动条时才能时刻知道数据对应哪个商品哪个日期
2、点击高级表格时,此商品整行都设置淡淡的背景颜色突出显示
3、点击商品图片列时,自动打开浏览器,打开这个商品的链接,还有点击其他列对应其他相关动作。
解决需求时绕的弯路:
1、最初使用表头数列头数的方法,确实能实现需求1,需求2勉强能满足,有缺陷,但是3需求就完全没办法实现。
2、以前做过其他小程序遇到类似问题时,是通过点击时,获取鼠标横纵向位置来实现,然后根据列宽和行宽,计算出鼠标点的是哪个单元格,但是那是基于没有滚动条下的条件,这个方法确实能实现。但现在不管是行数和列数,都会根据显示数据筛选内容决定的,所以如何获取到此时显示区域的数据位置就很重要,在易语言方向里找了好几天都没有解决方案,所以我的思路,又放在如果调用windows底层接口上,别人的模块的各种功能,其实也是调用windows底层接口实现的,所以我觉得windows底层肯定是有这样的功能的,不管是设置还是获取,只要找到那个接口(宏或API或叫什么的)就能实现,然后就不断的找,发送消息,sendmassage相关的,还有并列层级的知识,看了半天还是一头雾水,发现如果往那个方向去研究,对我来讲没一两个月以上那些底层的知识搞不定,而且最终是否真的有解决方案还不一定,我还不如获取数据放在易语言,然后把显示数据用网页实现,那样我的学习成本还更少一些,所以也就放弃了需求2和和需求3,先敲别的功能的代码,最后不行学服务器和网页。
3、过了几天其他功能写得差不多了,还是不死心,大胆的要使用两个高级表格实现,左边固定列的一个表格,右边显示日期销量数据一个表格,这样子只要能获取和控制纵向滚动条,就能联动实现,折腾了几天,克服了好几个基础知识缺乏的困难才最终实现。
知识点:
1)需要更新高级表格支持库,高级表格才能有 “_纵向滚动条被改变” 就调用的子程序( 高级表格支持库3.0 https://www.eyuyan.la/post/11833.html)
2)精易模块的函数:窗口_取滚动条位置()和 窗口_置滚动条位置 ()
直接调用函数使用:
坐标 = 窗口_取滚动条位置 (高级表格1.取窗口句柄 ())
窗口_置滚动条位置 (高级表格2.取窗口句柄 (), 坐标)

会有以下问题,
1、高级表格2的滚动条动但数据不动(需要配合刷新单元格 ()实现显示区域数据更新,不然只有滚动条动而已)。
2、当表格数据量多的时候,获取,设置,刷新这三个动作执行上是有时间周期的,可能是需要几毫秒到几百毫秒,所以有时候滚轮有时候滚动较快时,两个表格数据行总是对不上。
然后我就使用线程的方案,通过线程整数相当于给加个线程锁,当线程没执行完时,就不执行

这个时候还是有问题,当最后滚动完时,如果前面的未执行完就不执行了,那最后的就落空没执行,所以倒置两个表格的行数据还是没对上。所以我加了个延迟,保证每个动作都会执行再执行一次,确保最后的都有执行。

这个时候还是有问题,滚动太快时,数据行还是对不上,不管我再判断几次,延迟100毫秒还是加到300或500,都有这个问题存在,EMO了。最后我继续测试发现,获取滚动条位置的动作基本不花时间,主要是在设置和刷新上,可能刷新得费时间,这个跟数据量有关。
最后我换了个思路,把获取作为实时的操作,把设置和刷新放到线程里面,用全局变量控制滚动条最新位置,把线程换成时钟(我的理解时钟也是一种线程形式),这样就能确保我每次最后一个动作也能执行到位。
前后还是遇到各种问题,最后总的加了3个锁(专业名词我不懂,锁是我自己的认为)
1)时钟周期,这个是自带的锁,把线程换成时钟,替换提线程整数控制的锁。这个我设置为100对我的电脑配置和数据量足够了。
2)滚动条锁,这个是确保我的滚动队列是否还有事件未执行。
3)滚动条滚动因素锁,(不确定是否有大作用,但是想到了我就加了避免后面大BUG),为了解决一个问题,表格2的滚动条变动,是因为表格1的变动被动设置的,还是鼠标的主动行为导致的,主动的执行,被动的不管。
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 变量名 | 类 型 | 数组 | 备 注 | 纵向滚动条位置 | 整数型 | | 横向滚动条位置 | 整数型 | | 滚动条锁 | 整数型 | | 滚动条滚动因素锁 | 整数型 | |
|
_高级表格1_纵向滚动条被改变 | | | |
代码 | 整数型 | | | | 位置 | 整数型 | | | |
如果 (滚动条滚动因素锁 = 0 ) 坐标 = 窗口_取滚动条位置 (高级表格1. 取窗口句柄 ())  纵向滚动条位置 = 坐标.纵  横向滚动条位置 = 坐标.横  滚动条锁 = 1  如果 (时钟1.时钟周期 > 0 )    时钟1.时钟周期 = 100    变量名 | 类 型 | 静态 | 数组 | 备 注 | 坐标 | 精易_坐标 | | | 坐标2 | 精易_坐标 | | |
如果 (滚动条锁 = 1 ) 坐标.纵 = 纵向滚动条位置  坐标2 = 窗口_取滚动条位置 (高级表格2. 取窗口句柄 ())  坐标.横 = 坐标2.横  滚动条锁 = 0  滚动条滚动因素锁 = 1 窗口_置滚动条位置 (高级表格2. 取窗口句柄 (), 坐标 ) 高级表格2. 刷新单元格 () 滚动条滚动因素锁 = 0  时钟1.时钟周期 = 0
最后上代码,各位大神指点一下,按道理来讲,这个思路和代码还有优化空间,因为我做的非商用自己玩的,所以性能上我不追求,也就到此功能能实现就算结束。
题外话:最后可以用覆盖的方式,假的隐藏掉高级表格1的滚动条,也可以参考大神的例子,调用的去隐藏掉。高级表格隐藏滚动条例程(易尔要的)
https://bbs.125.la/forum.php?mod=viewthread&tid=6817
(出处: 精易论坛)
|