具有不同后代数据模块的主服务器的主/详细客户数据集:如何从代码中引用它们?

时间:2014-06-12 12:34:13

标签: delphi inheritance

我有一个数据模块TDataModuleBasis,其中有一个名为RequestData的TClientDataSet。

我有两个数据模块从TDataModuleBasis下降,同时附加一个TClientDataSet,
让我们将TDataModuleTasks1命名为Task1Data,将TDataModuleTasks2命名为Task2Data

任务有请求,因此RequestDataTask1DataTask2Data的详细信息表。
Task1DataTask2Data有一个持久字段指向RequestData的查询,这些TClientDataSets背后的查询是为正确的主/详细关系设置的(这些查询实际上是在服务器应用程序中)我们连接到的。)

我的表单有一个名为EditDataModule的通用TDataModule属性,它始终设置为指向表单所需的数据模块, 所以我在Form1上的代码引用TDataModuleTasks1(EditDataModule),而Form2上的代码引用TDataModuleTasks2(EditDataModule)

我现在拥有从Form1或Form2创建/使用的FormX,需要使用RequestDataTask1Data / Task2Data
创建后,我设置了FormX.EditDataModule := Form1.EditDataModuleFormX.EditDataModule := Form2.EditDataModule

现在,当我想在FormX中使用RequestData时,我可以在代码TDataModuleBasis(EditDataModule)中执行此操作,因为TDataModuleBasis是TDataModuleTasks1TDataModuleTasks2的祖先。

但我还需要访问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实际上,我的Task1DataTask2Data都被命名为TaskData,但我在这里给了他们不同的名字。]

1 个答案:

答案 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

访问TaskData