+ -
当前位置:首页 → 问答吧 → Delphi程序模块化设计

Delphi程序模块化设计

时间:2011-11-16

来源:互联网

最近在做一个项目,想把各版块做成模块,用了DLL以后发现千奇百怪的问题不断,烦不胜烦,想改用BPL吧,又没用过,程序的架构这些问题都已规划好,关键就是实施方法还没确定.请教各位大侠,关于DLL和BPL到底用哪种方式比较好

另外网上现在有关DLL的资料五花八门都有,并没有系统的资料可看,BPL更少,请朋友们帮忙推荐一些有关DLL或BPL的资料吧

作者: changfenglee   发布时间: 2011-11-16

我还是用DLL,包括窗体,共用数据连接,回调函数都可以。没什么问题的。

作者: foxyy8888   发布时间: 2011-11-16

当然BPL比DLL更好用,但是我就是不爱用,不为别的,就是那个扩展名看着不顺眼。

作者: foxyy8888   发布时间: 2011-11-16

总要走出第一步的啊,无论DLL 或BPL,深入后,你会发现,采用这两种方式是多么的方便,无论增加功能,增加模块,还是其他方面。

作者: tgbd   发布时间: 2011-11-16

2种都可以,熟悉那种就用那种

作者: kaikai_kk   发布时间: 2011-11-16

我就只会BPL,,DLL打算过段时间就学,,

作者: case5166   发布时间: 2011-11-16

BPL似乎好用些吧,,至少可以共用数据库连接,而DLL似乎不也得引用BPL来实现共用数据库连接吧。

作者: case5166   发布时间: 2011-11-16

dll也可以共用数据库联接,关于无窗体的DLL调用,我是没问题,但是一但DLL里面有窗体以后,调用DLL的窗体就会有很多问题了,比如:焦点,快捷键等等,所以才考虑用BPL,但是对于BPL的了解我等于0,所以想找点有关BPL的资料看看,怎么调用,释放等等

作者: changfenglee   发布时间: 2011-11-16

DLL可以共用Connection?被另一个DLL调用?

求教 !

作者: case5166   发布时间: 2011-11-16

引用 6 楼 case5166 的回复:
BPL似乎好用些吧,,至少可以共用数据库连接,而DLL似乎不也得引用BPL来实现共用数据库连接吧。


function test(conn :TAdoConnection;const id:integer):PChar; stdcall; export;
var
  AdoQuery :TAdoQuery;
begin
  Result :=nil;
  AdoQuery :=TAdoQuery.Create;
  Try
  AdoQuery.Connection :=Conn;
  AdoQuery.SQL.Text :=Format('SELECT NAME FROM EMPLOYEE WHERE ID=%d;',[id]);
  AdoQuery.open;
  if AdoQuery.RecordCount=1 then
  Result :=PChar(AdoQuery.Fields[0].AsString);
  finally
  AdoQuery.Free;
  end;
end;

作者: foxyy8888   发布时间: 2011-11-16

conn :TAdoConnection
Conn是一个TAdoConnection的一个实例,其实就是个Pointer
如果不喜欢TAdoConnection,那么用Pointer作为Conn的类型都可以,然后强制类型转换。
在主程序中建立的Temp Table在DLL中都可以看到,是不是共用Connection?

作者: foxyy8888   发布时间: 2011-11-16

没用过bpl

作者: wei_wu49036233   发布时间: 2011-11-16

不知道楼主的怎样写DLL. 我的没发现这些问题..只要把Application在加载DLL的时候弄好, 并且加好Sharemem单元, 什么也没有问题的...不过要注意一点是, 采用DLL, is 操作符是有问题的. DLL的对象不能够在主程序里面用is来判断, 相反也一样. 所以is的方法要采用接口的机制来实现. 仅此而已.

即使DLL里面的窗口, 嵌入主程序, 就是Panel也照样把Parent指向之后就能够贴上去的了...

作者: dfasri   发布时间: 2011-11-16

未装Delphi ,纯手工编写,可能有错。
回调函数定义如下,主程序,DLL都要定义
Type
  TDisplayCallback=procedure(const s:PChar);

DLL写法
function test(Conn :Pointer;const ID:Integer;DisplayCallback :TDisplayCallback):integer; stdcall; export;
var
  AdoQuery:TAdoQuery;
  c :integer;
begin
  AdoQuery :=TAdoQuery.Create(nil);
  AdoQuery.Connection :=TAdoConnection(Conn);
  result :=nil;
  Try
  AdoQuery.Connection :=AdoQuery;
  AdoQuery.SQL.text :='SELECT * FROM EMPLOYEE;';
  c :=0;
  While AdoQuery.Eof do
  begin
  if AdoQuery.FieldByName('ID').asinteger=ID then
  begin
  Result :=PChar(AdoQuery.FieldByName('NAME').asstring);
  break;
  end;
  AdoQuery.Next;
  Inc(C);
  DisplayCallback(PChar(Format('%d%%',[Trunc((c/AdoQuery.recordcount)*100)])));
  end;
  finally
  AdoQuery.free;
  end;
end;

main写法

procedure FDisplayCallback(const s:PChar);
begin
  Form1.Staturbar.panels[0].text :=s;
end;

调用
test(Pointer(AdoConnection1),100,@FDisplayCallback);

作者: foxyy8888   发布时间: 2011-11-16

引用 10 楼 foxyy8888 的回复:
conn :TAdoConnection
Conn是一个TAdoConnection的一个实例,其实就是个Pointer
如果不喜欢TAdoConnection,那么用Pointer作为Conn的类型都可以,然后强制类型转换。
在主程序中建立的Temp Table在DLL中都可以看到,是不是共用Connection?

我是说比如建立一个PUBLICDATA的DLL模块,让其它DLL模块调用也能调用这个PUBLICDATA的DLL中的CONN?
而不是在主程序上的数据连接,
不知道二者有无区别&&&
因为我看到很多程序是EXE+BPL+DLL结合来做的,
而BPL一般用作共享数据

作者: case5166   发布时间: 2011-11-16

dll,bpl各有各的优缺点,delphi开发人员指南里有一张讲bpl的,不过仅限入门级

作者: funxu   发布时间: 2011-11-16

个人感觉如果你的程序要和其他程序交互,dll好些,因为bpl是delphi才支持的

作者: funxu   发布时间: 2011-11-16

引用 14 楼 case5166 的回复:
引用 10 楼 foxyy8888 的回复:
conn :TAdoConnection
Conn是一个TAdoConnection的一个实例,其实就是个Pointer
如果不喜欢TAdoConnection,那么用Pointer作为Conn的类型都可以,然后强制类型转换。
在主程序中建立的Temp Table在DLL中都可以看到,是不是共用Connection?

我是说比如建立一个P……

Delphi(Pascal) code

//试试,改改。
var MainConnection :TAdoConnection;
一定要写到implementation上面

function GetConn(。。。;var ConnState:Boolean):Pointer; stdcall; export;
begin
  MainConnection :=TAdoConnection.Create(nil);
  Result :=nil;
  Try
    MainConnection.Connectstring(?记不清了) :='....';
    MainConnection.Connected :=True;
    Result :=Pointer(MainConnection);
    ConnState :=True;
  Except
    ConnState :=False;
  end;
end;

procedure DisConnect; stdcall; export;
begin
  ConnState.Free;
end;

作者: foxyy8888   发布时间: 2011-11-16

procedure DisConnect; stdcall; export;
begin
  MainConnection.Free;
end;

作者: foxyy8888   发布时间: 2011-11-16

好好学习下,Thanks!

作者: case5166   发布时间: 2011-11-16

像参数和返回者都是Integer,PChar,boolean的基本类型的,和其他语言编写的可以交互无任何影响。
像TAdoConnection等返回类型也是可以的,其他程序用Pointer可以得到地址,但是其他语言没有TAdoConnection类型与之对应而已,如果无聊也可以编写对应的结构,不过难度较大。

作者: foxyy8888   发布时间: 2011-11-16

关于DLL的数据连接共享是很简单的,其实说简单一点就是等于建一个新的Unit,然后在里面把数据库连接的过程或函数定义好就行了,只不过DLL和UNIT的调用方式不太一样而已,比如:我在DLL里是这样写的
  function AdoQry(Sql_Str:string):TADOQuery;stdcall;
  var
  Qry:TAdoQuery;
  begin
  Qry:=TADOQuery.Create(nil);
  Qry.Connection:=Con;
  Qry.SQL.Clear;
  Qry.SQL.Add(Sql_Str);
  Qry.Open;
  Result:=Qry;
  end;

然后主程序如果要引用这一段函数只要赋值给变量就可以了
AdoQry('Select * from 表名');

作者: changfenglee   发布时间: 2011-11-16

该回复于2011-11-16 13:13:31被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#23楼 得分:0回复于:2011-11-16 12:22:29
那大家有没有关于这DLL或者BPL方面的书,资料提供看看,DLL窗体的调用问题实在太多了,不系统的学一下是不行了

作者: case5166   发布时间: 2011-11-16

具体问题具体分析吧

作者: changfenglee   发布时间: 2011-11-16

热门下载

更多