首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

问个困扰很久的有关问题,怎样用delphi做模块化的程序

2012-09-02 
问个困扰很久的问题,怎样用delphi做模块化的程序?我一直用dll实现模块化,但一直有个问题解决不了,就是dll

问个困扰很久的问题,怎样用delphi做模块化的程序?
我一直用dll实现模块化,但一直有个问题解决不了,就是dll中的窗体,静态调用dll是没有问题的,动态调用总是出错,这样使用起来十分不方便。哪位有动态调用dll窗体的例子。
另外,看到有些程序的模块最终是编译成exe的,也可以用主窗体调用,想问这个是如何实现的。主窗体调用exe窗体后如何与其通讯。
解决后我另开帖给分,谢谢!!

[解决办法]
很简单的了,看这里http://hi.baidu.com/budded/blog/item/68764a11a7cd55c3a7ef3fb7.html
[解决办法]
http://hi.baidu.com/dareny/blog/item/bd29f88be7acdad0fc1f10ed.html
这里有例子
[解决办法]
稍加改动即可,把ShowModal改称Show,在FreeLibrary之前释放窗体即可
[解决办法]
用package阿,编译出来 .bpl 其实就是dll的变种,窗口调用一点问题没有,动态静态随意
[解决办法]
在一个多月之前,我也有楼主这样的问题,现在解决了,我实现的功能如下:的EXE是一个MDI的主窗体,其它的窗体就放在Dll中,一个Dll有一个或多个的子窗体,EXE会主动根据相关的路径去找到这些DLL并自行加载。
但这里有几种比较遗憾的地方:
1.这些DLL只能是Delphi使用,因为我的MDI子窗体是子类来的,通过子窗体的基类与主窗体进行通讯。
2.这些DLL的接口必须遵守一套的调用函数(一共4个)。
3.由于DLL之间的代码不能重用,所以整体来说,应用程序体积会变大。
如果用Package的话,其实也是可以的,但一直有个极不愿意的事,就是为了自己编写的Package能加载,而使得那些公用的Package也要用runtime的,有些不爽。

[解决办法]
可以去这里下载关于Delphi中的Dll封装和调用对象技术的介绍与源代码示例 http://download.csdn.net/source/407953
[解决办法]
这是以前练习写的一个例子,你看看

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
EDLLError = class(Exception);
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }

public
{ Public declarations }
end;

var
Form1: TForm1;
function Min(X,Y:Integer):integer;stdcall; external 'DTK.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := IntToStr(Min(1,3));
end;

procedure TForm1.Button2Click(Sender: TObject);
type 
TIntFunc=function(i,j:integer):integer;stdcall;
var 
Th:Thandle;
Tf:TIntFunc;
Tp:TFarProc;
begin 
Th:=LoadLibrary('E:\试验\动态载入Dll\D2\DTK2.dll'); {装载DLL}
if Th>0 then
try
Tp:=GetProcAddress(Th,PChar('Max2'));
if Tp<>nil then
begin
Tf:=TIntFunc(Tp);
Edit1.Text:=IntToStr(Tf(66,77)); {调用函数}
end
else
ShowMessage('TestC函数没有找到');
finally
FreeLibrary(Th); {释放DLL}
end
else
ShowMessage('dll没有找到');
end;
[解决办法]
加载Dll窗体很容易,直接导出类,关键是释放!
简单例子:
**mdi.dll**
窗体定义:

Delphi(Pascal) code
  TFrmMdi = class(TForm)    ……  private    ……  public    ……  end; 

热点排行