开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5283|回复: 4
收起左侧

[技术专题] 高级表格随意固定在某列,获取和设置高级表格滚动条位置

[复制链接]
结帖率:100% (1/1)
发表于 2024-1-25 17:36:24 | 显示全部楼层 |阅读模式   广东省东莞市
作为一个业余玩了十几年从未分享过的易语言的新手,跟大家分享一下论坛里暂时找不到直接解决方法的高级表格固定列或固定行的另类解决思路。
之所以说是新手,是因为工作跟技术完全不相关,纯属业余喜好,一年就写一两个功能非常简单的爬虫抓数据相关的小程序,所以大部分的代码基础知识都不懂没使用过,所以可能连新手刚学一两个月状态都不如。

我自己的原始需求:使用高级表格显示日期范围内的商品销量(行显示不同商品,列显示商品属性和日期)要求: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

' 这个是因为另一表格的动带动的,不需要操作

子程序名返回值类型公开备 注
_时钟1_周期事件  
变量名类 型静态数组备 注
坐标精易_坐标 
坐标2精易_坐标 
如果 (滚动条锁 = 1)
坐标.纵 = 纵向滚动条位置
' 这里是因为我表格2有横向滚动条,表格1没有,这里加了,时钟2里这个位置就不需要了
坐标2 = 窗口_取滚动条位置 (高级表格2.取窗口句柄 ())
坐标.横 = 坐标2.横
滚动条锁 = 0
滚动条滚动因素锁 = 1
窗口_置滚动条位置 (高级表格2.取窗口句柄 (), 坐标)
高级表格2.刷新单元格 ()
滚动条滚动因素锁 = 0
时钟1.时钟周期 = 0


i支持库列表   支持库注释   
eGrid高级表格支持库


最后上代码,各位大神指点一下,按道理来讲,这个思路和代码还有优化空间,因为我做的非商用自己玩的,所以性能上我不追求,也就到此功能能实现就算结束。

题外话:最后可以用覆盖的方式,假的隐藏掉高级表格1的滚动条,也可以参考大神的例子,调用的去隐藏掉。高级表格隐藏滚动条例程(易尔要的)
https://bbs.125.la/forum.php?mod=viewthread&tid=6817
(出处: 精易论坛)





VX图片_20240125155839.png
VX图片_20240125161051.png
VX图片_20240125161522.png

评分

参与人数 2好评 +2 精币 +4 收起 理由
李泽勇2 + 1 + 3 很赞同,谢谢!
cf2006a + 1 + 1 超级列表框可以联动吗?

查看全部评分


结帖率:100% (1/1)

签到天数: 23 天

发表于 2024-4-11 04:54:54 | 显示全部楼层   福建省泉州市
这个教程让我收获颇丰,非常感谢作者!
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)

签到天数: 24 天

发表于 2024-3-12 07:09:01 | 显示全部楼层   贵州省黔西南布依族苗族自治州
zr赠人玫瑰手有余香
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 27 天

发表于 2024-2-2 08:40:07 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2024-1-25 17:38:57 | 显示全部楼层   广东省东莞市
附上代码原文件

高级表格联动显示.e

1.08 MB, 下载次数: 6, 下载积分: 精币 -2 枚

回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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