線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2187
推到 Plurk!
推到 Facebook!

兩個 Package 不能使用相同的 unit 嗎?

答題得分者是:sryang
cancer
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-05-14 16:54:52 IP:220.128.xxx.xxx 未訂閱
大家好,看過幾個網站教學,都說同一支程式裡面的兩個 Package 不能使用相同的 Unit,真的嗎?程式中很多單元都是共用的,例如數學運算,不可能每一個 Package 都寫相同的運式程式,一定是寫在某個單元,所有 Package 都使用這個單元,如果單元不能被多個 Packge 使用,那 Package 有甚麼實用價值!
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-05-14 22:33:56 IP:202.39.xxx.xxx 訂閱
一個 Project 可以同時使用多個 Package, 而每個 Package 也可以同時使用到多個其它的 Package (只要不要 A 要用到 B, 而 B 又要用到 A 等互咬的情況即可),
故同一個 Unit, 如無特殊目的或限制, 應沒必要同時 Link 進多個 Package !
若真有此必要, 那麼就做成不同名稱而內容完全相同的多個 Unit 吧!
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-05-15 17:41:39 IP:114.35.xxx.xxx 訂閱
兩個 package 不能使用同一個 unit,不然會互相衝突,無法同時 LoadPackage

這種跨 package 共用的 unit 要獨立封裝成一個 package,讓要使用的 package 來引用 (Required)

package 編譯之後,會產生 .DCP 檔,這個檔就是要給其他 package 引用的
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2013-05-15 17:47:48, 註解 無‧
cancer
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-05-20 09:58:24 IP:220.128.xxx.xxx 未訂閱

===================引 用 herbert2 文 章===================
一個 Project 可以同時使用多個 Package, 而每個 Package 也可以同時使用到多個其它的 Package (只要不要 A 要用到 B, 而 B 又要用到 A 等互咬的情況即可),
故同一個 Unit, 如無特殊目的或限制, 應沒必要同時 Link 進多個 Package !
若真有此必要, 那麼就做成不同名稱而內容完全相同的多個 Unit 吧!

--------------
大大提到的這一種,是一般的循環引用問題,在最上方的 uses 不能互相引用,Package 或非 Package,規則都一樣。
我講的是例如,PackageA 和 PackageB 都引用 UnitA,這樣就已經不行了。
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-05-20 10:20:52 IP:211.79.xxx.xxx 訂閱
我之前的回覆,有一些錯誤,應該是兩個 package 不可以 contains 同一個 unit
uses 同一個 unit 是可以的
不過這個共用的 unit 要獨立一個 package,引用這個 unit 的 package 都不要 contains 這個 unit,而是 require 包含這個 unit 的 package
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
cancer
高階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-05-20 10:31:56 IP:220.128.xxx.xxx 未訂閱
大大,你是說不能使用 uses,改用 require 就可以?
我們公司的 ERP 是別人用 Delphi.net 2006 開發的,我來維護,XP 跑 Ok,但安裝在 Win7 後不能跑,後來 Service pack 1 更新後,又可以跑,而最近測過 Win8,主程式不能跑,但週邊的工具程式可以跑,Delphi 2006 Win32 寫的程式也都可以跑,主程式有呼叫 .net dll,就差在這裡可以,主程式一載入,畫面還沒出來就出現錯誤訊息,大概是載入錯誤之類的。一直在想,如果以後作業系統要升級怎麼辦?整個 ERP 都不能跑,或反過來說,因要跑 ERP 的關係,作業系統永遠都要用 XP 不能升級,因新版 Delphi 已無 .net 這種東西,頭大了。
最近想了一下,乾脆把整個 ERP 用新版的 Delphi 重寫算了。ERP 是 MDI 結構,各個 dll 都是獨立的,我不曉得現在的專案都用甚麼架構,但我們公司只能接受 MDI,其他的都不用想了,其實也對,員工在一個畫面輸入,還沒存檔,然後他要查基本資料,不可能要求他先關掉現在的畫面才讓他打開基本資料,或者員工做帳單,她同時也要看出貨單,兩個畫面不能同時打開的話,這種 ERP 沒有人要用,那些甚麼新的瀏覽器使用 Tabbed Page 引用廣泛注目,Tabbed Page 根本就是舊東西,只是之前都沒用在瀏覽器而已,我們的 ERP 有兩百多個 dll,用 Tabbed Page 呈現,PageControl 會有兩百多個 TabSheet,而最大的限制在於 Tabbed Page 的各個畫面都一定是同一支程式裡面,程式的 Size 會很大很大,大型程式,MDI 是唯一的選擇,而且不能用一般 Mdi Child 子視窗,因為它們也必須是主程式的一部份,Size 問題跟 Tabbed Page 相同,所以大型程式唯一的路就是 Mdi Child 以 Package 來寫的 MDI 程式,由 MDI 主程式視需要載入各個 Mdi Child。
為了改寫整套 ERP 系統,我訪查了 about 網頁,找到教學範例,已經可以寫出這樣的測試程式,其中有提到,應該有一個 Mdi Child 的基礎類別,而各個 Mdi Child 繼承這個類別,由基礎類別統一處理相同的工作,例如把登入者 ID 傳給 Mdi Child,或詢問 Mdi Child 是否能關閉。因此需要一個 TBaseChildForm 的基礎類別,由主程式和各個 Mdi Child 引用。我看過其他網頁說多個 Package 不能引用相同的單元,如果各個 Mdi Child 不能引用同一個單元檔,就沒有辦法繼承相同的基礎類別,我只寫了一個 Mdi Child 而已,主程式和 Mdi Child 引用基礎類別所在的單元,是 OK 可以執行的,還沒寫第二個 Mdi Child,如果也引用相同的單元檔,會出錯嗎?還沒試。
不知道誰有這種 Mdi Main 加 Mdi Child 以 Package 開發的好範例或參考資料?
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-05-20 11:43:22 IP:221.120.xxx.xxx 訂閱
我前公司使用 MDI Form + MDI Child + Package 這種架構超過 10 年了

重點就是要把 Package 分階層,要區分出共用的 Package 與功能的 Package

共用的 Package 裡面包含的 unit,所有的 Package 以及主程式的 Project 統統不可以「Contains」,但是可以 uses

使用共用 Package 裡面的 unit,就照常 uses,只是要把共用的 Package 編譯出來的 .DCP 檔加入「Requires」

主程式需要設定為「build with runtime package」也需要把共用 package 的名稱加入 runtime package 的列表中


看圖就很清楚了

Package 關係圖
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2013-05-20 11:51:50, 註解 無‧
cancer
高階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-05-21 15:29:38 IP:220.128.xxx.xxx 未訂閱
sryang 大,有圖比較好了解,原來 require 另一個 Package 之後,等於有了 Contain 的效果,可以 uses 該 Package 裡面的任何一個 unit.
兩個 Packages 不能 Contains 相同的 Unit,平常都沒注意,剛才把專案拿出來看,為什麼我手頭上的專案可以?兩個 Package 的 Project manager 列 出了 Contains 列表,其中一些是相同的單元,兩支 Package 都可以被 Mdi 父視窗呼叫並同時顯示出來,該不會新版的 Delphi 解除了這個限制?
我把兩個 Project manager 的圖做起來,都找不到可以上傳圖片的按鈕,請問要怎麼上傳圖片?
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2013-05-21 15:41:15 IP:114.35.xxx.xxx 訂閱
因為我前公司從 Delphi 5 時代就開始這樣用了,可能是 D5 的限制吧,有沒有放寬不曉得,到後來也是習慣動作了

上傳圖片要先到「發表文章中的圖檔存放區」發文並上傳圖片,然後再把超連結複製起來,用「插入/編輯影像」把圖貼進去
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
cancer
高階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2013-05-21 17:49:36 IP:220.128.xxx.xxx 未訂閱
大大,剛才試過 Delphi 2006 Win32 版本,兩個 MdiChild 的 Package Contain 相同的單元,父視窗載入第一個 MdiChild 是 OK 的,但試圖載入另一個 MdiChild 時,真的會出錯,Delphi 報告 "兩個 Package 不能 Contain 相同的單元",真麻煩,這樣必須把共用單元放在獨立的 Package。Delphi 2006 Win32 和 Delphi 2006 .net,兩者處理方式都不一樣,Delphi 2006 .net 允計兩個 Package Contain 相同的單元,比較方便,可能 Delphi.net 已不是單純的 Delphi,編譯出來的副檔名是 .dll,不是 package.
cancer
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2013-05-21 18:03:04 IP:220.128.xxx.xxx 未訂閱
sryang 大,我已把 TBaseChildForm 獨立成一個 BasePackage,並編譯過,MidChild 的 Package 要 require BasePackage,但檔案副檔名求 .dcp,但 BasePackage 編輯後並沒有副檔名是 .dcp 的檔案,請問該怎麼 require BasePackage?
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2013-05-21 18:42:57 IP:114.35.xxx.xxx 訂閱
Package 編譯出來,會有一個 .BPL 跟一個 .DCP
可能會因為 Project Options 的關係,使得 .DCP 檔產生的路徑不如你的預期
請檢查一下 Project Options 與 Environment Options 的設定,再去那些目錄找找看,應該會有 .DCP 檔的

以 D5 來舉例,Project Options 的畫面如下,紅框處就是 DCP 的產生路徑,預設是空白的


如果留空白,就會走 Environment Options 裡面的設定,如紅框處


而 Delphi XE 設定的地方也差不多,這是 Delphi XE Project Options 的視窗,一樣有 DCP output directory


這個則是 Delphi XE Options 的設定視窗,一樣有 DCP output directory 的設定

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
cancer
高階會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2013-05-22 10:38:11 IP:220.128.xxx.xxx 未訂閱
謝了,Delphi 2006 找不到 Environment 頁面,只好在 Project Option 設定,Output Directory 空白的話,預設是專案的目錄,但 dcp directory 沒有設的話,表示不要產生 .dcp,我把它填入,再按 Shift F9,就產生了 .dcp 檔。
系統時間:2024-03-29 6:27:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!