南京天相軟體有限公司 朱孝兵
本人所在單位於二○○二年購買了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組件的強大功能解決了許多實際問題。