Как проверить, существует ли устройство и функция?

Я использую Delphi 11. Есть ли способ запустить определенную функцию внутри TDataModule, но только если этот модуль данных существует в моем проекте?

Мне нужен способ проверить, существует ли модуль данных и вызвать функцию как строку, потому что в некоторые проекты этот модуль данных будет добавлен, а в другие - нет.

Вместо этого :

      myDataModule.myfunction(param);

Было бы что-то вроде этого воображаемого кода:

      if TDataModule(findcomponent('myDataModule')) <> nil then
   TDataModule(findcomponent('myDataModule')).call('myfunction','param');

2 ответа

Легким решением могут быть сообщения (из System.Messaging ).

  1. Объявите нового потомка TMessage, содержащего параметры, необходимые для вызова
  2. При создании модуля данных он подписывается на этот тип сообщения, а обработчик выполняет действия.
  3. Вместо поиска модуля данных просто отправьте сообщение.

Это может или не может быть применимо к вашей ситуации ... Но похоже, что такую ​​ситуацию я бы решил с помощью многоадресного события.

Ваш код будет звонить Event.Execute('Param') вместо того myDataModule.myfunction(param).

Часть вашего кода, отвечающая за «импорт» и создание модуля данных, будет регистрироваться в событии. Что-то вроде :

      EventClient := TEventClient.create(
                    procedure (const AParam : ParamType)
                    begin
                      myDataModule.myfunction(AParam)
                    end);
EventClient.Observe(Event);

Теперь этот подход имеет смысл, если причины для вызова вашей функции «событийные», но это может иметь меньше смысла в других контекстах.

Что касается библиотеки, реализующей многоадресное событие, я не могу рекомендовать ее, так как всегда использовал проприетарную. Если вам нужно вдохновение для реализации своего собственного, вы можете взглянуть на TMultiCaster в модуле Vcl.AppEvnts, который реализует более или менее ту же концепцию.

Другие вопросы по тегам