针对C++和Delphi的LiveBindings一瞥
綁定表達式(Binding expression)并不是新概念,XAML和Flex開發者主要就依靠這個。但除C++/CX(只用于WinRT編程)之外,原生編程語言中通常見不到這種概念。不過為VCL和FireMonkey設計的LiveBindings卻是個例外。
\u0026#xD;\n我們先來介紹一些背景知識。VCL(Visual Component Library)是Delphi和C++ Builder都支持的老式UI框架。它支持x86和x64模式,但只能運行在Windows操作系統上。FireMonkey在新的應用程序中代替了VCL。它既支持Windows,也支持OS X。FileMonkey和VCL可用于同一應用程序中,不過不能用于同一模塊中。
\u0026#xD;\n據Embarcadero介紹:
\u0026#xD;\n\u0026#xD;\nLiveBindings基于稱作綁定表達式的關系表達式,既可以是單向的,也可以是雙向的。LiveBindings還包括控制對象和源對象。借助綁定表達式,任何對象都可以綁定到其他任何對象,只需要定義包含所要綁定對象的一個或多個屬性的綁定表達式。例如,可以把一個Tedit控件綁定到一個Tlabel,這樣當編輯框中的文本改變時,標簽的標題也會根據綁定表達式計算而得的值自動調整。再舉一個例子,把軌跡條控件綁定到進度條,拖動軌跡條時進度條也可以相應變化。
\u0026#xD;\n\u0026#xD;\n和很多Delphi/C++ Builder工具類似,LiveBindings通常使用GUI工具創建。這里有兩種選擇:LiveBindings Designer和LiveBindings Wizard。這無疑會讓習慣于手工編輯XAML或Flex的綁定表達式的開發者不爽。
\u0026#xD;\n請注意,以編程方式編輯綁定是可能的,但強烈建議不要這么做。這方面的文檔深埋在一個關于控制臺應用的教程中。
\u0026#xD;\n與.NET中要求對象實現某些復雜的設計模式不同,Delphi和C++ Builder中的對象默認就是可綁定的。幾乎和所有對象一樣,只需要繼承TObject,然后像正常情況一樣暴露出屬性。對C++ Builder而言,這意味著要使用__property擴展關鍵字。
\u0026#xD;\n實際應用綁定表達式的代碼非常繁瑣,不過確實能支持復雜表達式。在下面的例子中,我們可以看到表達式“o1.IntegerValue + o2.IntegerValue”被綁定到了MyResultObject.IntegerValue屬性。
\u0026#xD;\n\u0026#xD;\n在XAML技術中,綁定表達式是基于事件的。為避免內存泄漏,它們在內部使用了一個“弱事件(weak events)”結構來監控需要通過綁定表達式轉發(relay) 的PropertyChanged事件。該結構要求所有綁定集中注冊,不過事實上大多數開發者并沒有意識到這一點。
\u0026#xD;\nLiveBindings缺乏屬性變更事件這一概念,因此要進行類似的抽象就不可能了。 雖然Bindings仍然是集中注冊的,但屬性變更時需要顯式通知綁定引擎。這通過Tbindings.Notify函數完成,該函數接受對象和屬性名。
\u0026#xD;\n理論上,TBindings.Notify函數可由屬性setter調用,而無需客戶端代碼顯式調用。雖然文檔沒有介紹,但這又帶來了多線程相關問題,不過確實消除了對弱事件的需求。
\u0026#xD;\n參考英文原文:A Look at LiveBindings for C++ and Delphi
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的针对C++和Delphi的LiveBindings一瞥的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利宣布将推出多款中高端新能源汽车,包括
- 下一篇: OPPO Find X6 标准版屏幕规格