Как проверить, существует ли устройство и функция?
Я использую Delphi 11. Есть ли способ запустить определенную функцию внутри TDataModule, но только если этот модуль данных существует в моем проекте?
Мне нужен способ проверить, существует ли модуль данных и вызвать функцию как строку, потому что в некоторые проекты этот модуль данных будет добавлен, а в другие - нет.
Вместо этого :
myDataModule.myfunction(param);
Было бы что-то вроде этого воображаемого кода:
if TDataModule(findcomponent('myDataModule')) <> nil then
TDataModule(findcomponent('myDataModule')).call('myfunction','param');
2 ответа
Легким решением могут быть сообщения (из System.Messaging ).
- Объявите нового потомка TMessage, содержащего параметры, необходимые для вызова
- При создании модуля данных он подписывается на этот тип сообщения, а обработчик выполняет действия.
- Вместо поиска модуля данных просто отправьте сообщение.
Это может или не может быть применимо к вашей ситуации ... Но похоже, что такую ситуацию я бы решил с помощью многоадресного события.
Ваш код будет звонить
Event.Execute('Param')
вместо того
myDataModule.myfunction(param)
.
Часть вашего кода, отвечающая за «импорт» и создание модуля данных, будет регистрироваться в событии. Что-то вроде :
EventClient := TEventClient.create(
procedure (const AParam : ParamType)
begin
myDataModule.myfunction(AParam)
end);
EventClient.Observe(Event);
Теперь этот подход имеет смысл, если причины для вызова вашей функции «событийные», но это может иметь меньше смысла в других контекстах.
Что касается библиотеки, реализующей многоадресное событие, я не могу рекомендовать ее, так как всегда использовал проприетарную. Если вам нужно вдохновение для реализации своего собственного, вы можете взглянуть на TMultiCaster в модуле Vcl.AppEvnts, который реализует более или менее ту же концепцию.