如何動態載入 Package 內的 DataModule |
答題得分者是:syntax
|
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
請教各位先進:
小弟製作了一個 Package,裡面建立了一個 DataModule,並自訂了一個 Function。如果要使用 LoadPackage() 的方式來動態載入該 Package,並使用 DataModule 內的 Function,該如何寫程式呢? 如果是 Package 內的 Form,倒是可以使用以下的方式來達成,但是 DataModule 似乎就不能這樣用了… [code cpp] HINST PKGHandle = LoadPackage("Bin\\Package1.bpl"); TForm *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TForm1"); Application->CreateForm(pClass, &pGlobalDM); pGlobalDM->............. [/code] |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
=GetClass(Name); Assigned(AClass) Result : AClass.NewInstance as TXxxxx; Result.Create; 您覺得這樣如何? ===================引 用 seeing 文 章=================== 請教各位先進: 小弟製作了一個 Package,裡面建立了一個 DataModule,並自訂了一個 Function。如果要使用 LoadPackage() 的方式來動態載入該 Package,並使用 DataModule 內的 Function,該如何寫程式呢? 如果是 Package 內的 Form,倒是可以使用以下的方式來達成,但是 DataModule 似乎就不能這樣用了… [code cpp] HINST PKGHandle = LoadPackage("Bin\\Package1.bpl"); TForm *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TForm1"); Application->CreateForm(pClass, &pGlobalDM); pGlobalDM->............. [/code] |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
您好:
請問 BCB 要怎麼寫呢,我只會用 BCB, AClass 似乎沒有 AClass:ifthenbegin=end 您覺得這樣如何? ===================引 用 seeing 文 章=================== 請教各位先進: 小弟製作了一個 Package,裡面建立了一個 DataModule,並自訂了一個 Function。如果要使用 LoadPackage() 的方式來動態載入該 Package,並使用 DataModule 內的 Function,該如何寫程式呢? 如果是 Package 內的 Form,倒是可以使用以下的方式來達成,但是 DataModule 似乎就不能這樣用了… [code cpp] HINST PKGHandle = LoadPackage("Bin\\Package1.bpl"); TForm *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TForm1"); Application->CreateForm(pClass, &pGlobalDM); pGlobalDM->............. [/code]
編輯記錄
seeing 重新編輯於 2009-11-24 09:00:04, 註解 無‧
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
TPersistentClass p = Classes::GetClass("xxx");
TObject *aObj = p->InitInstance(System::GetMemory(p->InstanceSize())); ===================引 用 seeing 文 章=================== 您好: 請問 BCB 要怎麼寫呢,我只會用 BCB, AClass 似乎沒有 AClass:ifthenbegin=end 您覺得這樣如何? ===================引 用 seeing 文 章=================== 請教各位先進: 小弟製作了一個 Package,裡面建立了一個 DataModule,並自訂了一個 Function。如果要使用 LoadPackage() 的方式來動態載入該 Package,並使用 DataModule 內的 Function,該如何寫程式呢? 如果是 Package 內的 Form,倒是可以使用以下的方式來達成,但是 DataModule 似乎就不能這樣用了… [code cpp] HINST PKGHandle = LoadPackage("Bin\\Package1.bpl"); TForm *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TForm1"); Application->CreateForm(pClass, &pGlobalDM); pGlobalDM->............. [/code] |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
您好:
依照您的方式,aObj 並無法取用 DataModule 內的 Function DataModule 的內容如下: [code cpp] class TDataModule1 : public TDataModule { __published: // IDE-managed Components private: // User declarations public: // User declarations int __fastcall AAA(); __fastcall TDataModule1(TComponent* Owner); }; [/code] 不知道是小弟的使用方法錯誤嗎? 謝謝您 ===================引 用 syntax 文 章=================== TPersistentClass p = Classes::GetClass("xxx"); TObject *aObj = p->InitInstance(System::GetMemory(p->InstanceSize())); |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
1. aObj 是 TObject 需要轉型
2. 你還需要懂 placement new 的觀念 (Sorry 以為你已經會了) ===================引 用 seeing 文 章=================== 您好: 依照您的方式,aObj 並無法取用 DataModule 內的 Function DataModule 的內容如下: [code cpp] class TDataModule1 : public TDataModule { __published: // IDE-managed Components private: // User declarations public: // User declarations int __fastcall AAA(); __fastcall TDataModule1(TComponent* Owner); }; [/code] 不知道是小弟的使用方法錯誤嗎? 謝謝您 ===================引 用 syntax 文 章=================== TPersistentClass p = Classes::GetClass("xxx"); TObject *aObj = p->InitInstance(System::GetMemory(p->InstanceSize())); |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
您好:
placement new 小弟的確是沒接觸過,謝謝您的指點! 不過看完後還不是很懂,若以裡面的範例來看,要用 CTest* 來宣告,那就必須將含有 CTest class 的 *.h 引入,這樣不就類似用靜態的方式宣告了,失去用 package 的動態載入的目的了? 謝謝您 ===================引 用 syntax 文 章=================== 1. aObj 是 TObject 需要轉型 2. 你還需要懂 placement new 的觀念 (Sorry 以為你已經會了) |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
package load 是 delphi 的特有功能,不適合用在 C-type language
是一種設計模式,C-type language 建議使用 DLL 而且本來動態子載入,還是需要引入定義,不然,就跟 COM 一樣原理,呼叫了一個不知道是什麼的,做了一件不知道的是,這在設計時期,更是無法知道,請問你程式碼要如何寫?當然是頂多使用通用格式,不然,請載入定義檔,或稱介面 placement new 主要用來觸發 new ,因為,C-type language 沒有 Create method to invoke constructor unless youe do not use it. 如果你不是已知型態,哪請不要在 constructor 內設計東西,這樣就不再需要 new,直接使用 如果你還是要 call constructor,就必須直接由 VMT 來處理,相信你不會想要這樣做 另外 BCB ,為何不能用 delphi 語法?還是可以吧!用 delphi 語法就沒這問題了 ===================引 用 seeing 文 章=================== 您好: placement new 小弟的確是沒接觸過,謝謝您的指點! 不過看完後還不是很懂,若以裡面的範例來看,要用 CTest* 來宣告,那就必須將含有 CTest class 的 *.h 引入,這樣不就類似用靜態的方式宣告了,失去用 package 的動態載入的目的了? 謝謝您 ===================引 用 syntax 文 章=================== 1. aObj 是 TObject 需要轉型 2. 你還需要懂 placement new 的觀念 (Sorry 以為你已經會了) |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
您好:
會想用 package 主要也是想要把程式切割模組化,但是因為還有用到 VCL 元件,所以DLL可能就不適用,而 VCL 也不太方便,每改一次就要重新安裝一次,所以才會考慮用 package 的方式 Delphi 的語法小弟就不會了,底下是網路上找到的 [code cpp]var AClass:TPersistentClass; begin Result:=nil; AClass:=GetClass(ClassName); If AClass=nil then exit; Result:=TComponentClass(AClass).Create(Application) as TDataModule; end; [/code] 改寫成 BCB [code cpp] TPersistentClass pClass = Classes::GetClass("TDataModule1"); TComponentClass pClass = TComponentClass(GetClass("TDataModule1")); //TDataModule Result = TDataModule(TComponentClass(pClass)); [/code] 總是卡在最後一句 如果用 [code cpp] HINST PKGHandle = LoadPackage("Bin\\Package2.bpl"); TDataModule *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TDataModule 1"); Application->CreateForm(pClass, &pGlobalDM); [/code] pGlobalDM 就無法取用Package2 內的自訂 Function ===================引 用 syntax 文 章=================== package load 是 delphi 的特有功能,不適合用在 C-type language 是一種設計模式,C-type language 建議使用 DLL 而且本來動態子載入,還是需要引入定義,不然,就跟 COM 一樣原理,呼叫了一個不知道是什麼的,做了一件不知道的是,這在設計時期,更是無法知道,請問你程式碼要如何寫?當然是頂多使用通用格式,不然,請載入定義檔,或稱介面 placement new 主要用來觸發 new ,因為,C-type language 沒有 Create method to invoke constructor unless youe do not use it. 如果你不是已知型態,哪請不要在 constructor 內設計東西,這樣就不再需要 new,直接使用 如果你還是要 call constructor,就必須直接由 VMT 來處理,相信你不會想要這樣做 另外 BCB ,為何不能用 delphi 語法?還是可以吧!用 delphi 語法就沒這問題了 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
如果你不會變動 元件的定義,可以改用 Runtime package
===================引 用 seeing 文 章=================== 您好: 會想用 package 主要也是想要把程式切割模組化,但是因為還有用到 VCL 元件,所以DLL可能就不適用,而 VCL 也不太方便,每改一次就要重新安裝一次,所以才會考慮用 package 的方式 Delphi 的語法小弟就不會了,底下是網路上找到的 [code cpp]var AClass:TPersistentClass; begin Result:=nil; AClass:=GetClass(ClassName); If AClass=nil then exit; Result:=TComponentClass(AClass).Create(Application) as TDataModule; end; [/code] 改寫成 BCB [code cpp] TPersistentClass pClass = Classes::GetClass("TDataModule1"); TComponentClass pClass = TComponentClass(GetClass("TDataModule1")); //TDataModule Result = TDataModule(TComponentClass(pClass)); [/code] 總是卡在最後一句 如果用 [code cpp] HINSTPKGHandle=LoadPackage("Bin\\Package2.bpl"); TDataModule *pGlobalDM; TMetaClass *pClass; pClass = GetClass("TDataModule 1"); Application->CreateForm(pClass, &pGlobalDM); [/code] pGlobalDM 就無法取用Package2 內的自訂 Function ===================引 用 syntax 文 章=================== package load 是 delphi 的特有功能,不適合用在 C-type language 是一種設計模式,C-type language 建議使用 DLL 而且本來動態子載入,還是需要引入定義,不然,就跟 COM 一樣原理,呼叫了一個不知道是什麼的,做了一件不知道的是,這在設計時期,更是無法知道,請問你程式碼要如何寫?當然是頂多使用通用格式,不然,請載入定義檔,或稱介面 placement new 主要用來觸發 new ,因為,C-type language 沒有 Create method to invoke constructor unless youe do not use it. 如果你不是已知型態,哪請不要在 constructor 內設計東西,這樣就不再需要 new,直接使用 如果你還是要 call constructor,就必須直接由 VMT 來處理,相信你不會想要這樣做 另外 BCB ,為何不能用 delphi 語法?還是可以吧!用 delphi 語法就沒這問題了 |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
Build with runtime package,只需要將編譯選項改一改,不會用到 Package load
開一個 project group 放你的 project 加上 那個 package project 一起編譯直接引用,不需特殊方式與語法 編譯選項,取消 Build with runtime package,自然就分開了,以後只要重新編譯 package project 替換即可 ===================引 用 seeing 文 章=================== 您好: 是的,所以我才想把 Function 包進 Package 裡面,但還是試不出來,卡在之前敘述的問題,不知道您有解決的方法嗎? 謝謝您 ===================引 用 syntax 文 章=================== 如果你不會變動 元件的定義,可以改用 Runtime package |
seeing
初階會員 發表:49 回覆:131 積分:41 註冊:2002-11-07 發送簡訊給我 |
您好:
小弟會試試看的 ===================引 用 syntax 文 章=================== Build with runtime package,只需要將編譯選項改一改,不會用到 Package load 開一個 project group 放你的 project 加上 那個 package project 一起編譯直接引用,不需特殊方式與語法 編譯選項,取消 Build with runtime package,自然就分開了,以後只要重新編譯 package project 替換即可 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |