飞豹. 可以实现.
主程序动态调用 A,B包.
A包: Datamodule 包
B包: 一般窗体和查询单元
主程序先调用A包。 调用完后, DATAMODULE自动注册
B包的窗体引用和包引用原则同主窗体。 唯一例外的是:
因为主程序在 lOADpAckAge('A包') 后,Datamodule已经被创建了.
所以B包调用A包不能再次Loadpackage, 这时候应该用特殊的方法查找datamodule
窗口 , 你可以使用 Screen对象, Screen.Datamodules 中记载着当前进程已创建
的datamodule窗体列表.
附代码:
主程序调用DataModule
var datamoduleClass : TpersistentClass;
Loop : Integer;
MyDataModule : TDataModule;
begin
dataModuleClass := GetClass('TDataModule1');
If dataModuleClass <> Nil then
begin
MyDataModule :=
TDataModule(TComponentClass(dataModuleClass).Create(Application));
For Loop := 0 To MyDataModule.ComponentCount - 1 do
begin
//查找Mydatamodule中的 tQuery类
If UpperCase(MyDataModule.Components[Loop].ClassName) = 'TQUERY' then
begin
// if TQuery(MyDataModule.Components[Loop]).Name = 'Query1' then
aQuery := TQuery(MyDataModule.Components[Loop]);
//临时query对象
DataSource1.DataSet := aQuery;
//主窗体中的Datasource1,
aQuery.Open;
break;
end;
end;
end;
end;
B包中调用DataModule的方法:
procedure TForm2.FormActivate(Sender: TObject);
begin
LoadDataModule;
end;
Procedure Tform2.LoadDataModule;
Var
iCounter: Integer;
aQuery : TQuery;
MyDataModule : TDataModule;
begin
for icounter := 0 to Screen.DataModuleCount -1 do
begin
If UpperCase(Screen.DataModules[iCounter].ClassName) = 'tDataModule1' then
MyDataModule := Screen.DataModules[iCounter];
end;
If MydataModule <> NIl then
begin
For iCounter := 0 To MyDataModule.ComponentCount - 1 do
begin
If UpperCase(MydataModule.Components[iCounter].ClassName) = 'TQUERY' then
begin
aQuery := TQuery(MyDataModule.Components[iCounter]);
//临时Query对象
DataSource1.DataSet := aQuery;
//form2中的Datasource1
aQuery.Open;
break;
end;
end;
end;
end;
Initialization
RegisterClass(Tform2);
finalization
UnRegisterClass(Tform2);
end.