S
snow2008
Unregistered / Unconfirmed
GUEST, unregistred user!
不知大家有没有看过加载bpl的程式
如下:
procedure TForm1.loaddbpackage;
begin
try
aDBConnect:=LoadPackage('DMPackage1.bpl');
LoadDataModule;
except
on E:Exception do
begin
MessageBeep(Word(-1));
Showmessage(E.Message);
Application.Terminate;
end;
end;
end;
procedure TForm1.LoadDataModule;
var
iCounter : Integer;
dataModuleclass:TPersistentclass;
begin
dataModuleClass:= GetClass('TDataModule1');
if dataModuleClass <> nil then
begin
admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin
if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TQUERY') and (UpperCase(admGlobal.Components[iCounter].Name)='QUERY2') then
begin
aQuery := TQuery(admGlobal.Components[iCounter]);
DataSource1.DataSet := aQuery;
//break;
end;
//传递Database类
if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TDATABASE') then
begin
aDatabase := TDatabase(admGlobal.Components[iCounter]);
//DataSource1.DataSet := aQuery;
//break;
end;
end;
end;
end;
以上加载数据模块,以下加载第二bpl实现共享使用主exe程序中的Tdatasource
procedure TForm1.LoadUIPackage;
begin
try
UIConnect:=LoadPackage('UIPackage1.bpl');
LoadUIModule;
except
on E:Exception do
begin
MessageBeep(Word(-1));
Showmessage(E.Message);
Application.Terminate;
end;
end;
end;
procedure TForm1.LoadUIModule;
var
iCounter : Integer;
pkgModuleClass:TPersistentclass;
begin
pkgModuleClass:= GetClass('TForm1');
if pkgModuleClass <> nil then
begin
//admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
aPkgForm:=TForm(TComponentClass(pkgModuleClass).Create(Application));
//aPkgForm:=TCustomForm(TComponentclass(pkgModuleClass).Create(Application));
for iCounter := 0 to aPkgForm.ComponentCount - 1 do
begin
// if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TQUERY') and (UpperCase(admGlobal.Components[iCounter].Name)='TEMPSQL') then
if (UpperCase(aPkgForm.Components[iCounter].ClassName) = 'TDATASOURCE') then
begin
aDS := TDataSource(aPkgForm.Components[iCounter]);
aDS.DataSet := aQuery;
break;
end;
end;
aPkgForm.visible:=True;
end;
end;
如上例子,第二bpl加载后同主程序共用了Tdatasouce内容,
但问题:1、这样假设第二bpl为一个子程序(功能),其中只有Tdatasouce,又如何在其中下SQL来执行我所需要的数据内容?
2、我认为是不是应该在第二bpl中加入一个Tquery控件,按Tdatasouce方法实现与主程序共用一个Tquery呢?但不知为何总是不能成功实现?高手试试写一段代码看看?
3、如何对一个大程序进行何的切割与规划?使用dll程序是不是一个好方法?最有效最好的方法应该是怎么样的呢,有代码示例吗?
如下:
procedure TForm1.loaddbpackage;
begin
try
aDBConnect:=LoadPackage('DMPackage1.bpl');
LoadDataModule;
except
on E:Exception do
begin
MessageBeep(Word(-1));
Showmessage(E.Message);
Application.Terminate;
end;
end;
end;
procedure TForm1.LoadDataModule;
var
iCounter : Integer;
dataModuleclass:TPersistentclass;
begin
dataModuleClass:= GetClass('TDataModule1');
if dataModuleClass <> nil then
begin
admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin
if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TQUERY') and (UpperCase(admGlobal.Components[iCounter].Name)='QUERY2') then
begin
aQuery := TQuery(admGlobal.Components[iCounter]);
DataSource1.DataSet := aQuery;
//break;
end;
//传递Database类
if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TDATABASE') then
begin
aDatabase := TDatabase(admGlobal.Components[iCounter]);
//DataSource1.DataSet := aQuery;
//break;
end;
end;
end;
end;
以上加载数据模块,以下加载第二bpl实现共享使用主exe程序中的Tdatasource
procedure TForm1.LoadUIPackage;
begin
try
UIConnect:=LoadPackage('UIPackage1.bpl');
LoadUIModule;
except
on E:Exception do
begin
MessageBeep(Word(-1));
Showmessage(E.Message);
Application.Terminate;
end;
end;
end;
procedure TForm1.LoadUIModule;
var
iCounter : Integer;
pkgModuleClass:TPersistentclass;
begin
pkgModuleClass:= GetClass('TForm1');
if pkgModuleClass <> nil then
begin
//admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
aPkgForm:=TForm(TComponentClass(pkgModuleClass).Create(Application));
//aPkgForm:=TCustomForm(TComponentclass(pkgModuleClass).Create(Application));
for iCounter := 0 to aPkgForm.ComponentCount - 1 do
begin
// if (UpperCase(admGlobal.Components[iCounter].ClassName) = 'TQUERY') and (UpperCase(admGlobal.Components[iCounter].Name)='TEMPSQL') then
if (UpperCase(aPkgForm.Components[iCounter].ClassName) = 'TDATASOURCE') then
begin
aDS := TDataSource(aPkgForm.Components[iCounter]);
aDS.DataSet := aQuery;
break;
end;
end;
aPkgForm.visible:=True;
end;
end;
如上例子,第二bpl加载后同主程序共用了Tdatasouce内容,
但问题:1、这样假设第二bpl为一个子程序(功能),其中只有Tdatasouce,又如何在其中下SQL来执行我所需要的数据内容?
2、我认为是不是应该在第二bpl中加入一个Tquery控件,按Tdatasouce方法实现与主程序共用一个Tquery呢?但不知为何总是不能成功实现?高手试试写一段代码看看?
3、如何对一个大程序进行何的切割与规划?使用dll程序是不是一个好方法?最有效最好的方法应该是怎么样的呢,有代码示例吗?