Delphi深度探索-資料庫明了的ActiveX控件
強大的資料庫開發功能無疑是Delphi王冠上的明珠,至少有80%以上的人每天使用Delphi來開發資料庫程式。基於積木式的VCL資料庫控件,以及Dev ExPRess和Woll2Woll等公司提供的強大的第三方資料庫明了控件,毫不誇張的說只需要簡單的設定一下屬性,拖拉幾下滑鼠我們就可以非常快速的完成資料庫程式的開發。由於Delphi的資料庫功能過於強大了,所以很多人就忽略了一個事實,就是ActiveX同樣可以提供靈活的資料庫綁定,遺憾的是Delphi本身所提供的幾個第三方的ActiveX控制項中沒有一個是資料庫明了的控件,間接導致了一個誤解,使得很多人誤以為Delphi並不支援資料明了的ActiveX控件(也包括很久以前的我J)。這當然是錯誤的看法。 在Delphi中使用資料明了的ActiveX控制項在下面的範例中,我們將使用隨Office 2000安裝到系統中的Microsoft Calendar 9.0控制項來進行演示,它就是一個資料明了控制項。選擇Component | Import ActiveX Control,選擇Microsoft Calendar 9.0(見下圖1.12),把類別名稱從TCalendar改成TAXCalendar,以避免同系統中原有的同名控制衝突,然後點Install按鈕安裝此控制項。
新建一個程序,在窗體上放置一個TAXCalendar控制項。再放上一個DataSource 和Table控制項。設定DataSource的Dataset為Table1,然後設定Table1的DataBaseName 屬性為DBDEMOS,TableName 屬性為EMPLOYEE.DB,最後設定Table1.Active屬性為True。 接下來就該進行資料庫綁定了,注意一下引入的TAXCalendar具有DataSource和DataBindings這兩個同一般ActiveX控制項不同的屬性,這是因為ActiveX Import Wizard在引入ActiveX控制項先判斷是否是資料庫明了的控制項,如果是就以TDBOleControl作為基底類別進行繼承,如果不是就從TOleControl開始繼承。而TDBOleControl實作了DataBindings和DataSource屬性。設定AXCalendar1.DataSource屬性為Datasource1。 這時我們在窗體上用滑鼠右鍵點選TAXCalendar控制的話,會發現在右鍵選單中多出了一個DataBindings…選單項目(見下圖1.13)。
點選選單項目後,會顯示資料綁定屬性編輯框(見下圖1.14)。分別在FieldName列錶框中選定HireDate,在Property Name列錶框中選擇Value(12)(其中12是Value的Dispid號),點選Bind按鈕,就會在資料庫欄位和Value屬性間建立資料關聯。
最後,再在窗體上放置一個DBGrid和DBNavigator控件,並設定它們的DataSource為DataSource1。運行程序,移動目前資料位置的時候,你可以注意到ActiveX的日期顯示也會隨之變化,同資料庫中的Hiredate保持一致。如圖1.15所示:
創建資料明了的ActiveX控件雖然我們已經清楚了Delphi的確可以使用資料明了的ActiveX控件,那麼一個新的問題就產生了,Delphi本身可不可以創建資料明了的ActiveX控件呢?由於Delphi提供了一步到位的ActiveX控件轉換生成,就有很多人希望能夠把Delphi中強大的資料庫控件轉換為ActiveX控件,以便能在其他支援ActiveX的開發環境開發資料庫程式時仍然能夠享受到像在Delphi中一樣的輕鬆愉快的感覺。但是我在前面第一部分中已經提到了,由於Delphi的資料明了控件同ActiveX資料庫控制項的在內部機制上差距過大,因此Delphi無法簡單的直接轉換其強大的資料庫控制項。那麼是不是就意味著我們就沒有辦法了呢? of course not! 其實使用類型庫編輯器,我們可以異常輕鬆的實現數據明了的ActiveX控件,就讓我們用TEdit控件來試驗一下,看看如何去做。選取選單指令New | ActiveX | ActiveX Control啟動ActiveX Control Convert Wizard,選TEdit控制項作為轉換對象,產生EditX ActiveX框架。 接下來,我們將改造TEdit的Text屬性,使其支援資料綁定。選View | Type Library來察看Delphi產生的型別庫,並選取Text屬性,然後切換到Flags屬性頁(見下圖1.16)。
注意在Flags屬性頁有很多多選框,對於我們來說,只關心與資料綁定相關的選項。它們是Bindable,Display Bindable,Default Bindable,Immediate Bindable和Request Edit選項。 標記屬性為bindable後,並將其同資料庫欄位綁定後,當使用者修改了屬性後,控制項就會通知資料庫值已經變化,並請求資料庫記錄更新狀況,資料庫反過來也會通知記錄更新是否成功。 Bindable選項表示屬性支援資料綁定,如果把屬性標記為bindable,屬性將在其值變化時通知其容器。 Request Edit表示屬性支援OnRequestEdit 通知訊息,這允許控制項詢問容器屬性值是否允許使用者修改。 Display Bindable表示容器可以向使用者顯示這個屬性是可綁定的。 Default Bindable表示它是唯一的,預設的可綁定屬性,使用它必須同時標記了Bindable屬性。 Immediate Bindable當被標記時,所有的改變都會被通知,同時還需要設定bindable和Request Edit標記。 下面我們就標記EditX控制項的Text屬性為Bindable,Display Bindable,Default Bindable,和Request Edit。然後點Refresh按鈕刷新類型庫,最後選Run | Register ActiveX Server註冊ActiveX控制項。 再引入新的EditX ActiveX控件,就會發現它確實實現了資料綁定的功能,下面就是一個使用了資料明了的EditX的程式的運行示意圖1.17,(Delphi的ActiveX資料明了功能的實現的確簡單很COOL ,不是嗎?