欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
package(轉)
不知道各位用Delphi寫(xiě)數據庫程序的朋友有沒(méi)有碰到過(guò)這樣的問(wèn)題:寫(xiě)出來(lái)的
程序體積太龐大!我寫(xiě)的上一個(gè)項目中可執行文件竟然達到4.3M!很可怕的體積!
這樣不僅分發(fā)程序比較困難,而且維護也很難:程序給客戶(hù)后發(fā)現界面上某個(gè)標簽
的字寫(xiě)錯了,然后不得不把這樣一個(gè)巨無(wú)霸重新編譯,重新發(fā)給客戶(hù)。
想到分割程序,用什么呢?COM/MTS?在小項目中太得不償失了!用Dll?如果
是做非數據庫程序還可以,如果做數據庫程序就有麻煩了:每個(gè)Dll都會(huì )在自己獨立
的對話(huà)中和數據庫連接,造成資源的極大浪費,而且還有全局變量的問(wèn)題。在當我
快絕望的時(shí)候看到了李維的一篇有關(guān)package的文章(關(guān)心package的朋友應該都看
過(guò)那篇文章),但那篇文章里寫(xiě)的不是很清楚,看了還有些不明白。大富翁上也有
很多朋友討論,但都比較零碎,上一段時(shí)間結合網(wǎng)上查到的文章,還有自己一些摸索,
終于基本上搞清楚了package的一些用法,現在貼出來(lái)和大家交流。

package的使用和dll類(lèi)似,有靜態(tài)和動(dòng)態(tài)調用兩種方法。

我們用一個(gè)簡(jiǎn)單的數據庫程序來(lái)說(shuō)明,假設工程組成為:

ClassMgr.dpr--------------------工程文件
uGlobal.pas---------------------全局變量單元
frmDM.dfm(uDM.pas)--------------數據模塊
frmMain.dfm(uMain.pas)----------主窗體
frmStudent.dfm(uStudent.pas)----學(xué)生檔案窗體
frmScroe.dfm(uScore.pas)--------成績(jì)輸入窗體
frmQuery.dfm(uQuery.pas)--------成績(jì)查詢(xún)窗體

這里面的一些uses關(guān)系就不說(shuō)了,大家應該都很清楚吧!

1、靜態(tài)方法

現在的目標是把每個(gè)功能窗體放進(jìn)一個(gè)包中,以后當需要修改相應的模塊時(shí)只要發(fā)
布相應的包即可。為了達到這個(gè)目的,我們需要添加四個(gè)包:

basic.dpk
Contains: uDM.pas; uGlobal.pas
student.dpk
Contains: uStudent.pas
scroe.dpk
Contains: uScord.pas
query.dpk
Contains: uQuery.pas

因為所有的數據窗體都需要引用數據模塊(uDM.pas)和全局變量(uGlobal.pas)單元,
所以我們把uGlobal.pas和uDM.pas放進(jìn)basic.dpk中,至于為什么這么做我們等一下
再說(shuō)。

在ClassMgr.dpr的Options中修改屬性,使它Build with runtime packages,
package的列表為:
basic.bpl
student.bpl
scroe.bpl
query.bpl

另外,在student.dpk, scroe.dpk, query.dpk的Requires中添加basic.bpl;
basic.dpk的Requires中添加
vcl50.bpl
vcldb50.bpl
vclado50.bpl(假設用ADO連接)

接下來(lái)就是編譯包和可執行文件,這里需要注意編譯的順序,正確的編譯順序應該為:
basic.bpl -> (student.dpk, scrod.dpk, query.dpk) -> Classmgr.dpr

編譯完后看一下,classmgr.exe的體積是不是小很多了?差不多只用100k左右,因為
其實(shí)里面只包含了主窗體。每個(gè)bpl文件的大小也差不多100k左右(具體視代碼規模)。

[red][b]這里需要額外說(shuō)明的是:[/b][/red]
在主窗體frmMain中也要引用uDM, uGlobal等單元,但是因為已經(jīng)Build with相應
的包了,所以Delphi只會(huì )編譯相應的聲明,而代碼的實(shí)現部分在相應的包里。

2、動(dòng)態(tài)方法

我們還是拿上面的例子

在這之前需要將每個(gè)窗體單元(主窗體除外)作一些修改:
即在每個(gè)窗體單元的Initialization部分注冊相應的窗體類(lèi)。
代碼例子如下:
initialization
RegisterClass(TfrmStudent);
finalization
UnRegisterClass(TfrmStudent);
end.

然后在主窗體需要調用該窗體的地方改成下面的方式:
procedure TfrmMain.btStudentClick(Sender: TObject);
var
h: HMODULE;
frmStudent: TForm;
begin
try
h := LoadPackage('student.bpl');
frmStudent := TForm(TComponentClass(FindClass('TfrmStudent')).Create(Application));
frmStudent.ShowModal;
finally
frmStudent.Free;
UnLoadPackage(h);
end;
end;
在這里先載入包student.bpl, 然后取得我們在包里注冊的TfrmStudent類(lèi),
因為FindClass返回的值是TPersistentClass類(lèi)型,需要強制轉換為T(mén)ComponentClass類(lèi)
后創(chuàng )建相應的實(shí)例。窗體釋放后再釋放student.bpl

在這種方式下就不需要在frmMain引用其他的單元了(全局變量單元除外)。需要補充
一點(diǎn)的是,在這種方式下,工程classmgr.dpr也需要Build with runtime package,
否則會(huì )在FindClass時(shí)無(wú)法取得相應的類(lèi)指針。只是student.bpl等包不需要在package
列表中,只需添加basic.bpl即可。

現在說(shuō)說(shuō)為什么要將uDM.pas和uGlobal.pas加入到basic.bpl包中。
大家都知道win32模式下Dll不能直接和主程序共享全局變量,package的高明之處
就在于package和主程序能共享全局變量,所要作的工作只是把相應的全局變量放到某
個(gè)包中,然后引用該全局變量的包和主程序只要引用該包即可。因為在這個(gè)程序中
uGlobal.pas中存放的是全局變量,主程序和其他包都需要引用這些全局變量,故將它
加入basic.bpl中,uDM中的數據模塊也是一個(gè)全局窗體變量,也需要加入basic.bpl中。

所以在其他包的Requires中都有basic.bpl

3、總結

================= 靜態(tài)調用模式 =====================

一些關(guān)系:

classmgr.dpr
Build with runtime package: student.bpl, score.bpl, query.bpl, basic.bpl

uMain.pas中:
uses
uGlobal, uStudent, uScore, uQuery;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^不能刪除

student.bpl
requires: basic.bpl

score.bpl
requires: basic.bpl

query.bpl
requires: basic.bpl

basic.bpl
requires: vcl50.bpl, vcldb50.bpl, vclado50.bpl


================= 動(dòng)態(tài)調用模式 =====================

一些關(guān)系:

classmgr.dpr
Build with runtime package: basic.bpl
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^一定要

uMain.pas中:
uses
uGlogal, uStudent, uScore, uQuery;
^^^^^^^^^^^^^^^^^^^^^^^^^這幾個(gè)單元不需要,但uGlobal仍需要

student.bpl
requires: basic.bpl

score.bpl
requires: basic.bpl

query.bpl
requires: basic.bpl

basic.bpl
requires: vcl50.bpl, vcldb50.bpl, vclado50.bpl

================= 兩種模式的比較 =====================

理論上講動(dòng)態(tài)調用方式下會(huì )比較節省資源,因為相應的包只在需要的時(shí)候才
載入內存,但需要犧牲速度為代價(jià)。
但在實(shí)際使用中,項目窗體可能很多,包也可能有很多,頻繁的載入包可能
會(huì )使開(kāi)發(fā)者陷入一個(gè)比較混亂的狀態(tài),可能有的包載入了而沒(méi)有釋放掉,而且包
在什么時(shí)候釋放也需要很好的控制,這樣就不能達到節省資源的目的,相反卻增
加了編程的復雜性和犧牲了速度。
另外,動(dòng)態(tài)調用還有一個(gè)很明顯的缺點(diǎn)是:調用時(shí)無(wú)法直接知道所取得的某
個(gè)類(lèi)是否有某個(gè)方法或屬性。
比如我們上面的例子中的frmStudent窗體有一個(gè)公有方法:GetStdInfo;
在動(dòng)態(tài)調用時(shí):
var
frmStudent: TForm;
begin
h := LoadPackage('student.bpl');
frmStudent := TForm(TComponentClass(FindClass('TfrmStudent')).Create(Application));
frmStudent.ShowModal;

這里我們就不能寫(xiě)入frmStudent.GetStdInfo這樣的代碼,因為事實(shí)上frmStudent
只是TForm類(lèi)的一個(gè)實(shí)例,沒(méi)有GetStdInfo這樣的方法。在這方面動(dòng)態(tài)package和COM有
點(diǎn)類(lèi)似,但使用COM時(shí)編譯器允許使用Variant方式來(lái)調用一個(gè)未知的方法,但Package
卻不行。在靜態(tài)調用時(shí)就不存在這種問(wèn)題,因為代碼的實(shí)現方式和不使用包時(shí)完全一樣。

一點(diǎn)補充說(shuō)明:不能在包之間交叉包含(Contains)某個(gè)單元,比如:在basic.bpl中已經(jīng)
包含了uDM.pas單元,在student.bpl中就不能再包含uDM.pas這個(gè)單元,否則編譯是不能
通過(guò)。

4、建議

我個(gè)人的意見(jiàn)是使用靜態(tài)調用。但如果項目很大,package也就失去了她優(yōu)勢了,
到那個(gè)時(shí)候我想COM /MTS會(huì )是一個(gè)比較好的選擇
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[DCC Fatal Error] **.dpk : E2202 Required package ''***'' not found
delphi組件的安裝方法
Delphi?ActiveX?Form的使用實(shí)例(三)
Never-build package [xxx] must be recompiled
DELPHI下自定義包的作用,開(kāi)發(fā)以及包文件的安裝配置位置
一個(gè)值得大家來(lái)考慮的dll問(wèn)題
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久