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

關於package的問題

缺席
melticemelt
一般會員


發表:22
回覆:29
積分:10
註冊:2002-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-25 11:29:01 IP:203.204.xxx.xxx 未訂閱
我已經被linker搞了好幾個鐘頭了.........快發瘋啦!! 不知道Delphi會不會有這樣的問題...    之前有試過成功的將程式分割成package 但是步驟有點亂 所以想重新再試一次    今天開個新project重試一次卻成功不了 一開始Project1裡面有Unit1(Form1) Unit2(Form2) 我把Unit2從Project1移除 新增Package1加入Unit2 設定package options為runtime only build package產生bpl bpi lib    可是我在Project1不管如何設定Packages和Directories/Conditionals linker就是視而不見 總是出現Unresolved external TForm2 ... ... Unit1.obj    在Project1的Unit1中加入 #pragma link "Package1.lib" 可以build成static link的執行檔 但是寫成這樣卻不行build #pragma link "Package1.bpi" 出現錯誤 [Linker Error] Unresolved external 'TForm2::' referenced from D:\PROGRAMMING\BCB\PROJECT\TEST PACKAGE\4\UNIT1.OBJ [Linker Error] Unresolved external '__fastcall TForm2::TForm2(Classes::TComponent *)' referenced from D:\PROGRAMMING\BCB\PROJECT\TEST PACKAGE\4\UNIT1.OBJ    目前最新發現如果把Package1的Unit2內修改 #pragma package(smart_init,weak) (我根本不懂什麼是weak,前幾天的package沒加這個也可以運作啊) 這樣build出來的bpi #pragma link "Package1.bpi" 可以build成功 但用tdump -em Project1.exe 卻看不到它有import Package1.bpl (也就是他已經把Package1 static link進exe裡面了) 這不是我要的結果啊    誰來救救我啊!! 已經搞了快半天了啊    Unit1.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if(!Form2)
   {
      Form2 = new TForm2(Application);
      Form2->Show();
   }
   else
   {
      Form2->WindowState = wsNormal;
      Form2->BringToFront();
   }
}
//---------------------------------------------------------------------------
Unit2.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
   Action = caFree;   
}
//---------------------------------------------------------------------------    void __fastcall TForm2::FormDestroy(TObject *Sender)
{
   Form2 = NULL;   
}
//---------------------------------------------------------------------------
發表人 - melticemelt 於 2004/10/25 11:32:54 發表人 - melticemelt 於 2004/10/25 14:02:55
melticemelt
一般會員


發表:22
回覆:29
積分:10
註冊:2002-10-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-25 15:27:01 IP:203.204.xxx.xxx 未訂閱
找到了 自作聰明用了 Form2 = new TForm2(Application); 改用之前的用法就對了 Application->CreateForm(GetClass("TForm2"),&Form2); 可是為什麼不行用new呢? 記得看Delphi的範例都是用.Create就行了 順便說說之前的經驗 如果想改用LoadPackge 就要把Unit1的判斷改成 if(!Application->FindComponent("Form2")) 或是用迴圈搜尋Screen物件(我懶的用迴圈) 來確定Form2是否存在 並在Unit2加入 void mystartup(void) { RegisterClass(__classid(TForm2)); } #pragma startup mystartup 來註冊class name 發表人 - melticemelt 於 2004/10/25 17:04:39
系統時間:2024-05-19 8:13:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!