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

如何動態載入 Package 內的 DataModule

答題得分者是:syntax
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-24 00:14:54 IP:123.110.xxx.xxx 訂閱
請教各位先進:
小弟製作了一個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-24 08:29:35 IP:59.125.xxx.xxx 訂閱

=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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-24 08:59:06 IP:220.136.xxx.xxx 訂閱
您好: 
請問 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-24 16:07:00 IP:59.125.xxx.xxx 訂閱
    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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-11-24 17:13:17 IP:220.136.xxx.xxx 訂閱
您好:
依照您的方式,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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-11-25 08:16:42 IP:59.125.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-11-25 09:07:22 IP:220.136.xxx.xxx 訂閱
您好: 
placement new 小弟的確是沒接觸過,謝謝您的指點! 不過看完後還不是很懂,若以裡面的範例來看,要用 CTest* 來宣告,那就必須將含有 CTest class 的 *.h 引入,這樣不就類似用靜態的方式宣告了,失去用 package 的動態載入的目的了?
謝謝您

===================引 用 syntax 文 章===================
1. aObj 是 TObject 需要轉型
2. 你還需要懂 placement new 的觀念 (Sorry 以為你已經會了)


syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-11-25 11:55:28 IP:59.125.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-11-25 17:23:35 IP:220.136.xxx.xxx 訂閱
您好:
會想用 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 語法就沒這問題了


編輯記錄
seeing 重新編輯於 2009-11-25 17:25:32, 註解 無‧
seeing 重新編輯於 2009-11-25 17:27:14, 註解 無‧
seeing 重新編輯於 2009-11-25 17:28:16, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-11-26 08:01:27 IP:59.125.xxx.xxx 訂閱
如果你不會變動 元件的定義,可以改用 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-11-26 09:30:32 IP:220.136.xxx.xxx 訂閱
您好:
是的,所以我才想把 Function 包進 Package 裡面,但還是試不出來,卡在之前敘述的問題,不知道您有解決的方法嗎? 謝謝您

===================引 用 syntax 文 章===================
如果你不會變動 元件的定義,可以改用 Runtime package


syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-11-26 13:16:58 IP:59.125.xxx.xxx 訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-11-26 17:39:19 IP:220.136.xxx.xxx 訂閱
您好:
小弟會試試看的

===================引 用 syntax 文 章===================
Build with runtime package,只需要將編譯選項改一改,不會用到 Package load

開一個 project group
放你的 project 加上 那個 package project 一起編譯直接引用,不需特殊方式與語法
編譯選項,取消 Build with runtime package,自然就分開了,以後只要重新編譯 package project 替換即可


系統時間:2024-04-26 18:57:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!