![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выполнить процедуру, имя которой содержится в переменной? [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]именно такого нет.
есть процедурные переменные, но это не аналог