Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов функции по имени в run-time


d_oleg ©   (2007-05-28 17:36:00) 

Возникла необходимость вызвать метод объекта по имени да к тому же передать параметры. При этом на момент компиляции неизвестен сам формат метода, то есть нельзя написать банально:

type
 TMyMethod = procedure(AParam: Integer) of Object;

и потом это тип использовать. Нашел в недрах OleCtrls процедурину CallEventMethod - в-принципе, то что надо, метод вызывается, но вот с параметрами - беда. Никто не сталкивался с подобной задачей?


d_oleg   (2007-05-31 11:29:00) [1]

ObjAuto.pas, функции GetMethodInfo и ObjectInvoke отлично решают проблему.


VPBar   (2007-05-29 09:48:00) [2]

Мне в свое время на такой вопрос ответили "Интерпритатор пишешь?".
Если метод нужно описать и вызвать в рантайме, то см.
DelphiWebScript http://www.dwscript.com
Innerfuse Pascal Script III (IFPS3) http://www.carlo-kok.com/
Можно воспользоваться MSScriptControl
Все эти способы позволяют вызвать функции из длл и Dispatch методы с произвольными параметрами описываемыми в рантайме.
Чтобы вызывать published методы любого класса надо завернуть его в прокси. Типа такого TVCLProxy и TVCLScriptControl, поищи в инете по этим словам.


Сергей М.   (2007-05-29 09:08:00) [3]


> d_oleg


см. все о диспинтерфейсах (IDispatch)


d_oleg   (2007-05-29 08:52:00) [4]

> Плохиш, теория вполне изучена, спасибо.


Плохиш   (2007-05-28 23:59:00) [5]


> d_oleg ©   (28.05.07 23:43) [8]
> Поробую пояснить немного общую задачу: COM-приложение

Может стоит для начала теорию изучить, вместо изобретения велосипеда с квадратными колёсами. Начать можно с этой книги http:// www.books.ru/shop/search?search_type=+&query=5-94157-142-9


d_oleg   (2007-05-28 23:43:00) [6]

Поробую пояснить немного общую задачу: COM-приложение клиент/сервер, бизнес-логика находится на сервере, описание форм находится на сервере, клиент лишь получает текстовое описание формы, строит ее и отображает/изменяет данные посредством data snap. Соответственно, требуется для простейших операций на стороне клиента иметь возможность вызова некоторых методов объектов формы. Некоторые методы можно, конечно, заменить работой со свойствами через RTTI (и так все пока и работает), но все же вызов метода необходим...
"Чистый" (без параметров) вызов метода сейчас реализован по аналогии с CallEventMethod из OleCtrls.


d_oleg   (2007-05-28 23:36:00) [7]


> Для методов объектов - сделать их Published и использовать
> RTTI
да, в этом направлении и смотрю, но в RTTI - работа со свойствами, не с методами. Адрес метода-то я получу, а вот как выполнить его с параметрами?

Leonid Troyanovskyнет, не то. Я же говорю (в самом первом посте), что не известно заранее формат вызова метода, поэтому такое не подходит
var
CommandProc: function: Integer of object;


Leonid Troyanovsky   (2007-05-28 18:58:00) [8]


> d_oleg ©   (28.05.07 17:59) [2]

> Цель - вызывать функцию по имени, передать ей параметры.

http://rsdn.ru/Forum/Message.aspx?mid=476748&only=1

--
Regards, LVT.


Leonid Troyanovsky   (2007-05-28 18:50:00) [9]


> MBo ©   (28.05.07 18:05) [3]

> Для обычной функции - DLL можно использовать

Можно и сам exe.

--
Regards, LVT.


Loginov Dmitry   (2007-05-28 18:28:00) [10]

> Для обычной функции - DLL можно использовать


Вместо использования DLL можно записать адреса всех статических процедур в списке TList.


MBo   (2007-05-28 18:05:00) [11]

Для обычной функции - DLL можно использовать
Для методов объектов - сделать их Published и использовать RTTI


d_oleg   (2007-05-28 17:59:00) [12]


> цель какая?

Цель - вызывать функцию по имени, передать ей параметры.


MBo   (2007-05-28 17:45:00) [13]

цель какая?


Наверх

Титульная страница Поиск, карта сайта Написать письмо