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

關於Package :: 可以跨Package控制元件或變數嗎?

 
s8954126
一般會員


發表:2
回覆:3
積分:1
註冊:2002-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-09 16:33:38 IP:61.219.xxx.xxx 未訂閱
假設:: Package1裡包含Unit1.Pas, Package2裡包含Unit2.Pas, 當我在Unit1中的Form1裡LoadPackage('Package2.bpl'), 然後建立Unit2的Form2並顯示,那麼... 在Form2中, 我可以不利用Global變數, 直接取得Form1中的元件內容 (例如:ShowMessage(Form1.Edit1.Text)) 或者是在Form1中宣告的Public變數嗎?
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-09 17:14:18 IP:211.20.xxx.xxx 未訂閱
可以,關於PACKAGE的使用可以參考我發表的文章    http://delphi.ktop.com.tw/loadfile.php?TOPICID=6149211&CC=137529 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
s8954126
一般會員


發表:2
回覆:3
積分:1
註冊:2002-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-12 10:33:59 IP:61.219.xxx.xxx 未訂閱
andersonhsieh,謝謝您的回答. 另外還有一個問題是, 假設我在package2的require中加入package1, 並且在unit2中uses unit1,這樣compile沒問題, 但是當我直接指定元件時, 例如:Form2.Edit1.Text := Form1.Edit1.Text; 就會出現runtime error了, 請問,這樣的用法是不允許的嗎??
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-12 10:50:21 IP:210.200.xxx.xxx 未訂閱
引言: andersonhsieh,謝謝您的回答. 另外還有一個問題是, 假設我在package2的require中加入package1, 並且在unit2中uses unit1,這樣compile沒問題, 但是當我直接指定元件時, 例如:Form2.Edit1.Text := Form1.Edit1.Text; 就會出現runtime error了, 請問,這樣的用法是不允許的嗎??
使用 Delphi Package 有一點要注意, 就是要寫成大概這樣: Form2.Edit1.Text := TForm1(Form1).Edit1.Text; 因為是用 Package 所以 Form1 應該還沒有產生實體, 您要先 Create 才能使用. 發表人 - danny 於 2002/08/12 10:51:12
------
將問題盡快結案也是一種禮貌!
s8954126
一般會員


發表:2
回覆:3
積分:1
註冊:2002-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-12 11:53:56 IP:61.219.xxx.xxx 未訂閱
嗯...不行耶!! 我是由Form1去建立Form2的, 所以Form1和Form2都已經建立了! 不過如您所說, Form2.Edit1.Text := TForm1(Form1).Edit1.Text; 還是會產生RunTime Error耶!!
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-12 13:11:28 IP:211.20.xxx.xxx 未訂閱
可否將你的程式放上來讓我幫你看 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-12 15:02:23 IP:210.200.xxx.xxx 未訂閱
引言: 嗯...不行耶!! 我是由Form1去建立Form2的, 所以Form1和Form2都已經建立了! 不過如您所說, Form2.Edit1.Text := TForm1(Form1).Edit1.Text; 還是會產生RunTime Error耶!!
如果您現在是在 Form2, 要這樣寫: Self.Edit1.Text := TForm1(Form1).Edit1.Text; 或 Edit1.Text := TForm1(Form1).Edit1.Text; 如果您現在是在 Form1, 要這樣寫: TForm2(Form2).Edit1.Text := Self.Edit1.Text; 或 TForm2(Form2).Edit1.Text := Edit1.Text; 當然您要這樣寫也可以: TForm2(Form2).Edit1.Text := TForm1(Form1).Edit1.Text;
------
將問題盡快結案也是一種禮貌!
s8954126
一般會員


發表:2
回覆:3
積分:1
註冊:2002-08-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-08-13 15:54:06 IP:61.219.xxx.xxx 未訂閱
因為Package有些設定,不曉得怎麼詳述,所以,先就程式碼做討論好了... //---------------------------------------------- procedure TFB10Form.Button5Click(Sender: TObject); begin LoadAddinPackage('Package2','Package2.bpl'); ShowModalFormByClassName('TFB10PForm'); end; //---------------------------------------------- 這是一段在Package1中的FB10Form裡,觸發載入Package2的程式, 到這之前應該都沒有問題,我想... 在開啟FB10PForm之後,會有一段如下面的程式... //---------------------------------------------- procedure TFB10PForm.Button1Click(Sender: TObject); //var MyComponent : TComponent; begin // MyComponent := FB10ID.FindComponent('Edit2'); // if MyComponent is TEdit then // Edit2.Text := TEdit(MyComponent).Text; Edit2.Text := TFB10Form(FB10Form).Edit2.Text; end; //---------------------------------------------- 這一段程式碼的目的是到FB10Form去抓Edit2的值, 要注意的是,FB10Form與FB10PForm是分別在兩各不同的Package! 另外,如果是使用註解起來的程式碼,雖然抓的到值, 但是呢...想想看,這是針對一個Package做FindComponent的動作, 當一個Package裡包含十幾二十個Form時,裡面的元件可能有上百個了吧, 這樣的效率...呃...我不敢想下去了... FB10Form與FB10PForm確實有被建立起來呀,為什麼 RunTime到Edit2.Text := TFB10Form(FB10Form).Edit2.Text;就會出錯呢?
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-08-13 16:14:15 IP:211.20.xxx.xxx 未訂閱
可否將ShowModalFormByClassName程式碼貼上來 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
阿子
站務副站長


發表:120
回覆:230
積分:201
註冊:2002-03-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-08-13 16:38:29 IP:61.221.xxx.xxx 未訂閱
這是最原始的資料,而s8954126兄可能有所修改
function CreateFormByClassName(const ClassName: string): TCustomForm;
var
  AClass: TPersistentClass;
begin
  { Note that TApplication "owns" this form and thus it must be freed prior
    to unloading the package }
  AClass := GetClass(ClassName);
  if AClass <> nil then
    Result := TComponentClass(AClass).Create(Application) as TCustomForm
  else
    raise Exception.CreateFmt(sErrorCreateForm, [ClassName]);
end;    function ShowModalFormByClassName(const ClassName: string): integer;
var
  frm: TCustomForm;
begin
  frm := CreateFormByClassName(ClassName);
  try
    Result := frm.ShowModal;
  finally
    frm.Release;
  end;
end;    
您看看巴... 從思考取勝一切~q
------
從思考取勝一切~q
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-08-13 17:03:56 IP:211.20.xxx.xxx 未訂閱
FB10Form的內容從何而來,我不知你在何時將CREATE出來的FORM指定給FB10Form @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
系統時間:2024-04-20 12:24:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!