关于DLL里面加载窗体的问题!救命啊!

beatles1979 2004-03-26 09:37:06
1、用Showmodal显示了DLL的窗体后,如何释放DLL中子窗体后,使得主窗体不再被死锁。
2、想在DLL中放置自己的数据模块,但是如何在主窗体调用呢?有可能的话请给段代码。

有兴趣的朋友请帮帮忙吧!实在是要死人了!泪如雨下啊!
我的QQ是114095769。请有兴趣的达人加我!

每个问题100分。
...全文
38 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuixin13 2004-04-19
  • 打赏
  • 举报
回复
:_)
没研究过.
顶一下..
beatles1979 2004-04-07
  • 打赏
  • 举报
回复
问题解决
后头结帖
beatles1979 2004-04-03
  • 打赏
  • 举报
回复
用dbexperss写了点东东,不过还是不能用,贴出来,大家给点建议吧!
求大伙了!
————————————————dm模块——————————
unit DMpkU;

interface

uses
SysUtils, Classes, DBXpress, DB, SqlExpr, DMIntrpk;

type
Tdmpkg = class(TDataModule)
SQLCon: TSQLConnection;
private
protected
function GetCon: TSQLConnection;
public
{ Public declarations }
end;

var
dmpkg: Tdmpkg;

implementation

{$R *.dfm}
function Tdmpkg.GetCon: TSQLConnection;
begin
Result := SQLCon;
end;
initialization
RegisterClass(Tdmpkg);
finalization
UnRegisterClass(Tdmpkg);
end.
——————————————dm的引用——————————
unit DMIntrpk;

interface

uses
SqlExpr,DBXpress;

type
IDMpk = Interface
['{AA5658B0-9D55-48A2-A719-37A1D638FCD5}']
function GetCon: TSQLConnection;
end;

implementation

end.
————————————————mainform——————————
unit uMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DMIntrpk, FMTBcd, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids,
DB, SqlExpr, Provider, DBClient, DBXpress, SimpleDS;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
SQLDataSet1: TSQLDataSet;
ClientDataSet1: TClientDataSet;
DataSetProvider1: TDataSetProvider;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FpkHandle: THandle;
FpkDM: IDMpk;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FpkHandle := LoadPackage('1.bpl');
if FpkHandle = 0 then
ShowMessage('Can not load package dbmodu.bpl');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SQLDataSet1.SQLConnection := nil;
FpkDM := nil;
if FpkHandle <> 0 then
UnloadPackage(FpkHandle);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
AClass: TComponentClass;
begin
if FpkHandle <> 0 then
begin
AClass := TComponentClass(GetClass('TDMpk'));
if AClass <> nil then
begin
FpkDM := AClass.Create(nil) as IDMPk;
SQLDataSet1.SQLConnection := FpkDM.GetCon;
SQLDataSet1.Active:=true;
ClientDataSet1.Active:=true;
end;
end;
end;
end.
beatles1979 2004-04-02
  • 打赏
  • 举报
回复
李维的《Package 的 秘 密 和 威 力》还是看不懂了
那位仁兄给点解释吧
只怪我自己比较菜
还请大家原谅的说!
多谢各位了!
要疯了
大家帮帮我吧!
关于用package怎么在里面调用数据库呢
找来找去就只能找到一个李维的有点意思,但是代码又没办法完全读懂
要死了!

那位行行好,给点实例或者把李维那个例子解释解释吧
太难了啊!
要疯了!


lwk_hlj 2004-03-31
  • 打赏
  • 举报
回复
我的DM在主窗体中
不过,我在dll中也封装一个DM,
我采用ado,dcom
我直接引用主窗体的adoconnection对像和dcom对像
zhuchengchuan 2004-03-31
  • 打赏
  • 举报
回复
学习中
101monster 2004-03-31
  • 打赏
  • 举报
回复
呵呵,UP!
beatles1979 2004-03-31
  • 打赏
  • 举报
回复
可是我是想把所有的数据库连接都被管理起来
因为要实现用户与数据库权限一一对应
不能有越级行为啊
nyf1220 2004-03-30
  • 打赏
  • 举报
回复
就是可以在数据模块中提供对象啊、类啊等的引出
这样可以实现数据连接和逻辑分离啊
而且主要考虑到升级的问题啊
这样剥离出来可以更方便啊

这样用不到用dll封装dm模块吧?
你单独做一个单元,把实现数据的save,delte,等,全部用类和方法实现了,不就完了?
beatles1979 2004-03-30
  • 打赏
  • 举报
回复
是啊
那用单元的话
如果把DM封装在主程序中
那在DLL的子程序怎么调用呢?
还请您给个实例吧
多谢了!
beatles1979 2004-03-29
  • 打赏
  • 举报
回复
回复人: hb2005(狂牛) ( ) 信誉:100 2004-03-28 22:46:00 得分:0


都让人给回答了。


什么意思呢?
不懂啊!
hb2005 2004-03-28
  • 打赏
  • 举报
回复
都让人给回答了。
beatles1979 2004-03-28
  • 打赏
  • 举报
回复
就是可以在数据模块中提供对象啊、类啊等的引出
这样可以实现数据连接和逻辑分离啊
而且主要考虑到升级的问题啊
这样剥离出来可以更方便啊

不如就给个数据模块置于DLL中的代码我看看好吗?

大家帮帮忙吧
还是比较急的啊!
nyf1220 2004-03-28
  • 打赏
  • 举报
回复
我主要想知道如何象在模块中引用数据模块一样来在Dll中引用啊?

我语言理解能力不是太好
可以在解释的清楚一点吗??
到底想实现什么功能??
是不是想把数据模块放置到dll中?
这样做岂不是很麻烦了
从数据组件里得到的数据都要通过函数来返回,要写多少代码呀
简单的方法我也不会拉
beatles1979 2004-03-26
  • 打赏
  • 举报
回复
呵呵
多多感谢大家的支持哦!

准备按照你们的方法进行调试
nyf1220 2004-03-26
  • 打赏
  • 举报
回复
晕,哈哈,我写的太慢 了,楼上竟然都有了
nyf1220 2004-03-26
  • 打赏
  • 举报
回复
1,在dll里调用showmodal窗体时
可以用类似下面的方法
procedure showform(AHandle:Handle;Acaption:String)
var
DllForm:TDllForm;
begin
Application.Handel:=AHandle;
DllForm:=TdllForm.create(Application)
try
DllForm.caption:=Acaption;
DllForm.showmodal;
finally
DllForm.free;//直接释放
End;
end;

2,跟调用平时的窗口一样调用呀,不过不用显示它,最后跟主窗体一起释放掉就是
flyinwuhan 2004-03-26
  • 打赏
  • 举报
回复
我来回答第一个问题:
xxx是dll输出的一个函数,外部程序可以调用它showmodal dll中的窗体。
hdl是外部程序的application.handle;或者主窗体的handle

function xxx( hdl: THandle):BOOL;
var
frm: TfrmDll;
bmp : TBitmap;
begin
Application.Handle := hdl;
frm := TfrmDll.Create( Application );
try
frm.bmpExp := bmp;
frm.bmpLoc.Width := frm.bmpExp.Width;
frm.bmpLoc.Height := frm.bmpExp.Height;
frm.bmpLoc.PixelFormat := pf24bit;
frm.bmpLoc.Canvas.Draw( 0,0,frm.BmpExp );
frm.clr := clr;
frm.AdjustPaintBoxSize;
frm.ShowModal;
finally
frm.Free;
end;

result := TRUE;
end;
beatles1979 2004-03-26
  • 打赏
  • 举报
回复
____________MainFrm_______________________
unit MainFrm;

interface

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

type
TForm1 = class(TForm)
btnShowModal: TButton;
BtnShow: TButton;
procedure btnShowModalClick(Sender: TObject);
procedure BtnShowClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//静态引入DLL中的方法
procedure ShowDLLModalForm(aHandle: THandle); stdcall external '..\5-1\DLLShowForm.dll';
procedure ShowDLLForm(aHandle: THandle); stdcall external '..\5-1\DLLShowForm.dll';

var
Form1: TForm1;

implementation

{$R *.dfm}
//调用DLL里输出的ShowDLLModalForm方法,模式显示窗口
procedure TForm1.btnShowModalClick(Sender: TObject);
begin
ShowDLLModalForm(Application.Handle);
end;

//调用DLL里输出的ShowDLLForm方法,非模式显示函数
procedure TForm1.BtnShowClick(Sender: TObject);
begin
ShowDLLForm(Application.Handle);
end;

end.

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧