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

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

Как выполнить процедуру, имя которой содержится в переменной? [D6]


skirdov ©   (2002-11-20 17:02:00) 

В Visual FoxPro имеется понятие макроподстановки (&), т.е. допустим есть код:
a = "ProcName (, , ...)"
&a
в результате которого выполнится процедура ProcName с параметрами , , ...
А есть что-нибудь наподобие в Delphi?


Fantasist   (2002-11-22 00:20:00) [1]


> reonid © (21.11.02 12:49)


Ага, примерно ясно. А имена процедур, тоже как параметр чего- нибудь типа "WriteMacro" передаются? А то тут я подумал, что лезем в debug information и вытаскиваем оттуда имена. :)
Никому с таким геморром неохота повозиться? :)



PVOzerski   (2002-11-21 18:42:00) [2]

Есть еще одна возможность (притом не для методов, а именно для "автономных" процедур):
сделать их экспортируемыми по имени, а потом вызывать через GetProcAddress. Но список
параметров контролировать придется Вам самим.


reonid   (2002-11-21 12:49:00) [3]

>Fantasist © (21.11.02 03:03)
>Можно поточнее в чем смысл? Хранить процедуры по именам и >вызывать их по именам?

По сути обычная макросов.

Организовано это так:
Существует класс TMacro.
Внутри скобок Macro1.BeginRecord – Macro1.EndRecord все вызовы некоторого подмножества процедур
с их аргументами фиксируются в объекте Macro1.

(внутри каждой процедуры требуется некий специальный код типа
WriteMacro(@MyProc, [args...]); - хотя. если поместить
их в ДЛЛ - может быть, можно без этого и обойтись,
играясь с таблицами импорта???- но будет ли это проще...)

Их можно сохранить в текстовый файл вида

------macro.txt--------------
SomeProc(10, 20);
OtherProc(40, 70);
ThirdProc("test");
LastProc();
-------------------------

а потом загрузить из файла и выполнить.


Fantasist   (2002-11-21 03:03:00) [4]


> reonid © (20.11.02 19:29)
> В своё время я экспериментировал с такой вещью:
>


Можно поточнее в чем смысл? Хранить процедуры по именам и вызывать их по именам?


skirdov   (2002-11-20 20:26:00) [5]

То: reonid

Если не трудно, то вышли на skirdov@yandex.ru
Спасибо.


reonid   (2002-11-20 19:29:00) [6]

В своё время я экспериментировал с такой вещью:

Ограниченное множество зарегистрированных процедур
(могут иметь разные списки параметров), последовательность
вызовов которых может быть записана и воспроизведена.

В результате получилось нечто вроде того, о чём ты говоришь -
процедуры хранились именно в виде "SomeProc(a, b, c)".

Но у этого подхода получилось много ограничений, в
частности, параметры должны быть
простых типов и без var. (В принципе существенным моментом является то, что их можно восстановить из строкового представления - поэтому имя переменной ты не сможешь передать
ф-и - в рантайме оно не существует, кроме, разве что,
имён компонентов).

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

Если хочешь, могу выслать код (тестовый проект).


Юрий Зотов   (2002-11-20 19:03:00) [7]

Все это так, но есть возможность вызвать published-метод объекта по его строковому имени. См. MethodAddress и TMethod.


skirdov   (2002-11-20 17:15:00) [8]

Спасибо за ответы :)


Digitman   (2002-11-20 17:13:00) [9]

Делфи здесь ни при чем. Это - визуальная среда программирования, базирующаяся на Pascal"е. И не более того.
Если же вопрос - о Pascal (или Object Pascal) как о ЯЗЫКЕ программирования, имеющем аналогичные возможности, то ответ - нет. Fox - интерпретатор, Pascal - компилятор. Этим все сказано.

Вместе с этим вполне возможно, что решение "проблемы" лежит "на поверхности" (и вообще проблемы как таковой нет). Нужно всего лишь более конкретно определиться с постановкой задачи.


Anatoly Podgoretsky   (2002-11-20 17:06:00) [10]

Нет - это особенность интерпритаторов, то ты иожешь легко это эмулировать массивами или списками или напимать свой интерпритатор


Skier   (2002-11-20 17:05:00) [11]

>skirdov
type
TMyProcedure = procedure(const AFirstParam, ASecondParam :
TParamType);


MBo   (2002-11-20 17:05:00) [12]

именно такого нет.
есть процедурные переменные, но это не аналог


Наверх

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