0

如何在运行时从另一个单元访问我的远程数据模块 (RDM) 的实例?(RDM 是单实例)。当我创建一个普通的数据模块后代时,Delphi 在同一单元中为它创建一个变量(例如:MyDM: TMyDM),但是当我创建一个 RDM 的后代时,没有变量。

我正在尝试将在运行时在另一个单元中创建的 TClientDataSet 的提供者设置为我的 RDM 中的 TDataSetProvider,但我找不到对我的 RDM 实例的引用。

我也尝试在设计时这样做,但是虽然将 TSQLQuery 的连接属性从同一单元设置到该 RDM 中的 TSQLConnection 没有问题,但我无法设置 TClientDataSet 的提供程序,因为没有来自RDM 出现在 TClientDataSet 的提供者列表中。

4

2 回答 2

4

首先,您需要设置RemoteServer客户端数据集的属性,为其分配一个组件实例TLocalConnection(应将其放在远程数据模块上,因为您没有远程使用它)。当然,远程数据模块单元必须在带有客户端数据集的单元的使用子句中。

然后,您可以分配ProviderName客户端数据集的属性。

于 2013-09-19T20:08:20.083 回答
0

我做了一些研究TRemoteDataModule并了解到它专门用于支持 COM 应用程序服务器。

您的 RDM 没有变量的事实是因为您不应该像常规 DM 那样访问它。应用服务器将实例化 RDM 以响应远程调用,就像任何 COM 应用程序一样。当不再存在对该 RDM 的引用时,它将被销毁。

由于该对象的生命周期取决于客户端,而不是服务器,因此在服务器中引用它是非常危险的。你永远不知道它什么时候有效。此外,将存在多个实例,一个用于在给定时刻访问该对象的每个客户端。

考虑到这一点,我相信告诉您在创建 RDM 以执行您打算执行的更正后无法访问它是非常合理的。

如果您确实需要将其放在TDatasetProvider不同的单元中,那么我最好的建议是让 RDM 在某种提供者轮询服务中寻找该提供者。这样做将使您能够在每次实例化新 RDM 时并且仅在实例化时找到所需的提供程序。

在您的位置,我将向OnCreateRDM 的事件添加一个处理程序,并在该处理程序中调用一个类似TProviderPool.GetProvider. 该方法会给我一个提供者,我会将其名称分配给ProviderNameCDS 的属性。

于 2013-09-19T18:55:00.353 回答