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

在Package內如何使用MainForm的變數

答題得分者是:sryang
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-25 11:04:34 IP:218.164.xxx.xxx 未訂閱
最近剛使用Package的方式在撰寫程式, 參考了站內關於Package的說明, 仍無法參透關於共用變數的使用. 假設在MainForm內宣告了變數,欲供Package使用, 請教各位先進, 該如何宣告?又該如何在Package內存取?
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-25 13:47:44 IP:61.219.xxx.xxx 未訂閱
1. uses Forms unit. 2. Application.MainForm.FindComponent('[ComponentName]')... /* Free 和 Create 一樣重要 */
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-25 20:43:52 IP:218.164.xxx.xxx 未訂閱
引言: 1. uses Forms unit. 2. Application.MainForm.FindComponent('[ComponentName]')... /* Free 和 Create 一樣重要 */
sorry,這麼久才回應, 想請教一下,FindComonent()應該是用來找元件的吧, 我是想存取字串變數的. 還請再指導!
sryang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-25 22:25:09 IP:61.224.xxx.xxx 未訂閱
這樣的話,我建議你使用另一個 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-25 23:12:02 IP:218.164.xxx.xxx 未訂閱
Hi, sryang 您好: 參考您的建議後, 假設在Package1內uses unUtility, 則編譯時會產生imported into package的錯誤, 您曾遇過嗎?
sryang
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-26 11:27:41 IP:202.3.xxx.xxx 未訂閱
當然遇過,目前我們公司的所有系統都是用這種方式開發的 這個 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-26 13:38:26 IP:218.164.xxx.xxx 未訂閱
按照 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-26 18:34:52 IP:202.3.xxx.xxx 未訂閱
我寫了測試程式,結果都 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-26 18:58:25 IP:218.164.xxx.xxx 未訂閱
Hi, sryang 您好: 我發現到了差異, implementation {$R *.DFM} uses unUtility, Unit2; 我並未將子功能的Package在此處uses進來, 而是使用LoadPackage(), 兩者有不同之處嗎? 非要使用您的方法才行嗎? 只想弄清楚真相而已!! 新手上路!!加油中...
sryang
尊榮會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-26 20:39:46 IP:61.224.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-26 21:32:23 IP:218.164.xxx.xxx 未訂閱
非常感謝sryang先進的指導, 受益良多. 還望下次不吝指導!! 新手上路!!加油中...
系統時間:2024-05-13 11:33:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!