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

package

尚未結案
DN
一般會員


發表:5
回覆:4
積分:1
註冊:2004-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-06 12:53:57 IP:116.30.xxx.xxx 訂閱
各位先進大家好、我寫用BPL把我的應用程式變小、找了2天的資料、從網路上的範例照做、卻遇到問題了、實在找不到原因、上來發問下、麻煩大家幫我看下、感謝 以下是主程式的CODE、從範例照寫、還做了一個BPL(QQQ)、裡面只放了一個FORM、跟按鈕、點了LOAD 、跟SHOW、程式沒有報錯、但是QQQF就是不會顯示、只有主畫面而已 


[code delphi]
implementation
{$R *.dfm}
procedure UnLoadAddInPackage(Module: THandle);
var
i: Integer;
M: TMemoryBasicInformation;
begin
{ Make sure there aren't any instances of any of the classes from Module
instantiated, if so then free them. (this assumes that the classes are
owned by the application) }
for i := Application.ComponentCount - 1 downto 0 do
begin
VirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
if (Module = 0) or (HMODULE(M.AllocationBase) = Module) then
Application.Components[i].Free;
end;
UnRegisterModuleClasses(Module);
UnLoadPackage(Module);
end;


procedure TMainForm.LoadAddInPackage(PkgName: string);
begin
ListBox1.Items.AddObject(PkgName, Pointer(LoadPackage(PkgName)));
end;

function CreateFormByClassName(const ClassName: string): integer;
var
AClass: TPersistentClass;
AForm: TCustomForm;
begin
Result := mrNone;
{ Note that TApplication "owns" this form and thus it must be freed prior
to unloading the package }
AClass := GetClass(ClassName);
if AClass <> nil then
begin
AForm := TComponentClass(AClass).Create(Application) as TCustomForm;
Result := AForm.ShowModal;
end;
end;

procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
CreateFormByClassName('TQQQF');
end;

procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
LoadAddInPackage('e:\test\BPL\QQQ.bpl');
end;
procedure TMainForm.BitBtn3Click(Sender: TObject);
var
i: integer;
begin
i := ListBox1.ItemIndex;
if i < 0 then
Exit;
UnloadAddInPackage(HMODULE(ListBox1.Items.Objects[i]));
ListBox1.Items.Delete(i);
end;
[/code]
編輯記錄
DN 重新編輯於 2011-09-05 22:56:06, 註解 BPL‧
DN 重新編輯於 2011-09-05 23:00:32, 註解 無‧
DN
一般會員


發表:5
回覆:4
積分:1
註冊:2004-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-06 13:04:33 IP:116.30.xxx.xxx 訂閱
補充一下、我用的是 DELPHI 2007、我的EXE已經5M了、所以才想用BPL分割一下、謝謝!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-09-08 22:07:55 IP:118.169.xxx.xxx 未訂閱
BPL沒做過, 要不要考慮改用DLL的方式會比較好用
===================引 用 DN 文 章===================
補充一下、我用的是 DELPHI 2007、我的EXE已經5M了、所以才想用BPL分割一下、謝謝!
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-09-10 08:29:53 IP:220.137.xxx.xxx 訂閱
這我也沒用過, 
不過我知道你只要把 Project->Option->Package 裡面的 Build with runtime package 勾取
你的程式保證馬上變小小

缺點是要執行該程式的電腦上都必須複製 Delphi 的 runtime BPL
其實遠比想切割自己的程式來的簡單的多, 減少的大小也更明顯
不過我是覺得沒啥必要, 因為程式會變慢, 你要占用的記憶體也還是一樣多
在這個時代, 5M的程式其實不算什麼
------
Mephise Chen
前興德工程師
DN
一般會員


發表:5
回覆:4
積分:1
註冊:2004-08-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-09-10 08:47:26 IP:116.30.xxx.xxx 訂閱
谢谢版主、因为DLL不会写、一直在学DELPHI、看了一些文章、所以才想直接使用DELPHI的BPL
DN
一般會員


發表:5
回覆:4
積分:1
註冊:2004-08-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-09-10 08:50:22 IP:116.30.xxx.xxx 訂閱
也谢谢mephise的抽空回答、那我了解了、还是把他简单好了、5M也还好、了解、谢谢、呵呵
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-09-10 11:19:55 IP:118.169.xxx.xxx 未訂閱
dll也好, bpl也好, 不外乎分散主程式exe的程式大小, 其實在一般執行上, 載入bpl或dll, 還是要吃記憶體, 所以沒啥分別,
只不過以dll或bpl切出來, 是為了程式好維護, 有時一點小東西要改, 如果是落在dll內, 只要改dll就好, 不用整個程式改,
這在做自動更新識別上會更容易, 想想看, 如果是整個exe改掉, 用自動更新該如何主動更新被佔用的exe,
而會建議dll, 是因為 dll 在站上的討論多過bpl, 所以學起來會比較快
===================引 用 DN 文 章===================
也谢谢mephise的抽空回答、那我了解了、还是把他简单好了、5M也还好、了解、谢谢、呵呵
wzwcn
一般會員


發表:0
回覆:5
積分:6
註冊:2010-06-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-09-13 09:50:21 IP:218.205.xxx.xxx 訂閱
 你好,你需要在你的bpl里注册你的TQQQF才能用GetClass找到窗体类。可以这样:
initialization
RegisterClass(TQQQF);

另外,你这样自己加载package并创建窗体不太方便,这里有一个开源框架,支持bpl和dll两种方式,可以方便的分模块,有兴趣可以看看:
http://code.google.com/p/tangram-plugin-framework/
------
今天真是,我喜欢今天...
編輯記錄
wzwcn 重新編輯於 2011-09-12 19:51:48, 註解 無‧
系統時間:2024-03-29 8:19:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!