有什么详细讲述包(packege)的资料,高分(预付100分:)(100分)

  • 主题发起人 主题发起人 oceanwave
  • 开始时间 开始时间
O

oceanwave

Unregistered / Unconfirmed
GUEST, unregistred user!
到处买不到详细关于包方面的书,有的只是几张纸轻描淡写带过。特别是把数据模块做成
包,程序对它进行访问的方法。
 
Package据说也是DLL格式,使用LoadPackage调入,比如

procedure TMDIMainForm.ToolButton1Click(Sender: TObject);
var
createProc: Procedure;
begin
If hPackage = 0 Then
hPackage := LoadPackage( ExtractFilePath( Paramstr(0) )+
'ChildPackage.bpl' );
If hPackage = 0 Then
ShowMessage('LoadPackage failed')
Else Begin
@createProc := GetProcAddress( hPackage, 'CreateChildForm' );
If Assigned( CreateProc ) Then
CreateProc
Else
ShowMessage('GetProcAddress failed');
End;
end;

和动态DLL调用是一样的。
 
有没有例程和相关说明呢?谢谢:)
 
上面不就是吗,而且和动态DLL调用一样,没有什么难度的,其实用bpl还不如dll呢
 
我想解决的问题是,我在程序中设有一个数据模块DM,和多个访问它的窗体。我的想法是
把DM单独放在一个包中(或是DLL中),几个窗体也分别做成包或DLL,然后用一个主窗体
访问它们。
因为我做得是物流管理系统,不同的功能模块不断的增加中,而这些程序是通过我的网站
分布,如果做成独立的EXE,就太大了,而大部分是无需改动。看了一些资料后,知道了
DLL和包,但这方面的资料太少太少,我以前从未接触这方面的内容。
所以,如果方便,希望能有例程(能简要的解决我上述问题的),分一定给足的:)
 
http://vcl.vclxx.org/DELPHIGB/AAAT1004.HTM#win32api

示范如何储存一个对话框 ( Dialog Boxes ) 到 DLL 中,并且示范如何使用
DLL 中的对话框.

祝你好运!

 
对数据模块的访问是否也是如此吗?我看了一些资料,好象有一个全局数据的概念。
 
to DragonPC_???:
你说的那个例子的UABOUT中的146行出错,代码是
if VerQueryValue(VData,@ItemName[1],VVers,Len) then
if Len > 0 then begin
if Len > 255 then
//-- "Truncate" any long strings
Len := 255;
Move(VVers, Result, SizeOf(Len));
第一行就是源码中的146行
错误信息如下:
[Error] uabout.pas(146): Types of actual and formal var parameters must be identical
为什么?
 
哈哈,那个不是重点,你可以把整个FormCreate方法删除掉。

另外TheUnitMain.pas也有一点错误:
procedure LoadAboutbox; external 'AboutDLL' index 1;
改为
procedure LoadAboutbox; external 'AboutDLL.DLL' index 1;
 
能给一个我要的例子吗?我比较笨,而且再从上面的例子中悟出用法的话,我的程序就来
不及交货了。我想要的例子是:
一个数据模块——DataModul,
一个对某个数据表的列表(用DBGRID为主)的窗体——frmCustomerList,
一个对单个记录进行操作的窗体——frmCustomer,
这个数据表可以用Access的NorthWind数据库中的Customer表来作示例。
DataModul中有一个TDataBase和一个TTable和TDataSource,连接NorthWind的Customer表
frmCustomerList有一个TQuery(SQL为“SELECT * FROM CUSTOMER”)和一个TDataSource,
还有一个TDBGrid,Source是TDataSource,当在TDBGrid上双击后,弹出frmCustomer
定位在frmCustomerList中TDBGrid中所指定的记录,
frmCustomer中有一自定义过程为:
procedure TfrmCustomer.Edit(Customer:String);
begin
DataModul.TableCustomer.Locate('Customer',Customer,[]);
ShowModal;
end;
而在frmCustomerList中调中对应记录的过程的是:
procedure TfrmCustomerList.DBGridDblClick(Sender:TObject);
begin
frmCustomer.Edit(qCustomer.value);
end;
请DragonPC_???兄帮帮我,300分一定送上,谢谢,谢谢!
 
我只能说这是一个非常复杂的尝试,因为原则上DLL和BPL只输出函数和方法,而你需要共享
DLL内的类实例,DLL肯定会非常麻烦,BPL倒是可以共享匿名自定义类,通过

initialization
RegisterClass(TyourDataModul);

finalization
UnRegisterClass(TyourDataModul);

但是我也从来没有研究过这种方式,我自己也没有太多时间来实验,我想说得是,DLL、BPL
用来封装一些相对独立的操作是比较合适的,我看你的DM就在主程序里面定义好了,某些的
窗体倒是可以独立成为DLL或是BPL出来,比如frmCustomer。
 
或者你在DLL内部声明大量的函数向下面这样

GetDataSource
GetTable
GetDatabase

SetDataSource
SetTable
SetDatabase

把你的DataModule里面需要操作的函数都封装出来,把自定义类转换为存取VCL可以识别的
类的函数。

另外,你也可以考虑使用接口,参考Microsoft COM对象的共享方式。但是,这些都不是什
么好办法,劝你还是先交了差,然后再改进,大家都是怎么干的啦
 
未必要用包
直接用dll就可以了
或者考虑分布式计算
比如采用corba
 
谢谢兄弟们捧场!我看过一篇文章,是在台湾BORLAND上李维写的,网址如下:
http://www2.borland.com.tw/tw/reference9.html
里面有一段话:
为什么在我一开始使用DLL时无法解决多个Unit共享一个数据Unit DLL的问题呢?这主要是因为在
Win95/NT中当每一个Unit载入DLL时,对于每一个DLL之中的全局变量而言,每一个Unit都会有一份
独立的变量。这是什么意思呢?我们可以使用图二来说明。

当图二中的Unit1和Unit2分别的载入它们共享的DLL时,虽然在这个共享的DLL中有一个全局变量
gAccount。但是Unit1和Unit2会分别的拥有一个gAccount变量。这也就是说Unit1对于gAccount变量
数值所做的修改并不会影响Unit二中的gAccount变量数值。在Wn95/NT中的DLL行为是和Win3.x不同的,
因为在Win3.x中所有的Unit都使是共享一份DLL中的全局变量。
由于Win95/NT中DLL全局变量的这种特性,所以当你想把数据Unit撰写在DLL之中让多个Unit共同使用
时,问题就来了。因为在这种情形下,每一个Unit都会有一份它自己的数据Unit。所以当每一个应用
程序Unit载入数据Unit的DLL时,它仍然会连结数据库一次,所以你并无法减少连结数据库的次数。

后面就接着讲“包”相对于DLL的好处,特别是在数据模块的共享方面
 
我的程序已经写完了,但客户对分发方式很有意见,所以不得不去改进了。不然拿不到钱的
吃饭都成问题啦。但我对“函数封装”,DLL等方面是一窍不通,所以也麻烦大家能推荐一
些书或资料给我,谢谢谢谢
 
近来瞧瞧。
怎么变成讲DLL的了?
 
关注,我认为用Com对象可与解决对象共享问题
 
过了一周了,也在工作间暇到处找这方面的资料,多学了一些DLL方面的东西,但毕竟太少
了,一直都不得其门而入。特别是关于共享数据模块方面的内容。
问题我暂不结束它,希望高手们发表一些意见,虽然分比较少,但如果有精彩的回答,我还
是会不吝分数奉上的,谢谢!
 
bpl可以输出类, 而dll不行
所以可以把你的类一个个写成bpl, 要用再装入并动态创建
 
建一个新包,包涵如下单元,如何编译成功?
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部