在Package內如何使用MainForm的變數 |
答題得分者是:sryang
|
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
這樣的話,我建議你使用另一個 package 裡的某個 unit 來宣告共用變數
不要使用 main form,否則可能會造成循環參照 例如這個 package 叫做 pkUtility,裡面包含一個 unit 叫做 unUtility
main form 以及每一個 package 所含的 unit 都去 uses unUtility
每一個 package 就會 requires pkUtility 再建議你用 project group 來管理這些 package 以及包含 main form 的project,並且設定 compile 順序為 pkUtility 最先,project 第二,然後是其他 package (在 project group 所包含的項目上按滑鼠右鍵,選擇"Build Sooner" 或 "Build Later" 可以調整順序)
這樣就可以用 "Compile All Projects" 及 "Build All Projects" 來一次 build 整個專案了 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
當然遇過,目前我們公司的所有系統都是用這種方式開發的
這個 warning 的原因是你的 package 需要 requires pkUtility
但是並沒有加入 requires 所以 compiler 就 "implicitly import" (隱含式的加入)
如果有兩個 package 都有這種情況時,當 package A 載入後,package B 就會載入失敗,反之亦然
所以要在每個 uses unUtility 的 package 加上 requires pkUtility
方法如下:
1. 開啟 package
2. 點選 "Requires"
3. 按 "Add" 按鈕,然後按 "Browse"
4. 找到 pkUtility.dcp (如果你沒有修改過 pkUtility 的 DCP Output Directory 的話,會在 Delphi/Projects/bpl)
5. 開啟
6. 按 "OK"
這樣 pkUtility 就會加入 requires 清單了
如果嫌這樣麻煩的話,直接修改 package 的 source 也可以 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
按照 sryang先進 的作法後,
警告訊息是没有了,但卻無法取得變數值.
程式碼如下:
unUtility.pas:
unit unUtility
interface
var
string1: string;
implementation
end. 在MainForm.pas的FormCreate事件中使用以下語法指定其值,
unUtility.string1:='test'; 在Package1中以
ShowMessage( unUtility.string1 );
來測試但却無法顯示設定值. 整個的設定方式,皆有按照指導來設定了,
這個部份煩請指導. Sorry!!新手上路,特別煩人喔!
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
我寫了測試程式,結果都 OK,po 出來給你參考
Project1.dpr 包含 Unit1.pas
pkUtility.dpk 包含 unUtility.pas
Package1.dpk 包含 Unit2.pas 且 requires pkUtility Unit1.pas:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} uses unUtility, Unit2; procedure TForm1.Button1Click(Sender: TObject); begin if Application.FindComponent('Form2') = nil then Application.CreateForm(TForm2, Form2); Form2.Show; end; procedure TForm1.FormCreate(Sender: TObject); begin unUtility.String1 := 'AAA'; end; end.Unit2.pas: unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Edit1: TEdit; procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.DFM} uses unUtility; procedure TForm2.FormActivate(Sender: TObject); begin Edit1.Text := unUtility.String1; end; end.unUtility.pas: unit unUtility; interface var String1: string; implementation end.加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
引言: Hi, sryang 您好: 我發現到了差異, implementation {$R *.DFM} uses unUtility, Unit2; 我並未將子功能的Package在此處uses進來, 而是使用LoadPackage(), 兩者有不同之處嗎? 非要使用您的方法才行嗎? 只想弄清楚真相而已!! 新手上路!!加油中...那麼,你是否在 Main form 與 package 中都 load 一次呢? 這樣可不行喔,這會導致 Main form 存取到的與 package 中存取到的是兩個不同的 instance 如果是存放公用變數的最好是用 uses 的比較方便,而且這個 package 會自動 load 進來 LoadPackage 適用於要依照客戶的需要掛入各種功能 深度歷險有一個元件,叫做 DynamicMenu,可以依照資料庫的設定動態產生主功能表以及幫我們 LoadPackage,配合 package 來使用非常方便 在這裡下載:http://www.vclxx.org/DELPHI/D32FREE/DMENU.ZIP 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
chiag
一般會員 發表:14 回覆:38 積分:10 註冊:2002-10-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |