4. 編碼
下面我們要完成的就是界面設計、編碼工作。在工程視圖中雙擊WinForm.pas打開窗體編輯器。ECO Application Wizard已經創建了一個ReferenceHandle組件rhRoot和多個Extender組件。Extender組件保留其默認屬性即可,如果將其刪除用戶界面中的控件將無法和ECO關聯。設置rhRoot的EcoSpaceType 為 "EcoCRMEcoSpace.TEcoCRMEcoSpace",如果在EcoSpaceType屬性下拉列表中沒有選項,可重新編譯一下工程。
在界面上放置6個DataGrid,分別將其重命名為dgPersons、dgCompanys、dgCompanyCars、dgPersonCarSells、dgCompanyCars、dgPersonCars,為使界面更清晰可以分別設定一下DataGrid的CaptionText。並且在每個DataGrid上放置兩個按鈕,其Text分別為"添加"、"刪除"。完成界面設計為如下樣式。
用戶界面中的組件需要和ExpressionHandle相連接才能顯示感知對象實例。在這裡ExpressionHandle與Delphi中Dateset的概念很類似,它是一組數據的集合。向窗體編輯器中新添加一個ExpressionHandle,設置其Name屬性為ehCompanys,其RootHandle屬性為rhRoot,雙擊Expression打開OCL Expression編輯器。OCL Expression編輯器很類似於我們以前用的SQL編輯器,不過它使用的是OCL語法,在系統發布運行後ECO會根據不同的數據庫平台將OCL翻譯成相應的SQL進行執行。在OCL Expression編輯器中輸入"Company.allInstances",它的含義是取得Company的所有對象實例,我們可以將它等效理解為SQL語句中的" Select * from Company"。
同樣我們為其他的幾個類建立對應的ExpressionHandle,它們的名字分別為ehPersons、ehCompanyCarSells、ehPersonCarSells、ehCompanyCars、ehPersonCars。為實現主子表關聯關系我們還需要CurrencyManagerHandle組件,添加一個CurrencyManagerHandle組件到設計器中,將其重命名為cmhCompany,設定其RootHandle屬性為主對象ehCompany,其BindContext 屬性為顯示Company列表的dgCompanys。
CurrencyManagerHandle組件的Element屬性即表示對象集中的當前元素,它是根據BindContext屬性來進行判斷當前元素的。我們如果想要使ehCompanyCarSells與Company建立主子關聯關系則需要設置ehCompanyCarSells的RootHandle屬性為cmhCompany,Expression屬性為"self.CarSell"。建立其他需要進行主子表關聯的CurrencyManagerHandle,它們分別是cmhPerson、ehCompanyCarSells、ehPersonCarSells、ehCompanyCars、ehPersonCars。其屬性與cmhCompany類似。
主要組件屬性為:
ehPersons.Expression := 'Person.allInstances';
ehPersons.RootHandle := Self.rhRoot;
ehCompanyCars.Expression := 'self.Car';
ehCompanyCars.RootHandle := Self.cmhCompanyCarSell;
cmhCompanyCarSell.BindingContext := Self.dgCompanyCarSells;
cmhCompanyCarSell.RootHandle := Self.ehCompanyCarSells;
ehCompanyCarSells.Expression := 'self.CarSell';
ehCompanyCarSells.RootHandle := Self.cmhCompany;
cmhCompany.BindingContext := Self.dgCompanys;
cmhCompany.RootHandle := Self.ehCompanys;
ehCompanys.Expression := 'Company.allInstances';
ehCompanys.RootHandle := Self.rhRoot;
ehPersonCarSells.Expression := 'self.CarSell';
ehPersonCarSells.RootHandle := Self.cmhPerson;
cmhPerson.BindingContext := Self.dgPersons;
cmhPerson.RootHandle := Self.ehPersons;
ehPersonCars.Expression := 'self.Car';
ehPersonCars.RootHandle := Self.cmhPersonCarSell;
cmhPersonCarSell.BindingContext := Self.dgPersonCarSells;
cmhPersonCarSell.RootHandle := Self.ehPersonCarSells;