为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 易语言相关 > 易语言模块源码 正文

易语言高级表格鼠标左键扩展模块源码

三叶资源网 2018-11-30 11:51:15 易语言模块源码 1638 ℃ 3 评论

易语言高级表格鼠标左键扩展模块源码

.版本 2
.支持库 eGrid
.支持库 EdirectX

.程序集 类_鼠标左键扩展, , 公开, 增强鼠标左键在高级表格中功能的扩展【官方论坛ID:小修 联系QQ:464678768 编写日期:2008年8月】
.程序集变量 私_表格, 高级表格, , , 欲增强功能的高级表格
.程序集变量 私_信息, 标签, , , 用于增强功能的信息显示
.程序集变量 私_数据, 自_扩展数据, , , 此类相关的数据集合
.程序集变量 私_状态, 整数型, , , 记录功能的执行状态。可选状态见常量:#常_状态_**
.程序集变量 私_功能, 整数型, , , 记录当前功能的类型。可选状态见常量:#常_功能_**
.程序集变量 私_区域位置, 矩形, , , 已选区域在表格中的绝对位置。-1为无效的位置

.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用

私_数据.距离邻近 = 3

私_数据.距离水平 = 25  ' 显示信息位置初始化,默认为鼠标指针的右下方
私_数据.距离垂直 = 25

私_数据.颜色文本 = #黑色  ' 显示信息颜色初始化
私_数据.颜色背景 = #黄色

私_数据.显示方式 = #常_方式_永久显示

私_数据.边距水平 = 5  ' 表头边距初始化
私_数据.边距垂直 = 2

更新填充序列 (#常_信息_序列)  ' 初始化填充序列

.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用



.子程序 更新填充序列, 整数型, , 添加、更新自定义填充序列
.参数 参_序列信息, 文本型, 可空, 欲添加的序列数据。如果为空则仅接收填充序列信息
.参数 参_填充序列, 文本型, 可空 数组, 用于接收填充序列信息
.局部变量 局_填充序列, 文本型, 静态, , 序列数据备份
.局部变量 局_序列指针, 整数型, , "0"
.局部变量 局_序列位置, 整数型
.局部变量 局_计次, 整数型

.如果真 (是否为空 (参_序列信息))
    参_填充序列 = 分割文本 (局_填充序列, #换行符, )
    返回 (取数组成员数 (参_填充序列))
.如果真结束
局_填充序列 = 局_填充序列 + #换行符 + 参_序列信息  ' 在原始基础上添加
参_填充序列 = 分割文本 (局_填充序列, #换行符, )
' 删除空白序列
.计次循环首 (取数组成员数 (参_填充序列), 局_计次)
    .如果真 (删全部空 (参_填充序列 [局_计次]) = “”)
        加入成员 (局_序列指针, 局_计次)
    .如果真结束

.计次循环尾 ()
数组排序 (局_序列指针, 假)
.计次循环首 (取数组成员数 (局_序列指针), 局_计次)
    删除成员 (参_填充序列, 局_序列指针 [局_计次], )
.计次循环尾 ()
' 删除重复序列
清除数组 (局_序列指针)
.计次循环首 (取数组成员数 (参_填充序列) - 1, 局_计次)
    .变量循环首 (局_计次 + 1, 取数组成员数 (参_填充序列), 1, 局_序列位置)
        .如果真 (文本比较 (参_填充序列 [局_计次], 参_填充序列 [局_序列位置], 真) = 0)
            加入成员 (局_序列指针, 局_序列位置)
        .如果真结束

    .变量循环尾 ()
.计次循环尾 ()
数组排序 (局_序列指针, 假)
.计次循环首 (取数组成员数 (局_序列指针), 局_计次)
    删除成员 (参_填充序列, 局_序列指针 [局_计次], )
.计次循环尾 ()
' 更新备份序列
局_填充序列 = “”
.计次循环首 (取数组成员数 (参_填充序列), 局_计次)
    局_填充序列 = 局_填充序列 + 参_填充序列 [局_计次] + #换行符
.计次循环尾 ()
' 调试输出 (参_填充序列)
返回 (取数组成员数 (参_填充序列))

.子程序 取当前功能名, 文本型, , 根据当前执行的功能返回功能名称。失败返回空文本

.如果真 (私_功能 < #常_功能_累加 或 私_功能 > #常_功能_移动)  ' 检查范围
    返回 (“”)
.如果真结束
返回 (多项选择 (私_功能, “累加”, “复制”, “填充”, “移动”))

.子程序 获取指定数据, 逻辑型, 公开, 根据指定的类型获取相关数据。成功返回真,失败返回假。!此方法为获取内部数据的接口!
.参数 参_数据名称, 整数型, , 可选类型:1、#常_距离_邻近 2、#常_距离_水平 3、#常_距离_垂直 4、#常_颜色_文本 5、#常_颜色_背景 6、常_显示_方式 7、#常_边距_水平 8、#常_边距_垂直 9、#常_填充_序列
.参数 参_获取结果, 文本型, , 用于接收获取的数据
.局部变量 局_填充序列, 文本型, , "0"
.局部变量 局_计次, 整数型

.判断开始 (参_数据名称 = #常_数据_距离邻近)
    参_获取结果 = 到文本 (私_数据.距离邻近)
.判断 (参_数据名称 = #常_数据_距离水平)
    参_获取结果 = 到文本 (私_数据.距离水平)
.判断 (参_数据名称 = #常_数据_距离垂直)
    参_获取结果 = 到文本 (私_数据.距离垂直)
.判断 (参_数据名称 = #常_数据_颜色文本)
    参_获取结果 = 到文本 (私_数据.颜色文本)
.判断 (参_数据名称 = #常_数据_颜色背景)
    参_获取结果 = 到文本 (私_数据.颜色背景)
.判断 (参_数据名称 = #常_数据_显示方式)
    参_获取结果 = 到文本 (私_数据.显示方式)
.判断 (参_数据名称 = #常_数据_边距水平)
    参_获取结果 = 到文本 (私_数据.边距水平)
.判断 (参_数据名称 = #常_数据_边距垂直)
    参_获取结果 = 到文本 (私_数据.边距垂直)
.判断 (参_数据名称 = #常_数据_填充序列)
    更新填充序列 (, 局_填充序列)
    .计次循环首 (取数组成员数 (局_填充序列), 局_计次)
        参_获取结果 = 参_获取结果 + 局_填充序列 [局_计次] + #换行符
    .计次循环尾 ()
.默认
    返回 (假)
.判断结束
返回 (真)

.子程序 设置指定数据, 逻辑型, 公开, 根据指定的类型设置相关数据。成功返回真,失败返回假。!此方法为外部设置的接口!
.参数 参_数据名称, 整数型, , 可选类型:1、#常_距离_邻近 2、#常_距离_水平 3、#常_距离_垂直 4、#常_颜色_文本 5、#常_颜色_背景 6、常_显示_方式 7、#常_边距_水平 8、#常_边距_垂直 9、#常_填充_序列
.参数 参_置入数据, 文本型, , 根据类型提供适当的数据
.局部变量 局_置入数据, 整数型

.如果真 (参_数据名称 ≠ #常_数据_填充序列)  ' 对于非填充序列数据进行检查
    .如果真 (检查指定数据 (参_置入数据, #常_检查_数字) = 假)
        返回 (假)  ' 检查失败直接返回
    .如果真结束
    局_置入数据 = 到整数 (参_置入数据)
.如果真结束
.判断开始 (参_数据名称 = #常_数据_距离邻近)
    私_数据.距离邻近 = 局_置入数据
.判断 (参_数据名称 = #常_数据_距离水平)
    私_数据.距离水平 = 局_置入数据
.判断 (参_数据名称 = #常_数据_距离垂直)
    私_数据.距离垂直 = 局_置入数据
.判断 (参_数据名称 = #常_数据_颜色文本)
    .如果真 (置入提示标签 () = 假)
        返回 (假)
    .如果真结束
    私_数据.颜色文本 = 局_置入数据
    私_信息.文本颜色 = 私_数据.颜色文本
.判断 (参_数据名称 = #常_数据_颜色背景)
    .如果真 (置入提示标签 () = 假)
        返回 (假)
    .如果真结束
    私_数据.颜色背景 = 局_置入数据
    私_信息.背景颜色 = 私_数据.颜色背景
.判断 (参_数据名称 = #常_数据_显示方式)
    私_数据.显示方式 = 局_置入数据
.判断 (参_数据名称 = #常_数据_边距水平)
    私_数据.边距水平 = 局_置入数据
.判断 (参_数据名称 = #常_数据_边距垂直)
    私_数据.边距垂直 = 局_置入数据
.判断 (参_数据名称 = #常_数据_填充序列)
    更新填充序列 (参_置入数据)
.默认
    返回 (假)
.判断结束
返回 (真)

.子程序 显示提示信息, 逻辑型, , 将欲显示的信息显示到指定的位置。失败返回假,说明未成功调用【置入提示标签】方法
.参数 参_信息内容, 文本型, 可空, 信息内容,多行信息请使用#换行符分割。不提供此参数或者参数值为空则隐藏不显示
.参数 参_显示坐标, 自_坐标, 可空, 鼠标指针在表格中的绝对位置。为空则为上次提供的位置
.局部变量 局_显示信息, 文本型, 静态, , 备份显示的内容
.局部变量 局_文本数组, 文本型, , "0"
.局部变量 局_已选区域, 矩形
.局部变量 局_单元坐标, 自_坐标
.局部变量 局_计次, 整数型

.如果真 (置入提示标签 ())
    私_信息.可视 = 假  ' 我有话说:某些组件在可视状态下直接更新显示内容容易导致显示闪烁,那就先隐藏,更新完毕后再显示,很多时候可以解决问题^_^
    .如果真 (参_信息内容 = “” 且 是否为空 (参_显示坐标))
        返回 (真)
    .如果真结束
    .如果真 (参_信息内容 ≠ “”)
        局_显示信息 = 参_信息内容 + #换行符  ' 更新显示信息
    .如果真结束
    .如果真 (是否为空 (参_显示坐标))  ' 未提供显示坐标
        参_显示坐标.水平 = 私_信息.左边 - 私_表格.左边 - 私_数据.距离水平  ' 计算鼠标指针的坐标,用于计算单元格的坐标
        参_显示坐标.垂直 = 私_信息.顶边 - 私_表格.顶边 - 私_数据.距离垂直
    .如果真结束
    私_信息.左边 = 私_表格.左边 + 参_显示坐标.水平 + 私_数据.距离水平  ' 本次显示绝对位置
    私_信息.顶边 = 私_表格.顶边 + 参_显示坐标.垂直 + 私_数据.距离垂直
    .如果 (计算单元位置 (参_显示坐标, 局_单元坐标))  ' 单元提示信息
        参_信息内容 = 局_显示信息 + “指针单元:行号:” + 到文本 (局_单元坐标.垂直) + “ 列号:” + 到文本 (局_单元坐标.水平) + #换行符
    .否则
        参_信息内容 = 局_显示信息 + “指针单元:当前指针下没有单元格,相关操作被忽略” + #换行符
    .如果结束
    .如果真 (取已选择区域 (局_已选区域))  ' 区域提示信息
        参_信息内容 = 参_信息内容 + “区域尺寸:宽度_” + 到文本 (局_已选区域.右边 - 局_已选区域.左边 + 1) + “ 高度_” + 到文本 (局_已选区域.底边 - 局_已选区域.顶边 + 1) + #换行符
        参_信息内容 = 参_信息内容 + “区域位置:左_” + 到文本 (局_已选区域.左边) + “ 右_” + 到文本 (局_已选区域.右边) + “ 顶_” + 到文本 (局_已选区域.顶边) + “ 底_” + 到文本 (局_已选区域.底边) + #换行符
    .如果真结束
    私_信息.标题 = 参_信息内容  ' 置显示信息
    ' 计算显示信息的宽度和高度
    私_信息.宽度 = 0
    局_文本数组 = 分割文本 (私_信息.标题, #换行符, )
    .计次循环首 (取数组成员数 (局_文本数组), 局_计次)
        .如果真 (取文本长度 (局_文本数组 [局_计次]) > 私_信息.宽度)
            私_信息.宽度 = 取文本长度 (局_文本数组 [局_计次])  ' 取最长的字符行来计算信息显示的宽度
        .如果真结束

    .计次循环尾 ()
    私_信息.宽度 = 私_信息.宽度 × 6 + 2  ' 字符宽度为6,+2为修正值
    私_信息.高度 = 取数组成员数 (局_文本数组) × 12 + 2  ' 字符高度为12
    ' 显示
    私_信息.可视 = 真
    私_信息.刷新显示 ()
    私_表格.刷新显示 ()  ' 刷新显示可以清除信息移动时留下的痕迹
    返回 (真)
.如果真结束
返回 (假)

.子程序 置入提示标签, 逻辑型, 公开, 置入一个已创建的标签。成功返回真,失败返回假。!使用此类之前必先确保已成功调用此方法,否则提示信息功能不能实现!
.参数 参_欲置入标签, 标签, 可空, 指定一个标签用于增强功能的信息显示。为空则仅检查已置入成功的标签是否已创建

.如果真 (是否为空 (参_欲置入标签) = 假)
    私_信息 = 参_欲置入标签
    显示提示信息 (#常_信息_开发)  ' 显示此代码开发的相关信息
    私_信息.左边 = (取屏幕宽度 () - 私_信息.宽度) \ 2  ' 将信息显示在屏幕中间
    私_信息.顶边 = (取屏幕高度 () - 私_信息.高度) \ 2
    设置指定数据 (#常_数据_颜色文本, 到文本 (私_数据.颜色文本))  ' 将颜色数据应用到当前置入的标签
    设置指定数据 (#常_数据_颜色背景, 到文本 (私_数据.颜色背景))
    ' 可以在下面做更多的初始化操作
    私_信息.边框 = 5  ' 单线边框式
    私_信息.是否自动折行 = 真
.如果真结束
返回 (是否已创建 (私_信息))

.子程序 置入高级表格, 逻辑型, 公开, 置入一个已创建的高级表格。成功返回真,失败返回假。!使用此类之前必先确保已成功调用此方法,否则不能确保其它方法能成功调用!
.参数 参_欲置入表格, 高级表格, 可空, 指定一个欲增强鼠标功能的表格。为空则仅检查已置入成功的表格是否已创建

.如果真 (是否为空 (参_欲置入表格) = 假)
    私_表格 = 参_欲置入表格
    ' 可以在下面做更多的初始化操作
    私_表格.选择区背景 = #银白
.如果真结束
返回 (是否已创建 (私_表格))

.子程序 检查指定数据, 逻辑型, , 根据检查方式检查数据。真-表示检查通过
.参数 参_检查数据, 文本型, , 被检查的数据
.参数 参_检查方式, 整数型, , 可选值:1、#常_检查_空白 2、#常_检查_数字 3、#常_检查_包含
.参数 参_包含数据, 文本型, 可空, 如果是【常_检查_包含】则必须提供此参数
.局部变量 局_数据, 字节集
.局部变量 局_字节, 字节型
.局部变量 局_计次, 整数型

.判断开始 (参_检查方式 = #常_检查_空白)
    局_数据 = 子字节集替换 (到字节集 (参_检查数据), 到字节集 (到字节 (#Tab键)), , , )  ' 删除#Tab键
    局_数据 = 子字节集替换 (局_数据, 到字节集 (到字节 (#空格键)), , , )  ' 删除#空格键
    局_数据 = 子字节集替换 (局_数据, 到字节集 (到字节 (10)), , , )  ' 删除换行
    .如果真 (取字节集长度 (局_数据) ≠ 0)
        返回 (真)
    .如果真结束

.判断 (参_检查方式 = #常_检查_数字)
    局_数据 = 到字节集 (参_检查数据)
    .计次循环首 (取字节集长度 (局_数据), 局_计次)
        .如果真 (局_数据 [局_计次] < 取代码 (“0”, ) 或 局_数据 [局_计次] > 取代码 (“9”, ))  ' 0-9
            .如果真 (局_数据 [局_计次] ≠ 取代码 (“.”, ))  ' 小数点
                .如果真 (局_数据 [局_计次] ≠ 取代码 (“-”, ))  ' 负号
                    返回 (假)
                .如果真结束

            .如果真结束

        .如果真结束

    .计次循环尾 ()
    返回 (真)
.判断 (参_检查方式 = #常_检查_包含)
    .如果真 (寻找文本 (参_包含数据, 参_检查数据, , 假) ≠ -1)
        返回 (真)
    .如果真结束

.默认

.判断结束
返回 (假)

.子程序 累加指定区域, 逻辑型, , 对指定区域内的数值进行累加,如果区域内数据全部为数值则返回真,包含非数值数据将返回假
.参数 参_累加区域, 矩形, , 指定一个欲被累加的单元格区域。注意:目前仅支持【数值型】、【货币型】、【文本型】,必须在外部自行确认,否则可能导致运行错误
.参数 参_累加结果, 双精度小数型, 参考, 用于接收区域累加结果
.局部变量 局_数值数据, 逻辑型
.局部变量 局_单元数据, 文本型
.局部变量 局_行号, 整数型
.局部变量 局_列号, 整数型

局_数值数据 = 真
.变量循环首 (参_累加区域.左边, 参_累加区域.右边, 1, 局_列号)
    .变量循环首 (参_累加区域.顶边, 参_累加区域.底边, 1, 局_行号)
        局_单元数据 = 私_表格.取数据 (局_行号, 局_列号)
        .如果 (检查指定数据 (局_单元数据, #常_检查_数字))  ' 检查数据
            参_累加结果 = 参_累加结果 + 到数值 (局_单元数据)  ' 累加数值
        .否则
            局_数值数据 = 假
        .如果结束

    .变量循环尾 ()
.变量循环尾 ()
返回 (局_数值数据)

.子程序 取已选择区域, 逻辑型, , 如果有单元格被选择则返回真,否则返回假
.参数 参_选择区域, 矩形, , 用于接收被选择区域的相关位置信息。此参数值仅在调用返回真才有效

.如果真 (置入高级表格 () = 假)
    返回 (假)
.如果真结束
参_选择区域.顶边 = 私_表格.取选择起始行 ()
参_选择区域.底边 = 私_表格.取选择终止行 ()
参_选择区域.左边 = 私_表格.取选择起始列 ()
参_选择区域.右边 = 私_表格.取选择终止列 ()
.如果真 (参_选择区域.顶边 = -1 或 参_选择区域.底边 = -1 或 参_选择区域.左边 = -1 或 参_选择区域.右边 = -1)
    返回 (假)
.如果真结束
返回 (真)

.子程序 更新起始行列, 逻辑型, , 更新可视区域内左上角单元格的坐标。!注:可视单元区域改变后必须调用此方法!
.参数 参_按下坐标, 自_坐标, 可空, 鼠标左键在表格中按下的位置。不为空则更新坐标信息
.参数 参_放开坐标, 自_坐标, 可空, 鼠标左键在表格中放开的位置。不为空则更新起始行列
.参数 参_起始单元, 自_坐标, 可空, 用于接收起始行列信息
.局部变量 局_起始单元, 自_坐标, 静态, , 备份左上角单元格的坐标(垂直:行号 水平:列号)
.局部变量 局_按下坐标, 自_坐标, 静态, , 备份鼠标左键按下的位置
.局部变量 局_放开坐标, 自_坐标
.局部变量 局_表头尺寸, 自_尺寸
.局部变量 局_已选区域, 矩形

' 实现原理与步骤:根据鼠标左键按下的坐标和放开的坐标来计算起始单元的坐标
' 1、首先在鼠标左键按下时备份按下的坐标
' 2、左键放开时可能是选择了一个区域,必须选择放开时指针下的单元格来计算
' 3、根据表头尺寸、单元格坐标和指针坐标这几个信息计算出起始单元坐标
' 注:单元格尺寸差异过大时结果可能会有误差,期待表格直接提供起始单元信息
.如果真 (是否为空 (参_按下坐标) = 假)  ' 备份按下坐标
    局_按下坐标.水平 = 参_按下坐标.水平
    局_按下坐标.垂直 = 参_按下坐标.垂直
.如果真结束
.如果真 (是否为空 (参_放开坐标) = 假)  ' 计算起始单元
    局_放开坐标.水平 = 参_放开坐标.水平
    局_放开坐标.垂直 = 参_放开坐标.垂直
    .如果真 (取已选择区域 (局_已选区域))
        .如果 (局_按下坐标.水平 > 局_放开坐标.水平)  ' 取放开时指针下的单元格
            局_起始单元.水平 = 局_已选区域.左边
        .否则
            局_起始单元.水平 = 局_已选区域.右边
        .如果结束
        .如果 (局_按下坐标.垂直 > 局_放开坐标.垂直)
            局_起始单元.垂直 = 局_已选区域.顶边
        .否则
            局_起始单元.垂直 = 局_已选区域.底边
        .如果结束
        计算表头尺寸 (局_表头尺寸)
        ' 计算起始单元列号到备份
        局_放开坐标.水平 = 局_放开坐标.水平 - 局_表头尺寸.宽度
        .判断循环首 (真)
            .如果真 (局_起始单元.水平 < 私_表格.表头列数)
                返回 (假)
            .如果真结束
            局_放开坐标.水平 = 局_放开坐标.水平 - 私_表格.取列宽 (局_起始单元.水平)
            .如果真 (局_放开坐标.水平 < 0)
                跳出循环 ()
            .如果真结束
            局_起始单元.水平 = 局_起始单元.水平 - 1
        .判断循环尾 ()
        ' 计算起始单元行号到备份
        局_放开坐标.垂直 = 局_放开坐标.垂直 - 局_表头尺寸.高度
        .判断循环首 (真)
            .如果真 (局_起始单元.垂直 < 私_表格.表头行数)
                返回 (假)
            .如果真结束
            局_放开坐标.垂直 = 局_放开坐标.垂直 - 私_表格.取行高 (局_起始单元.垂直)
            .如果真 (局_放开坐标.垂直 < 0)
                跳出循环 ()
            .如果真结束
            局_起始单元.垂直 = 局_起始单元.垂直 - 1
        .判断循环尾 ()
        返回 (真)
    .如果真结束

.如果真结束
.如果真 (是否为空 (参_起始单元) = 假)  ' 提取起始单元
    参_起始单元.水平 = 局_起始单元.水平
    参_起始单元.垂直 = 局_起始单元.垂直
    返回 (真)
.如果真结束
返回 (假)

.子程序 计算表头尺寸, 逻辑型, , 计算整个表头区域的尺寸
.参数 参_表头尺寸, 自_尺寸, , 用于接收计算结果。如果表格没有行列表头则对应尺寸为0,比如【表头行数】=0,则【表头尺寸.高度】=0
.局部变量 局_计次, 整数型

.如果真 (置入高级表格 () = 假)
    返回 (假)
.如果真结束
参_表头尺寸.高度 = 0
.计次循环首 (私_表格.表头行数, 局_计次)
    参_表头尺寸.高度 = 参_表头尺寸.高度 + 私_表格.取行高 (局_计次 - 1)  ' 行高累加
.计次循环尾 ()
参_表头尺寸.宽度 = 0
.计次循环首 (私_表格.表头列数, 局_计次)
    参_表头尺寸.宽度 = 参_表头尺寸.宽度 + 私_表格.取列宽 (局_计次 - 1)  ' 列宽累加
.计次循环尾 ()
返回 (真)

.子程序 计算行列尺寸, 整数型, , 计算指定“行”总高度或者“列”总宽度。失败返回-1
.参数 参_起始序号, 整数型, , 起始行、列单元格序号。
.参数 参_结束序号, 整数型, , 结束行、列单元格序号。
.参数 参_统计行高, 逻辑型, , 真-统计行高度,假-统计列宽度。注意与前面的参数匹配
.局部变量 局_单元尺寸, 整数型
.局部变量 局_区域尺寸, 整数型
.局部变量 局_统计次序, 整数型
.局部变量 局_计次, 整数型

局_统计次序 = 1  ' 正向统计
.如果真 (参_起始序号 > 参_结束序号)
    局_统计次序 = -1  ' 反向统计
.如果真结束
.变量循环首 (参_起始序号, 参_结束序号, 局_统计次序, 局_计次)
    .如果 (参_统计行高)  ' 我有话说:在大量循环时需将此判断放到循环外部,可提高运行效率
        局_单元尺寸 = 私_表格.取行高 (局_计次)
    .否则
        局_单元尺寸 = 私_表格.取列宽 (局_计次)
    .如果结束
    .如果真 (局_单元尺寸 = -1)
        返回 (局_单元尺寸)  ' 取单元尺寸失败
    .如果真结束
    局_区域尺寸 = 局_区域尺寸 + 局_单元尺寸
.变量循环尾 ()
返回 (局_区域尺寸)

.子程序 计算区域尺寸, 逻辑型, , 计算指定区域单元格的尺寸
.参数 参_目标区域, 矩形, , 欲计算的单元格区域
.参数 参_区域尺寸, 自_尺寸, , 用于接收计算结果

参_区域尺寸.宽度 = 计算行列尺寸 (参_目标区域.左边, 参_目标区域.右边, 假)
参_区域尺寸.高度 = 计算行列尺寸 (参_目标区域.顶边, 参_目标区域.底边, 真)
.如果真 (参_区域尺寸.宽度 = -1 或 参_区域尺寸.高度 = -1)
    返回 (假)
.如果真结束
返回 (真)

.子程序 计算区域位置, 逻辑型, , 计算目标单元格区域在表格中的绝对位置
.参数 参_目标区域, 矩形, , 欲计算的单元格区域
.参数 参_区域位置, 矩形, , 目标区域的绝对位置。用于接收计算结果。
.局部变量 局_起始单元, 自_坐标
.局部变量 局_表头尺寸, 自_尺寸
.局部变量 局_区域尺寸, 自_尺寸
.局部变量 局_统计次序, 整数型
.局部变量 局_计次, 整数型

参_区域位置.顶边 = -1  ' 先置为无效的位置
参_区域位置.底边 = -1
参_区域位置.左边 = -1
参_区域位置.右边 = -1
计算表头尺寸 (局_表头尺寸)
.如果真 (计算区域尺寸 (参_目标区域, 局_区域尺寸) = 假)
    返回 (假)
.如果真结束
更新起始行列 (, , 局_起始单元)  ' 取起始行列坐标
' 下面计算区域的具体位置
.如果 (局_起始单元.垂直 = 参_目标区域.顶边)
    参_区域位置.顶边 = 局_表头尺寸.高度
.否则
    参_区域位置.顶边 = 局_表头尺寸.高度 + 计算行列尺寸 (局_起始单元.垂直, 参_目标区域.顶边 - 1, 真)
.如果结束
参_区域位置.底边 = 参_区域位置.顶边 + 局_区域尺寸.高度
.如果 (局_起始单元.水平 = 参_目标区域.左边)
    参_区域位置.左边 = 局_表头尺寸.宽度
.否则
    参_区域位置.左边 = 局_表头尺寸.宽度 + 计算行列尺寸 (局_起始单元.水平, 参_目标区域.左边 - 1, 假)
.如果结束
参_区域位置.右边 = 参_区域位置.左边 + 局_区域尺寸.宽度
返回 (真)

.子程序 计算单元序号, 整数型, , 根据指定的位置获取指定的序号。成功返回有效的序号,失败返回-1
.参数 参_绝对位置, 整数型, , 必须是表格内部任何有效位置,否则将导致失败
.参数 参_获取行号, 逻辑型, , 真-取行号 假-取列号。注意与前面的参数匹配
.局部变量 局_起始单元, 自_坐标
.局部变量 局_尺寸, 整数型
.局部变量 局_计次, 整数型

更新起始行列 (, , 局_起始单元)  ' 取起始行列坐标
.如果 (参_获取行号)
    .变量循环首 (0, 私_表格.表头行数 - 1, 1, 局_计次)  ' 表头区域单元判断
        局_尺寸 = 局_尺寸 + 私_表格.取行高 (局_计次)
        .如果真 (局_尺寸 > 参_绝对位置)
            返回 (局_计次)
        .如果真结束

    .变量循环尾 ()
    .变量循环首 (局_起始单元.垂直, 私_表格.行数 - 1, 1, 局_计次)  ' 表格区域单元判断
        局_尺寸 = 局_尺寸 + 私_表格.取行高 (局_计次)
        .如果真 (局_尺寸 > 参_绝对位置)
            返回 (局_计次)
        .如果真结束

    .变量循环尾 ()
.否则
    .变量循环首 (0, 私_表格.表头列数 - 1, 1, 局_计次)  ' 表头区域单元判断
        局_尺寸 = 局_尺寸 + 私_表格.取列宽 (局_计次)
        .如果真 (局_尺寸 > 参_绝对位置)
            返回 (局_计次)
        .如果真结束

    .变量循环尾 ()
    .变量循环首 (局_起始单元.水平, 私_表格.列数 - 1, 1, 局_计次)  ' 表格区域单元判断
        局_尺寸 = 局_尺寸 + 私_表格.取列宽 (局_计次)
        .如果真 (局_尺寸 > 参_绝对位置)
            返回 (局_计次)
        .如果真结束

    .变量循环尾 ()
.如果结束
返回 (-1)

.子程序 计算单元位置, 逻辑型, , 计算鼠标指针处单元格的行列位置(既行号和列号)。成功返回真,否则说明指针处没有单元格或者未曾成功调用【置入高级表格】方法
.参数 参_指针坐标, 自_坐标, , 鼠标指针在表格中的绝对坐标
.参数 参_单元坐标, 自_坐标, , 用于接收单元格所在表格的行列号。如果返回假时此参数内容为不确定值!

.如果真 (置入高级表格 () = 假)
    返回 (假)
.如果真结束
参_单元坐标.水平 = 计算单元序号 (参_指针坐标.水平, 假)  ' 计算水平位置
.如果真 (参_单元坐标.水平 = -1)
    返回 (假)
.如果真结束
参_单元坐标.垂直 = 计算单元序号 (参_指针坐标.垂直, 真)  ' 计算垂直位置
.如果真 (参_单元坐标.垂直 = -1)
    返回 (假)
.如果真结束
返回 (真)

.子程序 计算位置关系, 整数型, , 计算鼠标指针与指定的表格区域信息之间的位置关系。位置关系常量值(相邻时可能为和值):-1、#常_指针_邻外 0、#常_指针_邻内 1、#常_指针_邻顶 2、#常_指针_邻底 4、#常_指针_邻左 8、#常_指针_邻右
.参数 参_指针坐标, 自_坐标, , 鼠标指针在表格中的绝对坐标
.参数 参_区域位置, 矩形, , 区域的位置信息
.局部变量 局_已选区域, 矩形, , , 表格中被选择单元格的行列信息
.局部变量 局_指针位置, 整数型, , , 记录鼠标指针与被选择区域的相对位置

' 考虑到程序可读性对不同的类型分别进行判断
.判断开始 (参_区域位置.顶边 = -1 或 参_区域位置.底边 = -1 或 参_区域位置.左边 = -1 或 参_区域位置.右边 = -1)  ' 无效的区域位置
    返回 (#常_指针_邻外)
.判断 (参_指针坐标.水平 ≤ 参_区域位置.左边 或 参_指针坐标.水平 ≥ 参_区域位置.右边)  ' 鼠标指针在选择区域的水平范围之外
    返回 (#常_指针_邻外)
.判断 (参_指针坐标.垂直 ≤ 参_区域位置.顶边 或 参_指针坐标.垂直 ≥ 参_区域位置.底边)  ' 鼠标指针在选择区域的垂直范围之外
    返回 (#常_指针_邻外)
.默认

.判断结束
' 接下来是综合判断相邻的具体位置了
.如果真 (取绝对值 (参_区域位置.顶边 - 参_指针坐标.垂直) ≤ 私_数据.距离邻近)
    局_指针位置 = #常_指针_邻顶
.如果真结束
.如果真 (取绝对值 (参_区域位置.底边 - 参_指针坐标.垂直) ≤ 私_数据.距离邻近)
    局_指针位置 = 局_指针位置 + #常_指针_邻底
.如果真结束
.如果真 (取绝对值 (参_区域位置.左边 - 参_指针坐标.水平) ≤ 私_数据.距离邻近)
    局_指针位置 = 局_指针位置 + #常_指针_邻左
.如果真结束
.如果真 (取绝对值 (参_区域位置.右边 - 参_指针坐标.水平) ≤ 私_数据.距离邻近)
    局_指针位置 = 局_指针位置 + #常_指针_邻右
.如果真结束
返回 (局_指针位置)

.子程序 执行累加功能, 文本型, , 将选择区域内的数值全部相加。不支持非数值列
.参数 参_指针坐标, 自_坐标, , 鼠标指针在表格中的绝对坐标
.参数 参_功能状态, 整数型, , 可选值:1、#常_执行_设置 2、#常_执行_调整 3、#常_执行_应用(使用此值时参数一可以为空)
.局部变量 局_起始单元, 自_坐标
.局部变量 局_已选区域, 矩形
.局部变量 局_信息文本, 文本型, , , 提示当前功能的执行情况啦
.局部变量 局_累加结果, 双精度小数型
.局部变量 局_列类型, 整数型
.局部变量 局_列号, 整数型

.判断开始 (参_功能状态 = #常_执行_设置)
    私_状态 = #常_状态_执行
    私_功能 = #常_功能_累加
    局_信息文本 = “当前状态:已就绪,请按住左键不放并移动鼠标到需要累加的单元即可”
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_调整)
    .如果真 (取已选择区域 (局_已选区域) = 假)
        返回 (“功能提示:执行累加功能时请选中欲累加的单元格!”)
    .如果真结束
    .变量循环首 (局_已选区域.左边, 局_已选区域.右边, 1, 局_列号)
        局_列类型 = 私_表格.取列类型 (局_列号)  ' 取列类型
        .如果真 (局_列类型 ≠ #表格常量.数值型 且 局_列类型 ≠ #表格常量.货币型 且 局_列类型 ≠ #表格常量.文本型)  ' 判断列类型
            局_信息文本 = 局_信息文本 + “功能提示:不支持的列类型,累加功能目前仅支持支” + #换行符
            局_信息文本 = 局_信息文本 + “          持【数值型】、【货币型】、【文本型】”
            返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
        .如果真结束

    .变量循环尾 ()
    .如果真 (累加指定区域 (局_已选区域, 局_累加结果) = 假)  ' 累加区域数据
        局_信息文本 = 局_信息文本 + “功能提示:区域内包含非数值数据未被累加” + #换行符
    .如果真结束
    局_信息文本 = 局_信息文本 + “累加结果:” + 到文本 (局_累加结果)
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.默认

.判断结束
返回 (“功能提示:!不支持的功能状态!”)

.子程序 执行复制功能, 文本型, , 纵向复制选中的单元格行数据
.参数 参_指针坐标, 自_坐标, 可空, 鼠标指针在表格中的绝对坐标
.参数 参_功能状态, 整数型, , 可选值:1、#常_执行_设置 2、#常_执行_调整 3、#常_执行_应用(使用此值时参数一可以为空)
.局部变量 局_单元内容, 文本型, 静态, , 被复制的内容
.局部变量 局_已选区域, 矩形, 静态, , 被复制的区域信息
.局部变量 局_单元坐标, 自_坐标
.局部变量 局_信息文本, 文本型, , , 提示当前功能的执行情况啦

.判断开始 (参_功能状态 = #常_执行_设置)
    私_功能 = #常_功能_复制
    .判断开始 (取已选择区域 (局_已选区域) = 假)
        局_信息文本 = “功能提示:执行复制功能时请选中欲复制的单元格!”
    .判断 (局_已选区域.顶边 ≠ 局_已选区域.底边)
        局_信息文本 = “功能提示:暂不支持多行数据复制功能!”
    .默认
        私_表格.复制选定文本 ()  ' 取欲复制数据
        局_单元内容 = 取剪辑板文本 ()  ' 保存
        .如果 (检查指定数据 (局_单元内容, #常_检查_空白))
            私_状态 = #常_状态_执行
            局_信息文本 = “当前状态:已就绪,请移动鼠标选择区域,区域确定后松开鼠标完成复制”
        .否则
            局_信息文本 = “功能提示:已选择单元区域为空白,复制已取消!”
        .如果结束

    .判断结束
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_调整)
    .判断开始 (计算单元位置 (参_指针坐标, 局_单元坐标) = 假)
        局_信息文本 = “功能提示:指针已超出有效单元格范围!”
    .判断 (局_已选区域.顶边 < 局_单元坐标.垂直)  ' 数据向下复制
        局_信息文本 = “当前方向:向下复制” + 到文本 (局_单元坐标.垂直 - 局_已选区域.顶边) + “行”
        私_表格.选择区域 (局_已选区域.顶边, 局_已选区域.左边, 局_单元坐标.垂直, 局_已选区域.右边)  ' 选择向下移动
    .判断 (局_已选区域.顶边 > 局_单元坐标.垂直)  ' 数据向上复制
        局_信息文本 = “当前方向:向上复制” + 到文本 (局_已选区域.顶边 - 局_单元坐标.垂直) + “行”
        私_表格.选择区域 (局_单元坐标.垂直, 局_已选区域.左边, 局_已选区域.底边, 局_已选区域.右边)  ' 选择向上移动
    .默认
        ' 复制起始位置,做些提示
        局_信息文本 = “当前状态:已就绪,请移动鼠标选择区域,区域确定后松开鼠标完成复制” + #换行符
        局_信息文本 = 局_信息文本 + “功能备注:由于列类型差异可能较大,不支持水平方向复制功能”
        私_表格.选择区域 (局_已选区域.顶边, 局_已选区域.左边, 局_已选区域.底边, 局_已选区域.右边)  ' 定位起始区域
    .判断结束
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_应用)
    .如果真 (取已选择区域 (局_已选区域) = 假)
        返回 (“功能提示:复制功能执行失败!”)
    .如果真结束
    置剪辑板文本 (局_单元内容)  ' 准备复制
    .变量循环首 (局_已选区域.顶边, 局_已选区域.底边, 1, 局_已选区域.顶边)
        私_表格.置光标 (局_已选区域.顶边, 局_已选区域.左边)  ' 定位数据位置
        私_表格.粘贴 ()  ' 粘贴数据
    .变量循环尾 ()
    返回 (“功能提示:复制功能执行结束^_^”)
.默认

.判断结束
返回 (“功能提示:!不支持的功能状态!”)

.子程序 执行填充功能, 文本型, , 从选中的单元格开始纵向序列填充数据
.参数 参_指针坐标, 自_坐标, , 鼠标指针在表格中的绝对坐标
.参数 参_功能状态, 整数型, , 可选值:1、#常_执行_设置 2、#常_执行_调整
.局部变量 局_数字填充, 逻辑型, 静态, , 真-数字序列填充 假-自定义序列填充
.局部变量 局_填充序列, 文本型, 静态, "0", 自定义填充序列数据
.局部变量 局_起始指针, 整数型, 静态, , 备份的起始序列指针,还原时有用
.局部变量 局_序列指针, 整数型, 静态, , 指向实时填充的数据
.局部变量 局_已选区域, 矩形, 静态, , 填充起始区域信息,必须确保为一个单元格
.局部变量 局_起始序号, 整数型, 静态, , 备份的起始序号,还原时有用
.局部变量 局_填充行号, 整数型, 静态, , 保存最后一次填充的位置
.局部变量 局_填充序号, 整数型, 静态, , 保存最后一次填充的序号
.局部变量 局_单元坐标, 自_坐标
.局部变量 局_信息文本, 文本型, , , 提示当前功能的执行情况啦
.局部变量 局_单元内容, 文本型
.局部变量 局_数量, 整数型
.局部变量 局_计次, 整数型

.判断开始 (参_功能状态 = #常_执行_设置)
    私_功能 = #常_功能_填充
    .如果真 (取已选择区域 (局_已选区域) = 假)
        局_信息文本 = “功能提示:执行填充功能时请选中有效的单元格!”
        返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
    .如果真结束
    局_单元内容 = 私_表格.取数据 (局_已选区域.顶边, 局_已选区域.左边)  ' 取出填充的数据
    .判断开始 (局_已选区域.顶边 ≠ 局_已选区域.底边 或 局_已选区域.左边 ≠ 局_已选区域.右边)
        局_信息文本 = “功能提示:请只选择一个单元格作为填充的起始单元!”
    .判断 (检查指定数据 (局_单元内容, #常_检查_空白) = 假)
        局_信息文本 = “功能提示:已选择单元区为空,序列填充已取消!”
    .默认
        局_数字填充 = 真
        .如果 (检查指定数据 (局_单元内容, #常_检查_数字) = 假)
            局_数量 = 更新填充序列 (, 局_填充序列)  ' 检查自定义填充序列
            .计次循环首 (局_数量, 局_计次)
                .如果真 (检查指定数据 (局_单元内容, #常_检查_包含, 局_填充序列 [局_计次]) = 真)
                    跳出循环 ()
                .如果真结束

            .计次循环尾 ()
            .如果真 (局_计次 > 局_数量)  ' 判断是否找到自定义的序列数据
                局_信息文本 = “功能提示:已选择单元区内不是有效的填充数据,序列填充已取消!”
                返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
            .如果真结束
            局_数字填充 = 假
            局_填充序列 = 分割文本 (局_填充序列 [局_计次], , )  ' 取出当前使用的自定义填充序列
            .计次循环首 (取数组成员数 (局_填充序列), 局_计次)
                .如果真 (局_填充序列 [局_计次] = 局_单元内容)
                    局_起始指针 = 局_计次  ' 定位单元格中的数据在序列中的位置
                    局_序列指针 = 局_起始指针
                    跳出循环 ()
                .如果真结束

            .计次循环尾 ()
        .否则
            局_起始序号 = 到整数 (私_表格.取数据 (局_已选区域.顶边, 局_已选区域.左边))  ' 初始化数字填充数据和起始位置
            局_填充序号 = 局_起始序号
            局_信息文本 = “起始序号:” + 到文本 (局_起始序号)
        .如果结束
        私_状态 = #常_状态_执行
        局_填充行号 = 局_已选区域.顶边
    .判断结束
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_调整)
    .如果真 (计算单元位置 (参_指针坐标, 局_单元坐标) = 假)
        返回 (“功能提示:指针已超出有效单元格范围!”)
    .如果真结束
    .判断开始 (局_单元坐标.垂直 = 局_已选区域.顶边)  ' 填充起始单元处理
        .判断开始 (局_填充行号 < 局_已选区域.顶边)
            私_表格.清空单元格数据 (局_填充行号, 局_已选区域.左边, 局_已选区域.底边 - 1, 局_已选区域.右边)  ' 清除向上已填充数据
        .判断 (局_填充行号 > 局_已选区域.顶边)
            私_表格.清空单元格数据 (局_已选区域.顶边 + 1, 局_已选区域.左边, 局_填充行号, 局_已选区域.右边)  ' 清除向下已填充数据
        .默认

        .判断结束
        局_填充序号 = 局_起始序号  ' 还原到初始化状态
        局_序列指针 = 局_起始指针
        局_填充行号 = 局_单元坐标.垂直
        .如果 (局_数字填充)
            私_表格.置数据 (局_单元坐标.垂直, 局_已选区域.左边, #表格常量.文本型, 局_起始序号)  ' 还原数字填充数据
        .否则
            私_表格.置数据 (局_单元坐标.垂直, 局_已选区域.左边, #表格常量.文本型, 局_填充序列 [局_起始指针])  ' 还原自定义填充数据
        .如果结束
        局_信息文本 = “当前状态:已就绪,按住左键不放并移动鼠标即可进行实时填充” + #换行符
        局_信息文本 = 局_信息文本 + “功能提示:不支持水平方向填充功能” + #换行符
        局_信息文本 = 局_信息文本 + “功能备注:由于鼠标移动超快可能出现序号异常!” + #换行符
        局_信息文本 = 局_信息文本 + “          别慌,将鼠标移动到起始单元即可还原” + #换行符
        局_信息文本 = 局_信息文本 + “已知问题:鼠标到无效单元区域引起填充方向的变” + #换行符
        局_信息文本 = 局_信息文本 + “          化将可能导致原方向已填充数据不能清除”
        私_表格.选择区域 (局_已选区域.顶边, 局_已选区域.左边, 局_已选区域.底边, 局_已选区域.右边)  ' 定位到起始区域
    .判断 (局_单元坐标.垂直 > 局_已选区域.顶边)  ' 向下填充处理
        局_信息文本 = “当前方向:向下填充” + 到文本 (局_单元坐标.垂直 - 局_已选区域.顶边) + “行”
        私_表格.选择区域 (局_已选区域.顶边, 局_已选区域.左边, 局_单元坐标.垂直, 局_已选区域.右边)  ' 选择向下移动
        .判断开始 (局_单元坐标.垂直 > 局_填充行号)  ' 填充序号
            .变量循环首 (局_填充行号 + 1, 局_单元坐标.垂直, 1, 局_填充行号)
                局_填充序号 = 局_填充序号 + 1
                局_序列指针 = 局_序列指针 + 1
                .如果真 (局_序列指针 > 取数组成员数 (局_填充序列))
                    局_序列指针 = 1  ' 复位序列指针
                .如果真结束
                .如果 (局_数字填充)
                    私_表格.置数据 (局_填充行号, 局_已选区域.左边, #表格常量.文本型, 局_填充序号)  ' 数字填充
                .否则
                    私_表格.置数据 (局_填充行号, 局_已选区域.左边, #表格常量.文本型, 局_填充序列 [局_序列指针])  ' 自定义填充
                .如果结束

            .变量循环尾 ()
        .判断 (局_单元坐标.垂直 < 局_填充行号)  ' 清除序号
            私_表格.清空单元格数据 (局_单元坐标.垂直 + 1, 局_已选区域.左边, 局_填充行号, 局_已选区域.右边)
            局_填充序号 = 局_填充序号 - (局_填充行号 - 局_单元坐标.垂直)
        .默认
            ' 相等就不处理了
        .判断结束
        局_填充行号 = 局_单元坐标.垂直
    .默认
        ' 向上填充处理
        局_信息文本 = “当前方向:向上填充” + 到文本 (局_已选区域.顶边 - 局_单元坐标.垂直) + “行”
        .如果 (局_单元坐标.垂直 < 私_表格.表头行数)  ' 表头行不进行填充
            局_信息文本 = 局_信息文本 + #换行符 + “功能提示:表头行单元格不在填充范围!”
        .否则
            私_表格.选择区域 (局_单元坐标.垂直, 局_已选区域.左边, 局_已选区域.底边, 局_已选区域.右边)  ' 选择向上移动
            .判断开始 (局_单元坐标.垂直 < 局_填充行号)  ' 填充序号
                .变量循环首 (局_填充行号 - 1, 局_单元坐标.垂直, -1, 局_填充行号)
                    局_填充序号 = 局_填充序号 - 1
                    局_序列指针 = 局_序列指针 - 1
                    .如果真 (局_序列指针 = 0)
                        局_序列指针 = 取数组成员数 (局_填充序列)  ' 复位序列指针
                    .如果真结束
                    .如果 (局_数字填充)
                        私_表格.置数据 (局_填充行号, 局_已选区域.左边, #表格常量.文本型, 局_填充序号)  ' 数字填充
                    .否则
                        私_表格.置数据 (局_填充行号, 局_已选区域.左边, #表格常量.文本型, 局_填充序列 [局_序列指针])  ' 自定义填充
                    .如果结束

                .变量循环尾 ()
            .判断 (局_单元坐标.垂直 > 局_填充行号)  ' 清除序号
                私_表格.清空单元格数据 (局_填充行号, 局_已选区域.左边, 局_单元坐标.垂直 - 1, 局_已选区域.右边)
                局_填充序号 = 局_填充序号 + 局_单元坐标.垂直 - 局_填充行号
            .默认
                ' 相等就不处理了
            .判断结束
            局_填充行号 = 局_单元坐标.垂直
        .如果结束

    .判断结束
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.默认

.判断结束
返回 (“功能提示:!不支持的功能状态!”)

.子程序 执行移动功能, 文本型, , 将选中单元格的数据移动到新的目标位置
.参数 参_指针坐标, 自_坐标, 可空, 鼠标指针在表格中的绝对坐标
.参数 参_功能状态, 整数型, , 可选值:1、#常_执行_设置 2、#常_执行_调整 3、#常_执行_应用(使用此值时参数一可以为空)
.局部变量 局_移动数据, 文本型, 静态, , 欲移动的数据
.局部变量 局_原始区域, 矩形, 静态, , 目标区域在此基础上调整
.局部变量 局_目标区域, 矩形
.局部变量 局_起始单元, 自_坐标, 静态, , 调整时以此单元为原点
.局部变量 局_终止单元, 自_坐标
.局部变量 局_信息文本, 文本型, , , 提示当前功能的执行情况啦

.判断开始 (参_功能状态 = #常_执行_设置)
    私_功能 = #常_功能_移动
    .判断开始 (取已选择区域 (局_原始区域) = 假)
        局_信息文本 = “功能提示:执行移动功能时请选中欲移动的单元格!”
    .判断 (计算单元位置 (参_指针坐标, 局_起始单元) = 假)
        局_信息文本 = “功能提示:执行移动功能时请选中有效的单元格!”
    .默认
        私_表格.复制选定文本 ()  ' 取欲移动的数据
        局_移动数据 = 取剪辑板文本 ()  ' 保存数据
        .如果 (检查指定数据 (局_移动数据, #常_检查_空白))
            私_状态 = #常_状态_执行
            局_信息文本 = “当前状态:已就绪,请移动鼠标选择区域,区域确定后松开鼠标完成移动”
        .否则
            局_信息文本 = “功能提示:已选择单元区域内无有效数据,移动已取消!”
        .如果结束

    .判断结束
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_调整)
    .如果真 (计算单元位置 (参_指针坐标, 局_终止单元) = 假)
        返回 (“功能提示:指针已超出有效单元格范围!”)
    .如果真结束
    局_目标区域.顶边 = 局_原始区域.顶边 + 局_终止单元.垂直 - 局_起始单元.垂直  ' 计算目标区域
    局_目标区域.底边 = 局_原始区域.底边 + 局_终止单元.垂直 - 局_起始单元.垂直
    局_目标区域.左边 = 局_原始区域.左边 + 局_终止单元.水平 - 局_起始单元.水平
    局_目标区域.右边 = 局_原始区域.右边 + 局_终止单元.水平 - 局_起始单元.水平
    私_表格.选择区域 (局_目标区域.顶边, 局_目标区域.左边, 局_目标区域.底边, 局_目标区域.右边)
    局_信息文本 = “当前状态:已就绪,请移动鼠标选择区域,区域确定后松开鼠标完成移动” + #换行符
    局_信息文本 = 局_信息文本 + “功能备注:1、不同类型列之间进行移动,可能出现会数据丢失” + #换行符
    局_信息文本 = 局_信息文本 + “          2、目标区域超出有效单元格范围部分的数据不会被保留” + #换行符
    局_信息文本 = 局_信息文本 + “             请自行确认移动范围!”
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + 局_信息文本)
.判断 (参_功能状态 = #常_执行_应用)
    .如果真 (取已选择区域 (局_目标区域) = 假)
        返回 (“功能提示:未检测到已选择区域,复制功能执行失败!”)
    .如果真结束
    私_表格.清空单元格数据 (局_原始区域.顶边, 局_原始区域.左边, 局_原始区域.底边, 局_原始区域.右边)  ' 清除原始区域内容
    私_表格.置光标 (局_目标区域.顶边, 局_目标区域.左边)  ' 定位粘贴的区域
    置剪辑板文本 (局_移动数据)  ' 准备粘贴
    私_表格.粘贴 ()  ' 将欲移动的数据粘贴到目标区域
    返回 (“功能状态:” + 取当前功能名 () + #换行符 + “功能提示:复制功能执行结束^_^”)
.默认

.判断结束
返回 (“功能提示:!不支持的功能状态!”)

.子程序 更新指针形状, 逻辑型, , 根据鼠标指针在表格中的绝对位置来确定当前鼠标指针的形状。成功返回真,失败返回假,说明未曾成功调用【置入高级表格】方法
.参数 参_指针坐标, 自_坐标, 可空, 鼠标指针在表格中的绝对坐标。为空则使用默认形状的指针
.局部变量 局_区域位置, 矩形, , , 被选择区域在表格中的绝对坐标
.局部变量 局_表头尺寸, 自_尺寸
.局部变量 局_提示信息, 文本型
.局部变量 局_指针形状, 字节集
.局部变量 局_指针位置, 整数型

.如果真 (置入高级表格 () = 假)
    返回 (假)
.如果真结束
局_指针形状 = 到字节集 (#常_形状_默认)  ' 指针默认为箭头
.如果真 (是否为空 (参_指针坐标) = 假)
    计算表头尺寸 (局_表头尺寸)
    .如果 (局_表头尺寸.宽度 > 参_指针坐标.水平 或 局_表头尺寸.高度 > 参_指针坐标.垂直)  ' 说明在表头区域
        局_提示信息 = “功能提示:双击当前位置下单元格中部可以编辑单元内容”
    .否则
        局_指针位置 = 计算位置关系 (参_指针坐标, 私_区域位置)
        .判断开始 (局_指针位置 = #常_指针_邻右 + #常_指针_邻底)  ' 表示指针在当前选择区域的右下角
            局_指针形状 = 到字节集 (#常_形状_十字)
            局_提示信息 = “功能提示:1、按下鼠标左键为复制功能” + #换行符
            局_提示信息 = 局_提示信息 + “          2、按下Ctrl键时按下鼠标左键为填充功能”
        .判断 (局_指针位置 ≠ #常_指针_邻外 且 局_指针位置 ≠ #常_指针_邻内)  ' 表示指针在当前选择区域的其它相邻位置,但是不包含内部
            局_指针形状 = 到字节集 (#常_形状_箭头)
            局_提示信息 = “功能提示:按下鼠标左键为移动功能”
        .默认
            局_提示信息 = “功能提示:按下鼠标左键为累加功能”
        .判断结束

    .如果结束

.如果真结束
.如果真 (私_表格.鼠标指针 ≠ 局_指针形状)  ' 更新指针将导致产生【鼠标位置被移动】事件,所以判断下,避免产生不必要的事件
    私_表格.鼠标指针 = 局_指针形状
.如果真结束
.如果真 (私_数据.显示方式 = #常_方式_永久显示)
    显示提示信息 (局_提示信息, 参_指针坐标)  ' 显示当前位置可执行的功能
.如果真结束
返回 (真)

.子程序 更新功能类型, 逻辑型, , 根据鼠标指针在表格中的形状来选择扩展功能的类型。
.参数 参_指针坐标, 自_坐标, , 鼠标指针在表格中的绝对坐标
.参数 参_功能键状态, 整数型, , 可以为以下常量值或其和: 1、#Ctrl键状态; 2、#Shift键状态; 4、#Alt键状态
.局部变量 局_指针形状, 字节集
.局部变量 局_更新信息, 文本型
.局部变量 局_指针位置, 整数型
.局部变量 局_单元坐标, 自_坐标

.如果真 (置入高级表格 () = 假)
    返回 (假)
.如果真结束
局_指针形状 = 私_表格.鼠标指针  ' 取指针形状
.判断开始 (局_指针形状 = 到字节集 (#常_形状_十字))
    .如果 (位与 (参_功能键状态, #Ctrl键状态) = #Ctrl键状态)  ' Ctrl键用于选择填充功能
        局_更新信息 = 执行填充功能 (参_指针坐标, #常_执行_设置)  ' 填充功能初始化
    .否则
        局_更新信息 = 执行复制功能 (参_指针坐标, #常_执行_设置)  ' 复制功能初始化
    .如果结束

.判断 (局_指针形状 = 到字节集 (#常_形状_箭头))
    局_更新信息 = 执行移动功能 (参_指针坐标, #常_执行_设置)  ' 移动功能初始化
.默认
    局_更新信息 = 执行累加功能 (参_指针坐标, #常_执行_设置)  ' 累加功能初始化
.判断结束
显示提示信息 (局_更新信息, 参_指针坐标)  ' 显示执行的结果
返回 (真)

.子程序 处理扩展功能, , 公开, 对鼠标在表格中的相关操作进行扩展。!将此方法放到【高级表格】的【鼠标位置被移动】子程序下并传入对应的参数即可!
.参数 参_横向位置, 整数型
.参数 参_纵向位置, 整数型
.参数 参_功能键状态, 整数型
.局部变量 局_指针坐标, 自_坐标, 静态, , 备份鼠标指针在表格中的绝对位置
.局部变量 局_提示信息, 文本型

.如果真 (私_状态 = #常_状态_禁止 或 局_指针坐标.水平 = 参_横向位置 且 局_指针坐标.垂直 = 参_纵向位置)  ' 禁止状态和坐标相同不做处理
    返回 ()
.如果真结束
局_指针坐标.水平 = 参_横向位置  ' 更新指针坐标
局_指针坐标.垂直 = 参_纵向位置
.判断开始 (私_状态 = #常_状态_关闭)
    更新指针形状 (局_指针坐标)
.判断 (私_状态 = #常_状态_执行)  ' 对功能执行的过程进行处理
    .判断开始 (私_功能 = #常_功能_累加)
        局_提示信息 = 执行累加功能 (局_指针坐标, #常_执行_调整)
    .判断 (私_功能 = #常_功能_复制)
        局_提示信息 = 执行复制功能 (局_指针坐标, #常_执行_调整)
    .判断 (私_功能 = #常_功能_填充)
        局_提示信息 = 执行填充功能 (局_指针坐标, #常_执行_调整)
    .判断 (私_功能 = #常_功能_移动)
        局_提示信息 = 执行移动功能 (局_指针坐标, #常_执行_调整)
    .默认
        返回 ()
    .判断结束
    显示提示信息 (局_提示信息, 局_指针坐标)  ' 显示处理的结果
.默认

.判断结束


.子程序 打开扩展功能, 逻辑型, 公开, 打开鼠标在表格中的扩展操作。!将此方法放到【高级表格】的【鼠标左键被按下】子程序下并传入对应的参数即可!
.参数 参_横向位置, 整数型
.参数 参_纵向位置, 整数型
.参数 参_功能键状态, 整数型
.局部变量 局_表头尺寸, 自_尺寸
.局部变量 局_指针坐标, 自_坐标, , , 鼠标指针在表格中的绝对位置
.局部变量 局_功能类型, 整数型

局_指针坐标.水平 = 参_横向位置
局_指针坐标.垂直 = 参_纵向位置
.如果真 (计算表头尺寸 (局_表头尺寸))
    .如果真 (参_横向位置 > 局_表头尺寸.宽度 且 参_纵向位置 > 局_表头尺寸.高度)  ' 位于表格区域内
        更新起始行列 (局_指针坐标)
        .如果真 (更新功能类型 (局_指针坐标, 参_功能键状态))
            .如果真 (私_功能 ≠ #常_功能_累加)
                返回 (假)  ' !用于上级函数拦截事件!
            .如果真结束

        .如果真结束

    .如果真结束

.如果真结束
返回 (真)

.子程序 关闭扩展功能, 逻辑型, 公开, 关闭正在进行的扩展操作。!将此方法放到【高级表格】的【鼠标左键被放开】、【将被编辑】、【结束编辑】子程序下并传入对应的参数即可(注意参数选择)!
.参数 参_横向位置, 整数型, 可空
.参数 参_纵向位置, 整数型, 可空
.参数 参_功能键状态, 整数型, 可空
.参数 参_功能禁止, 逻辑型, 可空, 真-禁止全部扩展功能,假-运行执行扩展功能。在【将被编辑】子程序下使用本参数且必须为真,其它子程序下请保留为空即可
.局部变量 局_指针坐标, 自_坐标, , , 鼠标指针在表格中的绝对位置
.局部变量 局_已选区域, 矩形

.如果真 (取已选择区域 (局_已选区域))
    局_指针坐标.水平 = 参_横向位置
    局_指针坐标.垂直 = 参_纵向位置
    更新起始行列 (, 局_指针坐标)
    计算区域位置 (局_已选区域, 私_区域位置)
.如果真结束
显示提示信息 ()  ' 关闭信息显示
.判断开始 (参_功能禁止)
    更新指针形状 ()  ' 更新为默认的鼠标指针
    私_状态 = #常_状态_禁止  ' 禁止扩展功能运行
.判断 (私_状态 = #常_状态_禁止 或 私_状态 = #常_状态_打开)
    私_状态 = #常_状态_关闭
.判断 (私_状态 = #常_状态_执行)  ' 执行结束处理
    .判断开始 (私_功能 = #常_功能_复制)
        执行复制功能 (, #常_执行_应用)
        返回 (假)  ' !用于上级函数拦截事件!
    .判断 (私_功能 = #常_功能_填充)  ' 实时填充,不需要应用
        ' 填充数据 (, #常_执行_应用)
    .判断 (私_功能 = #常_功能_移动)
        执行移动功能 (, #常_执行_应用)
        返回 (假)  ' !用于上级函数拦截事件!
    .判断 (私_功能 = #常_功能_累加)  ' 实时累加,不需要应用
        ' 累加数据 (, #常_执行_应用)
    .默认

    .判断结束
    私_状态 = #常_状态_关闭
.默认

.判断结束
返回 (真)

.子程序 编辑行列表头, , 公开, 编辑行或者列表头单元的内容。!将此方法放到【高级表格】的【被双击】子程序下并传入对应的参数即可!
.参数 参_横向位置, 整数型
.参数 参_纵向位置, 整数型
.参数 参_功能键状态, 整数型
.局部变量 局_边距尺寸, 整数型
.局部变量 局_表头尺寸, 自_尺寸
.局部变量 局_临时文本, 文本型
.局部变量 局_单元坐标, 自_坐标
.局部变量 局_指针坐标, 自_坐标
.局部变量 局_起始位置, 整数型

.如果真 (置入高级表格 ())
    局_指针坐标.水平 = 参_横向位置
    局_指针坐标.垂直 = 参_纵向位置
    .如果真 (计算单元位置 (局_指针坐标, 局_单元坐标))
        .判断开始 (局_单元坐标.水平 < 私_表格.表头列数 且 局_单元坐标.垂直 < 私_表格.表头行数)  ' 表头交汇区域单元
            信息框 (“不支持表头交汇区域单元编辑!”, 0, )  ' 有需要可以自行修改
            返回 ()
        .判断 (局_单元坐标.水平 ≥ 私_表格.表头列数 且 局_单元坐标.垂直 < 私_表格.表头行数)  ' 行表头
            局_起始位置 = 计算行列尺寸 (0, 局_单元坐标.水平 - 1, 假)
            .如果真 (参_横向位置 - 局_起始位置 < #常_数据_边距水平 或 局_起始位置 + 私_表格.取单元格列宽 (局_单元坐标.垂直, 局_单元坐标.水平) - 参_横向位置 < #常_数据_边距水平)  ' 位于单元格中间则继续编辑
                返回 ()  ' 否则可能是双击表格调整单元格尺寸,直接返回
            .如果真结束
            局_临时文本 = “提示:正在修改行表头:行号=” + 到文本 (局_单元坐标.垂直) + “ 列号=” + 到文本 (局_单元坐标.水平) + “ 内容=”
        .判断 (局_单元坐标.垂直 ≥ 私_表格.表头行数 且 局_单元坐标.水平 < 私_表格.表头列数)  ' 列表头
            局_起始位置 = 计算行列尺寸 (0, 局_单元坐标.垂直 - 1, 真)
            .如果真 (参_纵向位置 - 局_起始位置 < #常_数据_边距垂直 或 局_起始位置 + 私_表格.取单元格行高 (局_单元坐标.垂直, 局_单元坐标.水平) - 参_纵向位置 < #常_数据_边距垂直)  ' 位于单元格中间则继续编辑
                返回 ()  ' 否则可能是双击表格调整单元格尺寸,直接返回
            .如果真结束
            局_临时文本 = “提示:正在修改列表头+行号=” + 到文本 (局_单元坐标.垂直) + “ 列号=” + 到文本 (局_单元坐标.水平) + “ 内容=”
        .默认
            返回 ()  ' 其它操作直接返回
        .判断结束
        局_临时文本 = 局_临时文本 + 私_表格.取数据 (局_单元坐标.垂直, 局_单元坐标.水平) + #换行符
        局_临时文本 = 局_临时文本 + “注意:不输入内容直接确定则清除单元格内容,不想修改按取消或者关闭即可。”
        .如果真 (输入框 (局_临时文本, “请输入新的内容...”, , 局_临时文本, ))  ' 输入确认
            私_表格.置数据 (局_单元坐标.垂直, 局_单元坐标.水平, #表格常量.文本型, 局_临时文本)  ' 则修改单元内容
        .如果真结束

    .如果真结束

.如果真结束

@易语言资源网站

文件下载


来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

已有3位网友发表了看法:

  • API完成

    API完成  评论于 [2020-04-14 12:44:29]  回复

    易语言高级表格隐藏列

  • 易语言

    易语言  评论于 [2020-04-17 20:32:31]  回复

    exui扩展组件高级表格

  • 易语言代码

    易语言代码  评论于 [2020-04-25 15:48:00]  回复

    易语言高级表表鼠标左键按下选择区域

  • 精易模块

    精易模块  评论于 [2020-05-28 15:19:09]  回复

    易语言高级表格怎样在表格加下接菜单并显示出箭头

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
取群列表缓动算法隐藏进程BPL综合例程DirectX例程日期时间型智慧职教Sqlite3数据库操作类RSA软件自动更新英文智能提示彩票开奖遗漏组合分析进程保护医院信息管理系统加QQ好友超文本浏览框domPostgreSQL数据库邮箱服务器斗鱼房间热度
最新评论