华表CELL组件的应用

南京天相软件有限公司    朱孝兵

本人所在单位于二○○二年购买了Cell组件,此期间使用Cell组件开发了不少项目,现将自己使用的一些感受及经验整理成文,抛砖引玉之作,期待得到大家指点。

安 装 篇

Cell组件是遵循ActiveX标准的控件,很容易安装到自己的开发环境中。

1、安装华表公司的Cell组件。

2、打开DELPHI,选择ComponentImport ActiveX Control…菜单。

3、在Import ActiveX窗体中选择Cell5.2 ActiveX Control Module选项,点击最下面的【Install…】按钮。

4、在Package窗体中点击【Compile】、【Install】按钮,退出时选择不保存。

5、在控件区的ActiveX页中出现一个Cell图标,表示安装成功。

6、直接将Cell图标拖到Form中即可使用。

7、Cell组件提供了几种开发环境中的Demo,可以直接照办使用,那基本就是一个现成的产品。

初 级 篇

初期使用Cell组件进行二次开发,主要用于表格套打、表格计算、表的控制等功能。

1、表格套打

许多行政管理部门在发放证书或格式文件管理过程中,对套打功能要求是比较高的。南京建工系统发放的建筑工程竣工备案证书以前就是用Word排个模版,但是实际内容与模版预留空间不符时,或者多敲了换行键,整个格式就乱套了,工作人员又要重新排版,反复打印、调试,真是浪费时间、浪费纸张、浪费精力。我们就用Cell组件做了一个模版,结合业务系统自动提取工程概况,现在用户点击工程名称,马上就在屏幕上看到备案证书全部内容,各单元格中的文字可以用调整大小、自动换行等方法控制展现,并且只打印原来要手工填写的内容,大大地提高了工作效率和正确率。这点在金山WPS和微软Word、Excel都没有实现。

屏幕登记界面                                套打预览效果

技术提示:对套打中要控制单元格内容是否打印,有两种方法:一是最终用户进入单元格属性直接设置。二是开发人员使用SetCellPrintHide命令控制打印机是否打印。

2、表格计算

这一点与Excel的计算功能类似,就不多说了。

3、表的控制

最近写一个业务单操作与流程管理对应的软件项目,要求在一张完整的业务单上,A登记前半部分申报内容,不能看到后面的记录和审批内容,B只能查看A登记内容的一部分,且不允许修改A登记的任何内容,但对自己的内容可以输入,如此一层一层的控制,最后F可以看到全部内容,但仍然不允许修改。经过各种试验比较,最后选用Cell组件完成了这个项目主体框架部分。整个程序只用了80多行语句就实现了控制50多种表,而且结构清晰,可维护性强,足以应付将来增加更多业务项目表的功能。

A登记(B试验记录不可见)

B试验(A内容部分禁看,全部禁改)

技术提示:我们首先封闭单元格属性的直接操作,然后结合各个流程点的操作权限和Cell组件的命令来控制表单的展现形式。具体使用的命令如下:SetCellShowHide控制哪些单元格内容在屏幕上显示或隐藏,SetRowUnHidden/SetRowHidden控制哪些行需要显示或隐藏,SetCellInput控制哪些单元格是输入或只读。

提 高 篇

Cell组件作为一个控件,似乎只能被动地填充数据,实现表格自身的计算、套打等功能,很长一段时间我们也就这么用了。随着应用的深入,我们感觉将Cell表格作为宿主程序,根据用户在表格中输入的内容向我们的开发环境提出请求很有必要,而且控制更加灵活。经过华表公司的介绍,原来奥秘尽在Cell组件提供的自定义函数中,我们在自定义函数中可以实现一些表格无法实现的功能,包括界面控制和后台数据库处理,使Cell组件完全与我们的开发环境融为一体,最大限度地发挥Cell组件的功能和表格的便利。

在From的Create事件中定义函数接口。

procedure TForm1.FormCreate(Sender: TObject);

var

strFun: WideString;

begin

strFun := ''"天相函数" String txInterFace(double n)'';

Cell1.DefineFunctions(strFun);  //将自定义函数添加至CELL中

strFun := ''"天相函数" Double txGetDb(double n)'';

Cell1.DefineFunctions(strFun);

End;

在Cell的自定义函数事件CalcFunc中定义函数的实现功能。CalcFunc事件根据表格中输入内容确认时立即触发的机制实现与开发环境的互动。而Cell内置函数对CalcFunc事件无效,华表公司在这点上设计的非常合理。

procedure TForm1.Cell1CalcFunc(Sender: TObject; const name: WideString;

rettype, paranum: Integer);

begin

if name=' txInterFace' then    //执行界面操作的自定义函数

begin

Application.CreateForm(TForm2, Form2);

Form2.ShowModal;

Form2.Free;

Cell1.SetFuncResult(1, ''调用窗体成功!'', 1);

//由于函数定义返回类型为string,所以实际返回‘调用窗体成功!'

end;

if name=''txGetDb'' then    //执行数据库操作的自定义函数

with DataModal do

begin

if spTmp.Active then spTmp.Close;

// spTmp是ADOStoredProc的实例。返回从存储过程获取的数据

spTmp.ProcedureName:= ''PJC_SET_TRPT'';

spTmp.Parameters.Refresh;

spTmp.Parameters.ParamValues[''@XBH'']:= ''1010'';

spTmp.Parameters.ParamByName(''@RBH'').Direction:= pdOutput;

spTmp.ExecProc;

Cell1.SetFuncResult(spTmp.Parameters.ParamValues[''@RBH''], '''', 0);

spTmp.Close;

end;

end;

下面是实际使用情况。

在Cell表格中输入“=”号,弹出公式框,通过“?”按钮选择txInterFace函数或直接输入txInterFace函数,最后选择“√” 按钮,将立即触发CalcFunc事件中的txInterFace函数执行体,弹出Form2窗体,在Form2窗体你可以尽情地做自己的事啦。

使用自定义函数的另一个好处就是别人没法拷走你的表格,因为没有你的程序配合就无法实现表格独特的功能。

总而言之,我们已经利用Cell组件的强大功能解决了许多实际问题。

(0)

相关推荐

  • 华表CELL组件的应用

    南京天相软件有限公司    朱孝兵 本人所在单位于二○○二年购买了Cell组件,此期间使用Cell组件开发了不少项目,现将自己使用的一些感受及经验整理成文,抛砖引玉之作,期待得到大家指点. 安 装 篇 Cell组件是遵循ActiveX标准的控件,很容易安装到自己的开发环境中. 1.安装华表公司的Cell组件. 2.打开DELPHI,选择ComponentImport ActiveX Control-菜单. 3.在Import ActiveX窗体中选择Cell5.2 ActiveX Contro

  • 在vant 中使用cell组件 定义图标该图片和位置操作

    @本来想直接使用icon组件,使用阿里的图标库,可是怎么弄也不行,折腾一下午,最后决定使用最笨的办法,直接上代码 vant 中使用cell组件 定义图标该图片和位置像微信信息栏一样 <div> <van-cell-group class="vanCellGroupClass"><!--../../assets/tou.png--> <!--<van-cell icon="" title="二级经营单位&quo

  • Flutter之TabBarView组件项目实战示例

    目录 TabBarView TabBar TabBarView+项目实战 1 构建导航头部搜索框 2 构建导航头部TabBar 3 构建导航底部TabBarView容器 4 构建导航底部结构填充 5 构建导航底部结构轮播图 6 构建导航底部结构信息流 总结 TabBarView TabBarView 是 Material 组件库中提供了 Tab 布局组件,通常和 TabBar 配合使用. TabBarView 封装了 PageView,它的构造方法: TabBarView({ Key? key,

  • iOS中的UITableView的重用机制与加载优化详解

    UITableView可以说是UIKit中最重要的一个组件,用来展示数据列表,还可以灵活使用进行页面的布局.UITableView的使用遵循MVC模式,数据模型(NSObject).视图(UIView)和控制器(UITableViewController)分离.UITableView继承自UIScrollView,可上下滑动,可以作为跟视图也可以作为子视图组件. reuseIdentifier顾名思义是一个复用标识符,是一个自定义的独一无二的字符串,用来唯一地标记某种重复样式的可复用UITabl

  • vue+vux实现移动端文件上传样式

    样式使用的是vux的cell组件 如下图的官方demo样子 上图的样式需要修改一下,把 保护中 修改成一个图片 并且内嵌一个input type='file'  就可以拥有好看的样式的文件上传了 <!--引入组件--> import { Cell } from 'vux' <!--官网的组件是这么写的--> <group> <cell title="title" value="value"></cell>

  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    现如今跨平台开发技术已不是什么新鲜话题了,在市面上也有一些开源的框架可供选择,然而技术成熟.产品服务健全的平台并不多,其中也不乏推陈出新的框架值得关注. 比如最近使用的AVM,由APICloud迭代推出的多端开发框架,基于JavaScript,兼容多语法,如果是Vue.React的用户,可直接上手,没什么学习成本,具备虚拟DOM,可一次编写多端渲染:主要是APICloud上线已有7年,相对已经成熟,所以我把自己的一些认知和实践结合AVM官方文档的内容做了一下整理,希望能对需要使用跨平台开发技术的

  • Gird组件 Part-3:范例RSSFeed Viewer

    原文地址 文章日期:2006/09/04 新组件Gird包含了许多的类和继承方法.如果读者不是太熟悉的面向对象开发的话,可能会对一个变量如何从某个类得到继承的方法感到困惑,用起GIRD来感到困难.在YAHOO.ext.gird包中,大多数类是设计成为"即插即用plug and play"的,可扩展的extended和可自定义的customized,能以最小量的代码插入轻松到web程序中. 要测试和创建一个实现gird的范例,我决定做一个简单的,只有一页的RSS种子采集器RSS Feed

  • require.js+vue开发微信上传图片组件

    由于项目是thinkPHP做后端框架,一直以来都是多页面的后端路由,想使用火热的webpack有点无从下手(原谅我太菜,而且推广vue只有我一个人--),没办法,想把vue用起来,唯有在原来的基础上改进.使用webpack的巨大好处就是可以使用 .vue 这样的单文件来写vue组件,这样每一个组件就是一个 .vue 文件,哪里用上这个组件就引入进来,维护起来确实很爽.然而一直以来项目用的都是require.js,那又想以这样的形式来组织vue组件,还要加上vue-router和vue-resou

  • ReactiveCocoa代码实践之-UI组件的RAC信号操作

    相关阅读: ReactiveCocoa代码实践之-更多思考 ReactiveCocoa代码实践之-RAC网络请求重构这一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜色,下面有三个UISlider滑竿分别控制RGB的色值,随着不同滑竿的拖动上面view的颜色会随之改变. 可以先脑补一下不用RAC该怎么写. 如果使用RAC只需要将三个信号包装起来用适

  • 详解打造 Vue.js 可复用组件

    Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日益庞大,组件也越来越多,组件逻辑耦合严重,使代码维护变得十分困难. 同时,Vue.js 的接口和语法十分自由,实现同一功能有若干种方法.每个人解决问题的思路不一样,写出来的代码也就不一样,缺乏团队内的规范. 本文旨在从组件开发的不同方面列举出合理的解决方法,作为建立组件规范的一个参考. 构成组件 组件,是一个

随机推荐