關於kbmMW SmartBinding,我翻譯了作者寫的幾篇文章,其強大的綁定機制,將可視控制與各種數據源靈活綁定在一起,實現了類似DBEdit數據敏感控件的效果,可以及大的減少我們的代碼,實現界面與邏輯分離的代碼設計,從而實現易於維護與管理的代碼,怎一個爽字了得。如果不了解kbmMW SmartBinding,可以參看譯過的文章。
kbmMW SmartBinding如此強大,那么他是如何實現及工作的呢?讓我們一起走進kbmMW SmartBinding的源代碼,欣賞kbmMW作者的實現。
通過前文,我們知道,要進行綁定首先要引用kbmMWSmartBind單元,然后使用全局對象Binding進行綁定操作:
Binding.Bind(Edit1,'Text',Text1,'Text');
上面這行代碼,將一個Edit控件綁定到一個Text控件上,當我們在Edit中輸入內容時,會自動更新Text對象顯示的內容。
bnd:= Binding.Bind(dm.mt,'f1',stringGrid1,'#1'); Binding.Bind(dm.mt,'f2',stringGrid1,'#2'); Binding.Bind(dm.mt,'@',StringGrid1,'@',[mwboTwoWay]);
上面這三行代碼,將數據集mt中的字段與StringGrid對象進行綁定,實現類似DBGrid顯示數據集的效果。
現在把Binding對象作為切入點,來看看是什么情況?
var Binding:TkbmMWBindings;
上面的代碼,聲明了Binding對象,原來他是TkbmmWBindings類型。Binding對象在kbmMWSmartBind單元中作為全局對象聲明,並且在Initialization部分自動建立,所以當我們引用了kbmMWSmartBind單元,就可以直接使用Binding對象!
接下來,我們繼續查看TkbmmWBindings的實現代碼。
第一個方法是Create方法,在這個方法中,初始化很多內部對象,其中有一個FScheduler對象,是我非常熟悉的TkbmMWScheduler類型的對象,並且通過該對象建立一個調度事件FUpdateEvent,該事件,每100毫秒調用一次Update方法。看到這里讓我明白,原來TkbmMWBindings就是用一個調度對象FScheduler實現數據源與可視控件的同步,具體的同步邏輯,在Update方法中實現。默認情況下是100毫秒執行一次同步,可以通過屬性UpdateFrequency來修改這個時長。
接下來,我們看一下這個Update方法如何實現的同步數據源與目標控件?在這個方法中,基於兩個列表對象FNonSyncList、FSyncList執行的更新,這里同樣用FScheduler.Run執行的,即開啟新的線程執行的同步方法,換句話說,當FNonSyncList對象中有內容,則用線程執行UpdateNonSync方法,當FSyncList對象中有內容,則用線程執行UpdateSync方法,UpdateSync方法在主線程中執行的。說到這里,我明白了為什么要用兩個列表對象FNonSyncList、FSyncList,原來一個是在線程中更新的列表,另一個是在主線程中更新的列表。當然了,你也會明白,我們通過Binding.Bind方法綁定的內容,都會存到FNonSyncList或FSyncList中。
Update方法先說到這里,接下來我們看看Bind方法,是如何實現的邏輯?
Binding.Bind(Edit1,'Text',Text1,'Text');
我們跟蹤上面這個調用,會調用這個方法:
function TkbmMWBindings.Bind(const ASource:TValue; const ASourceMember:string; const ADestination:TValue; const ADestinationMember:string; const AOptions:TkbmMWBindingOptions = []):IkbmMWBinding;
這個方法中,根據參數列表,會建立一個TkbmMWBinding對象,再通過內部方法InternalBind把這個對象加到FNonSyncList或FSyncList中。當數據源或目標控件是從TControl繼承來的,則填加到FSyncList中,否則填到FNonSyncList中。
讀到這里,我們清楚了一個邏輯,那就是TkbmMWBindings用FNonSyncList及FSyncList這兩個列表對象來管理TkbmMWBinding對象,我們定義的每一個綁定都被建成一個TkbmMWBinding對象。然后呢,用FScheduler每100毫秒調用Update來同步每個綁定對象。
暫時可以告一段落,有時間再繼續寫更詳細的內容,我們知道上面的原理,在項目中使用SmartBinding還是有幫助的。
