在許多的C/S程序中都會提供對數據庫中的數據進行編輯、查詢和打印的功能。以往的做法是針對不同的數據表分別制作編輯、查詢和打印窗體,每個窗體都是全新的。我們會在項目的多個地方嗅到“代碼重復”的味道,使得日後代碼的維護和修改變得很艱難。如果是多人合作的項目,這可能會更糟,因為可能每個對程序員可能會針對編輯、查詢和打印提供不同的接口方法。
針對以上的問題,我在曾經做過的項目中做了一些調整,現整理出來與大家共分享。
鑒於數據編輯、查詢和打印功能會在每個數據窗體中出現,如“訂單窗體”、“入庫單窗體”、“采購單窗體”等等,故將其做統一規劃。考慮對數據庫的編輯、查詢和打印一般是使用彈出式對話框的形式,故在項目中定義了一個對話框窗體類
TDialogForm,該類統一初始化窗體字體、大小和顯示位置,並提供了一個抽象方法
Execute來供外部調用。編輯、查詢和打印窗體均繼承自該窗體,並實現此抽象方法。
在數據窗體中我們增加了Ediror、Searcher和Printer三個屬性,分別用來指定使用的編輯、查詢和打印的窗體實例,同時提供了DoEdit、DOSearch和DoPrint三個方法作為調用接口。在數據浏覽窗體中放置三個按鈕(工具欄按鈕或菜單,依需要而定)並在其單擊事件中調用。由於代碼相似,此處僅以Print為例:
if Assigned(FPrinter) then begin
Printer.DataSet := ActiveDataSet;
Printer.Execute;
end;
else
TDialogBox.Info('Not assigned Printer');
至此,編輯、查詢和打印的基本框架已搭好了。下面開始是具體細節問題了。
不同的數據表有不同的字段,那麼編輯、查詢和打印窗體界面自然也就不同了。細心的朋友可能已經發現了在上面的定義中編輯、查詢和打印窗體都有一個DataSet屬性。我們就是通過這個屬性得取得字段信息,並使用動態創建控件的方法在窗體上創建出可供用戶錄入數據的元素。具體的代碼此處就不寫了。
這種做法充分利用了面向對象程序設計中的繼承和多態,最大程度的減少了程序中的重復代碼,降低日後的維護和修改成本。
一家之言,望各位斧正。