全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1695
推到 Plurk!
推到 Facebook!

請問大型專案的佈局

尚未結案
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-03-01 11:38:22 IP:211.75.xxx.xxx 訂閱
各位好,手頭上維護的大型專案,三百多個資料表,每個 Dll 用一個資料夾,細數一下,有兩百九十多個 dll,由主程式呼叫各個 dll,另外還有十幾個補助的 .exe,公司考慮到以後要昇級到 Win7,程式如果要全部重寫的話,我覺得有些麻煩的地方。
專案必須使用 MDI 多視窗,一次要能夠打開多個 dll 成為子視窗,而 dll 成為 MDI 的子視窗,有時候會有異常。主機有三台,分屬不同分公司,有時候想同時看兩家公司的資料,同一支 dll 打開兩次之後,第一支 dll 的連線會變成跟第二支 dll 相同,dll 共用特性真的很困擾。如果把子視窗全部換成一般的 MDI 子視窗,那麼主程式會變成很大很大,搞不定有 200 mb 以上,每次編譯會等很久。
不知道各位有沒有大型專案使用多視窗 MDI 的經驗?請分享一下。
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-03-01 12:29:58 IP:210.68.xxx.xxx 訂閱
聽起來應該是dll視窗資源共用的問題困擾您
您能否稍加說明主程式開啟同一支dll時 需要做哪些初始化動作? 例如: 建立連線的變數 (TSocket)

PS. 小弟擔心的是您的連線資源是不管同支dll建立幾個form都共用同一個, 這個是實作架構上的缺陷, 290多個dll如果都是這麼設計的確會很頭疼.
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-03-01 14:41:22 IP:211.75.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-03-01 22:38:03 IP:122.126.xxx.xxx 訂閱
您好, 關於 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-03-02 11:36:57 IP:211.75.xxx.xxx 訂閱
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?
系統時間:2017-10-21 7:36:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!