Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизКак выполнить процедуру, имя которой содержится в переменной? Найти похожие ветки
← →
skirdov (2002-11-20 17:02) [0]В Visual FoxPro имеется понятие макроподстановки (&), т.е. допустим есть код:
a = "ProcName (<param1>, <param2>, ...)"
&a
в результате которого выполнится процедура ProcName с параметрами <param1>, <param2>, ...
А есть что-нибудь наподобие в Delphi?
← →
Skier (2002-11-20 17:05) [1]>skirdov
type
TMyProcedure = procedure(const AFirstParam, ASecondParam :
TParamType);
← →
MBo (2002-11-20 17:05) [2]именно такого нет.
есть процедурные переменные, но это не аналог
← →
Anatoly Podgoretsky (2002-11-20 17:06) [3]Нет - это особенность интерпритаторов, то ты иожешь легко это эмулировать массивами или списками или напимать свой интерпритатор
← →
Digitman (2002-11-20 17:13) [4]Делфи здесь ни при чем. Это - визуальная среда программирования, базирующаяся на Pascal"е. И не более того.
Если же вопрос - о Pascal (или Object Pascal) как о ЯЗЫКЕ программирования, имеющем аналогичные возможности, то ответ - нет. Fox - интерпретатор, Pascal - компилятор. Этим все сказано.
Вместе с этим вполне возможно, что решение "проблемы" лежит "на поверхности" (и вообще проблемы как таковой нет). Нужно всего лишь более конкретно определиться с постановкой задачи.
← →
skirdov (2002-11-20 17:15) [5]Спасибо за ответы :)
← →
Юрий Зотов (2002-11-20 19:03) [6]Все это так, но есть возможность вызвать published-метод объекта по его строковому имени. См. MethodAddress и TMethod.
← →
reonid (2002-11-20 19:29) [7]В своё время я экспериментировал с такой вещью:
Ограниченное множество зарегистрированных процедур
(могут иметь разные списки параметров), последовательность
вызовов которых может быть записана и воспроизведена.
В результате получилось нечто вроде того, о чём ты говоришь -
процедуры хранились именно в виде "SomeProc(a, b, c)".
Но у этого подхода получилось много ограничений, в
частности, параметры должны быть
простых типов и без var. (В принципе существенным моментом является то, что их можно восстановить из строкового представления - поэтому имя переменной ты не сможешь передать
ф-и - в рантайме оно не существует, кроме, разве что,
имён компонентов).
Но, возможно, некоторые ограничения удастся снять, если
принять во внимание, что ф-и не должны быть самозаписывающимися
и их вызовы не должны сохраняться между запусками приложения.
Если хочешь, могу выслать код (тестовый проект).
← →
skirdov (2002-11-20 20:26) [8]То: reonid
Если не трудно, то вышли на skirdov@yandex.ru
Спасибо.
← →
Fantasist (2002-11-21 03:03) [9]
> reonid © (20.11.02 19:29)
> В своё время я экспериментировал с такой вещью:
>
Можно поточнее в чем смысл? Хранить процедуры по именам и вызывать их по именам?
← →
reonid (2002-11-21 12:49) [10]>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();
-------------------------
а потом загрузить из файла и выполнить.
← →
PVOzerski (2002-11-21 18:42) [11]Есть еще одна возможность (притом не для методов, а именно для "автономных" процедур):
сделать их экспортируемыми по имени, а потом вызывать через GetProcAddress. Но список
параметров контролировать придется Вам самим.
← →
Fantasist (2002-11-22 00:20) [12]
> reonid © (21.11.02 12:49)
Ага, примерно ясно. А имена процедур, тоже как параметр чего- нибудь типа "WriteMacro" передаются? А то тут я подумал, что лезем в debug information и вытаскиваем оттуда имена. :)
Никому с таким геморром неохота повозиться? :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c