強大的數據庫開發功能無疑是Delphi王冠上的明珠至少有%以上的人每天使用Delphi來開發數據庫程序基於積木式的VCL數據庫控件以及Dev Express和WollWoll等公司提供的強大的第三方數據庫明了控件毫不誇張的說只需要簡單的設置一下屬性拖拉幾下鼠標我們就可以非常快速的完成數據庫程序的開發由於Delphi的數據庫功能過於強大了所以很多人就忽視了一個事實就是ActiveX同樣可以提供靈活的數據庫綁定遺憾的是Delphi本身所提供的幾個第三方的ActiveX控件中沒有一個是數據庫明了的控件這間接導致了一個誤解使得很多人誤以為Delphi並不支持數據明了的ActiveX控件(也包括很久以前的我J)這當然是錯誤的看法
在Delphi中使用數據明了的ActiveX控件
在下面的例子中我們將使用隨Office 安裝到系統中的Microsoft Calendar 控件來進行演示它就是一個數據明了控件選擇Component | Import ActiveX Control選擇Microsoft Calendar (見下圖)把類名從TCalendar改成TAXCalendar以避免同系統中原有的同名控件沖突然後點Install按鈕安裝此控件
圖
新建一個程序在窗體上放置一個TAXCalendar控件再放上一個DataSource 和Table控件設定DataSource的Dataset為Table然後設定Table的DataBaseName 屬性為DBDEMOSTableName 屬性為EMPLOYEEDB最後設定TableActive屬性為True
接下來就該進行數據庫綁定了注意一下引入的TAXCalendar具有DataSource和DataBindings這兩個同一般ActiveX控件不同的屬性這是因為ActiveX Import Wizard在引入ActiveX控件先判斷是否是數據庫明了的控件如果是就以TDBOleControl作為基類進行繼承如果不是就從TOleControl開始繼承而TDBOleControl實現了DataBindings和DataSource屬性設定AXCalendarDataSource屬性為Datasource
這時我們在窗體上用鼠標右鍵單擊TAXCalendar控件的話會發現在右鍵菜單中多出了一個DataBindings…菜單項(見下圖)
圖
點擊菜單項後會顯示數據綁定屬性編輯框(見下圖)分別在FieldName列表框中選定HireDate在Property Name列表框中選擇Value()(其中是Value的Dispid號)點擊Bind按鈕就會在數據庫字段和Value屬性間建立數據關聯
圖
最後再在窗體上放置一個DBGrid和DBNavigator控件並設定它們的DataSource為DataSource運行程序移動當前數據位置的時候你可以注意到ActiveX的日期顯示也會隨之變化同數據庫中的Hiredate保持一致如圖所示
圖
創建數據明了的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屬性頁(見下圖)
圖
注意在Flags屬性頁有很多多選框對於我們來說只關心同數據綁定相關的選項它們是BindableDisplay BindableDefault BindableImmediate Bindable和Request Edit選項
標記一個屬性為bindable後並將其同數據庫字段綁定後當用戶修改了屬性後控件就會通知數據庫值已經變化並請求數據庫記錄更新狀況數據庫反過來也會通知記錄更新是否成功
Bindable選項表明屬性支持數據綁定如果把屬性標記為bindable屬性將在其值變化時通知其容器
Request Edit表明屬性支持OnRequestEdit 通知消息這允許控件詢問容器屬性值是否允許用戶修改
Display Bindable表示容器可以向用戶顯示這個屬性是可綁定的
Default Bindable表示它是唯一的缺省的可綁定屬性使用它必須同時標記了Bindable屬性
Immediate Bindable當被標記時所有的改變都會被通知同時還需要設定bindable和Request Edit標記
下面我們就標記EditX控件的Text屬性為BindableDisplay BindableDefault Bindable和Request Edit然後點Refresh按鈕刷新類型庫最後選Run | Register ActiveX Server注冊ActiveX控件
再引入新的EditX ActiveX控件就會發現它確實實現了數據綁定的功能下面就是一個使用了數據明了的EditX的程序的運行示意圖(Delphi的ActiveX數據明了功能的實現的確簡單很COOL不是嗎?
圖
From:http://tw.wingwit.com/Article/program/Delphi/201311/24662.html