南京天相软件有限公司 朱孝兵 本人所在单位于二○○二年购买了Cell组件,此期间使用Cell组件开发了不少项目,现将自己使用的一些感受及经验整理成文,抛砖引玉之作,期待得到大家指点。 安 装 篇 Cell组件是遵循ActiveX标准的控件,很容易安装到自己的开发环境中。 1、 安装华表公司的Cell组件。 2、 打开DELPHI,选择ComponentImport 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组件的强大功能解决了许多实际问题。 |