JS宏实例:数据透视工具的制作(四)

server/2025/2/25 0:12:08/

上一节中,我们完成了核心的计算代码部分,本节中将完善事件代码

一、创建所有需求的事件函数

1、窗体初始化

javascript">// 窗体初始化
function pivotForm_Initialize(){} 
function typeSet_Initialize(){} 
function valueSet_Initialize(){} 
function allColTypeSet_Initialize(){}

上述是四个窗体显示前会执行的事件

2、主窗体部分事件

javascript">// pivotForm 主窗体事件
function pivotForm_CommandButton1_Click(){} 
function pivotForm_CommandButton2_Click(){} 
function pivotForm_CommandButton3_Click(){} 
function pivotForm_CommandButton4_Click(){} 
function pivotForm_CommandButton5_Click(){} 
function pivotForm_CommandButton6_Click(){}
function pivotForm_TextEdit1_Change(){} 
function pivotForm_ListBox1_DblClick(cancel){} 
function pivotForm_ListBox2_DblClick(cancel){}
function pivotForm_ListBox3_DblClick(cancel){} 
function pivotForm_ListBox4_DblClick(cancel){} 
function pivotForm_ListBox5_DblClick(cancel){}

3、附属窗体事件

javascript">// typeSet 单个字段设置窗体事件
function typeSet_CommandButton1_Click(){} 
function typeSet_CommandButton2_Click(){} 
function typeSet_CommandButton3_Click(){}
function typeSet_ComboBox1_Change(){} 
function typeSet_ComboBox2_Change(){}// valueSet 值字段设置窗体事件
function valueSet_CommandButton1_Click(){} 
function valueSet_CommandButton2_Click(){} 
function valueSet_CommandButton3_Click(){}
function valueSet_ComboBox1_Change(){} 
function valueSet_ComboBox2_Change(){} 
function valueSet_ComboBox3_Change(){}
function valueSet_ComboBox4_Change(){} 
function valueSet_ListBox1_Click(){}// allColTypeSet 字段类型设置窗体事件
function allColTypeSet_CommandButton1_Click(){} 
function allColTypeSet_ComboBox1_Change(){} 
function allColTypeSet_ComboBox2_Change(){}

注意:上述事件函数可以在全局定义,然后通过代理或闭包的方式去拦截它的调用,从而更改它的行为,因此,我们可以定义一个事件类和一个事件绑定方法来完成这一操作

二、事件类的构造函数

1、代码

commandButtonClick

javascript">// 事件类
function Events() {}
Events.prototype = {formInitialize: function(userform, obj, moveObj) {// userform 是一个窗体对象// obj 是一个对象,对象中的key是控件名称,值是一个数组存储默认值,或初始化// moveObj key = 要移动的控件名称,value = [left, top, height, width]for (let key in obj) {let str = key.match(/[a-zA-Z]+/g);if (str === "CommandButton" || str === "Label") {userform.Controls(key).Caption = obj[key][0];} else if (str === "ComboBox" || str === "ListBox") {obj[key].slice(1).forEach(i => userform.Controls(key).AddItem(i));userform.Controls(key).Value = obj[key][0];} else if (str === "TextEdit") {userform.Controls(key).Value = obj[key][0];}}for (let key in moveObj) {userform.Controls(key).Left = moveObj[0];userform.Controls(key).Top = moveObj[1];userform.Controls(key).Height = moveObj[2];userform.Controls(key).Width = moveObj[3];}},commandButtonClick: function(fu) {return fu;},textEditChange: function(fu) {return fu;},comboBoxChange: function(fu) {return fu;},listBoxDblClick: function(fu, cancel) {return fu;},
}

2、说明

在原型链中,定义了五个方法:

  • formInitialize:窗体初始化事件,也就是打开窗体要执行的操作
    • 参数
      • userform:窗体对象
      • obj:对象中的key是控件名称,值是一个数组存储默认值,或初始化操作数据
      • moveObj:key 是要移动的控件名称,value = [left, top, height, width]
    • 局限性
      • 未给出所有控件的操作方式
      • 为给出所有属性的操作
    • 优化方式
      • 通过Proxy对象来拦截该函数的调用,给他增加其他行为
      • 通过闭包,给它添加额外的操作等
  • commandButtonClick:命令按钮的点击事件,点击按钮时,执行传入的函数fu
  • textEditChange:文本框内容发生变化时,执行传入的操作函数fu
  • comboBoxChange:组合框内容发生变化时,执行传入的操作函数fu
  • listBoxDblClick:在列表框中双击某一元素时,执行传入的操作函数fu

暂未写玩,后续直接在这里补充


http://www.ppmy.cn/server/170430.html

相关文章

topN 相似度 torch实现

目录 优化版,去重相似度 topN 欧式距离版 没有去重复, 优化版,去重相似度 import torch import torch.nn.functional as F torch.manual_seed(42) # 假设 10 条数据,每条数据的特征维度是 128 data = torch.randn(10, 128)# 计算所有数据对之间的余弦相似度 cosine_simi…

(网络安全)渗透测试

1、渗透测试种类 2、网络安全渗透测试分类 1)网络安全渗透测试, 根据事先对测试目标系统信息的了解程度,可以分为 a.黑盒测试: 只知道要测试的目标系统,但系统内部的任何信息,都不清楚。这种测试最真实&am…

【多模态处理篇八】【DeepSeek增强现实:AR导航实时推理优化】

一、AR导航的「地狱级难度」挑战 搞AR导航就像在钢丝上跳街舞——既要实时感知环境,又得丝滑渲染虚拟指引,还得防着手机发烫罢工。具体难点包括: 1. 算力饥渴症 手机端要同时处理: 摄像头画面(30fps+)SLAM定位(每秒百次坐标计算)3D箭头渲染(每帧万级三角形) 这相当…

Qt 中的线程池QRunnable和QThreadPool

Qt 中的线程池QRunnable和QThreadPool 一、QThreadPool类介绍 QThreadPool 是 Qt 框架中用于管理线程池的类,它提供了一种高效的方式来管理和复用线程,避免频繁创建和销毁线程带来的开销。 1. 基本概念 QThreadPool 是一个全局的线程池,它…

解决github验证问题

The authenticity of host ‘github.com’ can’t be established.ED25519 key fingerprint is SHA256 首先,生成 SSH key: ssh-keygen -t ed25519 -C "your_emailexample.com"启动 ssh-agent: eval "$(ssh-agent -s)"…

DevOps自动化部署详解:从理念到实践

在软件开发日益快速迭代的今天,如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生,它打破开发、测试、运维之间的壁垒,通过自动化工具和流程,实现持…

基于ffmpeg+openGL ES实现的视频编辑工具-添加转场(九)

在视频编辑的广阔领域中,转场效果无疑是提升视频流畅性与观赏性的关键要素。巧妙运用转场,能够让不同视频片段之间的衔接更为自然,同时赋予视频独特的创意魅力。本文将深入探讨如何借助 ffmpeg 和 openGL ES 技术,在视频编辑工具中实现丰富多样的转场效果。 一、转场技术原…

Spring BOOT 启动参数

Spring BOOT 启动参数 在Java Web的开发完成后,以前我们都会打包成war文件,然后放大web容器,比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目,我们直接打包成jar文件,基于内嵌的tomcat来实现一样的效果。…