我有一个窗体,它具有绑定到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提供数据集的所有设计时能力和聪明,菲尔兹等..
任何不明确,在设计安装时间必须在运行时设置。当自动创建datamodule时使用该全局变量(请参阅在项目设置中自动创建表单或查看.DPR)。如果您删除它并自动创建它,它将不会编译。将表单传递给数据模块中的方法,或将数据模块传递给表单上的方法,并将所有内容挂钩。 –
形式和datamodule都不自动创建,所以全局变量不是问题。从下面发布的答案Mark看来,问题出在组件流式传输系统上。 –
如果有问题,你应该在你的问题中解释它。 –