2013-10-16 26 views
2

我有一个窗体,它具有绑定到数据模块中的数据集的数据感知控件。我需要在同一个应用程序中创建表单和数据模块的其他实例。将表单的第二个实例绑定到数据模块的第二个实例?

我删除了数据模块首次添加到项目时自动创建的全局变量。令我高兴的是,设计者中的控件仍然可以绑定到没有这个全局变量的数据模块中的数据集。我假设IDE正在解析datamodule的dfm,因此设计人员仍然可以“看见”数据模块。 (没有在IDE中加载数据模块,数据源列表为空)

当我在运行时创建两个窗体实例和两个datamodule实例时,窗体的两个实例似乎只绑定到第一个数据模块已创建。检查数据模块的第二个实例显示Name属性具有在设计时不在其中的数字后缀。

表单取决于数据模块中的很多数据集。是否有更简单的方法将第二个表单实例绑定到第二个数据模块的数据集,而无需使用每个单一控件的手编SomeControl.DataSource := Module2.dsSomeData

我愿意接受其他建议。一种解决方案是将数据集移到表单本身。如果设计时间数据绑定仅适用于单身人士,这似乎是一种遗憾。

+0

任何不明确,在设计安装时间必须在运行时设置。当自动创建datamodule时使用该全局变量(请参阅在项目设置中自动创建表单或查看.DPR)。如果您删除它并自动创建它,它将不会编译。将表单传递给数据模块中的方法,或将数据模块传递给表单上的方法,并将所有内容挂钩。 –

+2

形式和datamodule都不自动创建,所以全局变量不是问题。从下面发布的答案Mark看来,问题出在组件流式传输系统上。 –

+0

如果有问题,你应该在你的问题中解释它。 –

回答

1

在这个问题请看:
separate dataset instances using datamodules in delphi

基本上答案是创建DataModule中,那么你的表格,然后将创建DataModule中的名称为空字符串。这将使初始数据绑定发生,但阻止其他表单看到该模块。

另外,创建的下一个版本仍然具有原始名称(不需要数字后缀)。

+0

不错的诀窍,但它不会阻止可能丢失的设计时间设置。 – NGLN

0

我有同样的问题。我使用了以下解决方案。

我的2个窗体实例共享相同的DataModule实例。这两个表格不会同时显示。我有这样的优势,即2个表单总是显示相同的数据,因为我的数据在内存缓存中,与TCLientDataSet

例如

_dmSachkonto := TCachedDataModules.Instance.Add(TdmSachkonto) as TdmSachkonto; 

TdmSachkonto是我的DataModule。

+1

如果你有两个表单和一个DataModule,那么你就没有同样的问题!这不是对这个问题的回答。 – NGLN

1

我有一个窗体,它具有绑定到DataModule中的DataSet的数据感知控件。

这是不可能的。间接地,没问题,但必须有一个必要的数据源。 (从你的问题的其余部分,我们要提炼出这些数据源都在DataModule中的信息,但问题肯定会更加透明有关。)

我删除自动创建的全局变量时, DataModule首先添加到项目中。

好,坚持那个习俗!

令我高兴的是,设计器中的控件仍然可以绑定到DataModule中的DataSets,而不使用此全局变量。我假设IDE正在解析DataModule的dfm,因此设计人员仍然可以“看到”DataModule。

数据源和数据集之间同样不正确/混乱,但你是有一定道理:对于IDE能够找到一个DataModule中,则必须满足以下条件:

  • DataModule中必须创建/打开在IDE会话期间至少一次(在会议期间可能会关闭),请参阅(*),
  • 该DataModule的单位必须存在于Form单元的用途列表中。

当我创建窗体的两个实例,并在运行时DataModule中的两个实例,窗体的两个实例似乎只能绑定到所创建的第一个DataModule中。

这是因为您依赖于自动设计时绑定,它在运行时不起作用。该绑定取决于DataModule的名称。但这不是依靠设计时间绑定的唯一缺点,请参阅(*)。

检查DataModule的第二个实例显示Name属性具有一个数字后缀,该数字后缀在设计时并不存在。

在该序列号后缀前加上下划线。这似乎是由设计。不能有多个具有相同名称的DataModules(也不是Forms),这与不能与兄弟或子组件具有相同名称的组件具有可比性。这有点奇怪,因为当没有给所有者甚至不同的所有者时,同样的规则仍然适用于DataModules和Forms,这与默认的TComponent行为不同。我无法在RTL/VCL代码中找到证据和解释。也许它与所有DataModules和Forms保存在Screen变量中有关。我们必须接受,但这不是问题。

该窗体依赖于DataModule中的很多数据集。是否有一种更简单的方法将第二个Form实例绑定到第二个DataModule的DataSet,而不用每个控件的手编码SomeControl.DataSource := Module2.dsSomeData? ...一种解决方案是将DataSet移到Form本身。

其中dsSomedata是数据源!

是的,有一个更简单的方法。不要将DataSets放置在窗体上,而要将DataSources放置在窗体上。通常,与数据控件的数量相比,表单通常只有单个或少数DataSources。这样的数据控制 - 数据源绑定保持不变(因为两者都是从同一个DFM读取),只有数据源的数据集的设置仍然手动设置:

TCustomerForm = class(TForm) 
    DataSource: TDataSource; 
    procedure FormCreate(Sender: TObject); 
    private 
    FData: TCustomerDataModule; 
    end; 

procedure TCustomerForm.FormCreate(Sender: TObject); 
begin 
    FData := TCustomerDataModule.Create(Self); 
    DataSource.DataSet := FData.Query; 
end; 

或者,当你想创建从DataModule的形式:

TCustomerForm = class(TForm) 
    DataSource: TDataSource; 
    private 
    FData: TCustomerDataModule; 
    procedure SetData(Value: TCustomerDataModule); 
    public 
    property Data: TCustomerDataModule read FData write SetData; 
    end; 

procedure TCustomerForm.SetData(Value: TCustomerDataModule); 
begin 
    if FData <> Value then 
    begin 
    FData := Value; 
    DataSource.DataSet := FData.Query; 
    end; 
end; 

(*)与许多形式和数据模块的大项目,在IDE无法打开每一个DataModule中,和(数据源)数据集的设置可以轻松地迷失是很常见的。依赖于DataModule名称的designtime绑定,可能会导致您的Forms永远不会显示任何数据。这是一个很难预见的错误,无法检查每个表单的(DataSource。)DataSet设置。

做这一切在上述的方式,确保在运行时正确DataModule的创作,并确保IDE提供数据集的所有设计时能力和聪明,菲尔兹等..

+0

是的,数据源当然是控件和数据集之间的数据源。我假定有足够的知识回答这个问题的人已经非常熟悉数据绑定的工作细节。 18年来,他们仍然没有解决表单设计者在不同单元中的组件之间放下链接的问题。 –

+0

对不起,挑剔。我相信你对DataSources一切都很了解,但是我发现你从来没有在问题中提到它们,特别是你建议将DataSets移动到表单中的地方,这让我感到很奇怪。我现在明白,默认情况下您将数据源保留在数据集中。我试图做的一点是,这不是最好的策略。 – NGLN

相关问题