2013-09-19 4 views
0

Как получить доступ к экземпляру удаленного модуля данных (RDM) из другого устройства во время выполнения? (RDM - единственный экземпляр). Когда я создаю нормального потомка Data Data, Delphi создает переменную для него в одном модуле (например: MyDM: TMyDM), но когда я создаю потомок RDM, нет переменной.Как получить доступ только к экземпляру TRemoteDataModule на моем сервере приложений

Я пытаюсь установить поставщика TClientDataSet, созданного во время выполнения на другом устройстве, в TDataSetProvider в моем RDM, но я не могу найти ссылку на экземпляр RDM.

Я также пытался это сделать во время разработки, но пока у меня нет проблем с установкой свойства соединения TSQLQuery с того же устройства на TSQLConnection в этом RDM, я не смог установить поставщика TClientDataSet, потому что ни один провайдер из RDM не появляется в списке поставщиков TClientDataSet.

+0

Кажется, здесь мало людей (включая меня), которые понимают, чего вы действительно хотите. Я предлагаю перефразировать вопрос и дать дополнительную информацию, чтобы сделать проблему понятной. –

+0

Любая идея, как я мог бы перефразировать вопрос? –

+0

Я предполагаю, что проблема заключается в том, что вы устанавливаете поставщика в TClientDataset в удаленном datamodule во время разработки, но этот провайдер не был найден во время выполнения. Вот почему вы решили установить провайдера самостоятельно, по коду. Я прав? – AlexSC

ответ

4

Прежде всего вам нужно установить свойство вашего клиента dataset RemoteServer, назначить ему экземпляр компонента TLocalConnection (который должен быть размещен на удаленном модуле данных, так как вы не используете его удаленно). Разумеется, модуль удаленного модуля данных должен быть в разделе uses устройства с клиентским набором данных.

Затем вы можете присвоить свой собственный набор данных вашего клиента ProviderName.

0

Я провел некоторое исследование на TRemoteDataModule и узнал, что он предназначен для поддержки серверов приложений COM.

У вас нет переменной для вашего RDM, потому что вы не должны, чтобы получить к нему доступ, как обычный DM. Сервер приложений будет создавать экземпляр RDM в ответ на удаленный вызов, как и любое COM-приложение. Он будет уничтожен, когда больше нет ссылок на этот RDM.

Поскольку жизненный цикл этого объекта зависит от клиента, а не сервер, имеющий ссылку на него на сервере, очень опасен. Вы никогда не знаете, когда это действительно или нет. Кроме того, будет существовать более одного экземпляра, по одному для каждого клиента, который обращается к этому объекту в данный момент.

Учитывая, что, я считаю, очень разумно сказать вам, что невозможно получить доступ к RDM после его создания, чтобы выполнить исправление, которое вы намереваетесь сделать.

Если вам действительно нужно положить TDatasetProvider в другое устройство, то мое лучшее предложение - сделать RDM искать этого провайдера в какой-то службе опроса провайдеров. Подобным образом вы сможете найти провайдера, который вам нужен, каждый раз, когда создается новый RDM и только при его создании.

В вашем месте я бы добавил обработчик события OnCreate RDM, и в этом обработчике я бы назвал метод вроде TProviderPool.GetProvider. Этот метод даст мне провайдера, и я бы присвоил его имя свойству ProviderName CDS.

+0

В этом случае RDM является единственным экземпляром, другими словами, каждый клиент запускает собственный сервер приложений с одним экземпляром RDM. Я просто подумал, что можно получить ссылку на этот экземпляр. –

+0

@ Даниэль: Да, я заметил это под вопросом после написания ответа, но все продолжает применяться. Даже будучи единственным экземпляром, вы не знаете, когда он будет создан, потому что создание COM-объекта является ответом на «CreateRemoteObject()», который происходит в клиентах. И когда клиент удаляет ссылку на удаленный сервер, объект COM будет уничтожен, что является другим событием, которое не может быть замечено каким-либо кодом вне кода RDM. – AlexSC