我有一个数据模块TDataModuleBasis
,其中有一个名为RequestData
的TClientDataSet。
我有两个数据模块从TDataModuleBasis
下降,同时附加一个TClientDataSet,
让我们将TDataModuleTasks1
命名为Task1Data
,将TDataModuleTasks2
命名为Task2Data
。
任务有请求,因此RequestData
是Task1Data
或Task2Data
的详细信息表。
Task1Data
和Task2Data
有一个持久字段指向RequestData
的查询,这些TClientDataSets背后的查询是为正确的主/详细关系设置的(这些查询实际上是在服务器应用程序中)我们连接到的。)
我的表单有一个名为EditDataModule
的通用TDataModule属性,它始终设置为指向表单所需的数据模块,
所以我在Form1上的代码引用TDataModuleTasks1(EditDataModule)
,而Form2上的代码引用TDataModuleTasks2(EditDataModule)
。
我现在拥有从Form1或Form2创建/使用的FormX,需要使用RequestData
和Task1Data
/ Task2Data
。
创建后,我设置了FormX.EditDataModule := Form1.EditDataModule
或FormX.EditDataModule := Form2.EditDataModule
。
现在,当我想在FormX中使用RequestData
时,我可以在代码TDataModuleBasis(EditDataModule)
中执行此操作,因为TDataModuleBasis是TDataModuleTasks1
和TDataModuleTasks2
的祖先。
但我还需要访问master clientdataset,让我们说它是一个属性FTaskDataSet
。
我用
if (EditDataModule is TDataModuleTasks1) then
FTaskDataSet := TDataModuleTasks1(EditDataModule).Task1Data
else
if (EditDataModule is TDataModuleTasks2) then
FTaskDataSet := TDataModuleTasks2(EditDataModule).Task2Data
else
Assert(error);
问题:
是否有更多'泛型'在没有is
测试和演员表的情况下引用主数据集的方法?我可以吗从RequestData
到达
[BTW实际上,我的Task1Data
和Task2Data
都被命名为TaskData
,但我在这里给了他们不同的名字。]
答案 0 :(得分:0)
我会尝试将属性写为TDataModuleBasis类
TDataModuleBasis = class(TDataModule)
protected
function GetTaskData: TClientDataSet; virtual;
public
property TaskData: TClientDataSet read GetTaskData;
end;
然后覆盖TDataModuleTasks1和TDataModuleTasks2中的基function GetTaskData: TClientDataSet;
,其中函数返回适当的TClientDataSet,如
TDataModuleTasks1 = class(TDataModuleBasis)
private
....
protected
function GetTaskData: TClientDataSet; override;
public
....
end;
....
function TDataModuleTasks1.GetTaskData: TClientDataSet;
begin
Result := (*the client data set object*)
end;
另一种方法是声明一个FTaskClientDataSet字段并在TDataModuleBasis中引入一个构造函数(或者再一个属性)然后访问任务集。
因此,您可以使用TDataModuleBasis(RequestData.Parent).TaskData