請問大型專案的佈局 |
尚未結案
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
各位好,手頭上維護的大型專案,三百多個資料表,每個 Dll 用一個資料夾,細數一下,有兩百九十多個 dll,由主程式呼叫各個 dll,另外還有十幾個補助的 .exe,公司考慮到以後要昇級到 Win7,程式如果要全部重寫的話,我覺得有些麻煩的地方。
專案必須使用 MDI 多視窗,一次要能夠打開多個 dll 成為子視窗,而 dll 成為 MDI 的子視窗,有時候會有異常。主機有三台,分屬不同分公司,有時候想同時看兩家公司的資料,同一支 dll 打開兩次之後,第一支 dll 的連線會變成跟第二支 dll 相同,dll 共用特性真的很困擾。如果把子視窗全部換成一般的 MDI 子視窗,那麼主程式會變成很大很大,搞不定有 200 mb 以上,每次編譯會等很久。 不知道各位有沒有大型專案使用多視窗 MDI 的經驗?請分享一下。 |
Victor4022
中階會員 發表:0 回覆:76 積分:90 註冊:2011-02-20 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
Victor 大,沒錯,連線的 DataModule 是 TDM,Delphi 預設指標變數 DM,全部 dll 都引用到,也都使用 DM 裡面的 TAdoConnection 和TAdoDataSet,同一支 dll 打開兩次,連線會以最後打開那一次為準。專案原先是別人寫的,我接下來改,dll 多少沒關係,因為不打算修改,考慮用最新版的 Delphi 重新撰寫,不然以後追不上新版的作業系統。現在最大的問題是,用 dll 裝成 MDI 裡面的子視窗,執行時,FormCreate、FormShow 等初始化事件,執行順序跟一般 Form 不同,FormShow 還會出現兩次,真頭痛,害我的初始化程式碼執行順序錯亂,如果子視窗都改用一般 TForm,那麼,所有的 TForm 都要和主程式包在一起,最終編譯出來的 .exe 會很大很大,會造成編譯時間太久,更版也會很困擾。
===================引 用 Victor4022 文 章=================== 聽起來應該是dll視窗資源共用的問題困擾您 您能否稍加說明主程式開啟同一支dll時 需要做哪些初始化動作?? 例如: 建立連線的變數 (TSocket) PS. 小弟擔心的是您的連線資源是不管同支dll建立幾個form都共用同一個, 這個是實作架構上的缺陷, 290多個dll如果都是這麼設計的確會很頭疼. |
Victor4022
中階會員 發表:0 回覆:76 積分:90 註冊:2011-02-20 發送簡訊給我 |
您好, 關於 MDI 與 SDI 的部份, 有些經驗可供您參考:
1. 早先接觸到MDI架設的專案, TForm class大概不到20 個, 但是編譯出來的執行檔居然快20 MB, 後來看前人的寫法, 發現很多UI用到的image (可能是背景image/ 像給 TLMDMMButton用的多狀態圖示)都是各自獨立的, 也就是每個 TForm都有相同的TImage與TImageList, 後來我把它們全部放到 MDI form, 其餘的MDI Child則引用MDI form裡面的圖, 這樣編出來的執行檔縮小到只剩3~4 MB. 2. 維護的產品也有SDI 的架構, TForm class也超過200個, 但編出來的可執行檔只有20幾MB, 我覺得MDI 與 SDI 架構本身應該不會造成大size執行檔, 通常是resource造成檔案膨脹, 像圖檔/ 字串檔/ user manual (現在產品會包入user manual的不多了)/ 報表檔/ 獨立輔助程式/ 自己寫的dll才是主要造成檔案變大的原因. 3. 維護的 MDI 產品, TForm class 目前沒超過100個, 架構是: - MDI Form : 當主form, 共用的TImageList, TADOConnection, TSaveDialog, TOpenDialog 都放此 - MDI Child : 各自表單有拉出各自的TADOQuery / TADOTable/ TDataSource, 將它們的Connection或 ConnectionString指像 MDI Form的TADOConnection, UI上所需用到的Image也引用MDI Form - MDI Form上方可加入TToolBar或TMainMenu等進入點, 當點選到功能才動態Create 對應功能的TForm class 希望以上資訊對您有幫助. PS. 您打算用新版Delphi 開發, 小弟再多問一個問題...原專案的程式碼您是用哪一個版本開發的?? 如果是Delphi 2009以下開發的, 重構時因為會參考原程式架設與寫法, 要注意 Unicdoe 帶來的便利與困擾喔!! 很多PChar的寫法都要檢視...T-SQL 的 SELECT (where條件)/ INSERT VALUE 與 UPDATE VALUE也要需要注意... (不過這又是另外一個議題...) |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
Victor大大,您好,您的回覆很詳細,謝謝。我這個專案是用 Delphi 2006 .net 寫的,本來就是 Unicode,不會用重構的方式昇級,而是參考原來的程式碼重新撰寫,雖然程式碼很多,但是沒辦法,Delphi.net 的致命傷,Memo 欄位一定要用 Persistent Field,不可以用 Dynamic Field,這一點已經讓我們公司花了大量時間去處每一個 dll 的每一個 Form 裡面的每一個 TAdoDataSet 裡面的每一個 Memo 欄位,簡直是惡夢一場,有時候 Sql 是下 select * ,根本不曉得裡面含有 Memo 欄位,一讀取這個欄位,程式執行就馬上出錯,Debug 時,每次出錯的位置都不相同,找不到錯在哪裡,最後回憶起 "是不是有 Memo" ?才恍然大悟,不是事先建立 Persistent Field,就是把 DataSet 關閉,建立 Persistent Field 後再 DataSet.Open,同一道 Sql 執行兩次,才要到資料,.net 寫取資料庫的速度也是比 Win32 慢很多,同樣多的資料,實測 Win32 只需要 1/4 的時間,就可以讀取完畢,常被客戶嫌程式執行太慢,所以,才考慮丟掉 Delphi.net 的程式,全部重寫。
最大問題在於,專案真的很大,290 個 dll,主力的幾個 dll,每一個還包含幾十個 TForm,小一點的 dll 一定都再呼叫其他 TForm,所有 dll 改成 MdiChild 包在一支 MDI 程式裡面,編譯速度太慢了,我常常編譯一支 Win32 的輔助 .exe 執表程式,修改 -> 編譯 -> 執行,一分鐘之內做十幾次,有時候五秒鐘做了三次,編輯速度太慢,三個月能完成的東西,會慢成半年。打散成 dll,又有 dll 共用資料的衝突,程式還有一個要求,任何一個 dll 都可以呼叫另一個 dll 並叫出特定的單號,dll 打開後,會自動讀取指定的單號,例如,打單過程中,打開客戶資料的 dll,對指定自動讀取某某客戶編號的資料。 不知道各位的大型專案,是怎麼佈局的?SDI 還是 MDI? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |