Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-4442
SONY
2002-11-20 08:11
2002.12.02
Календарь на HTML


6-4527
Лана Розанова
2002-10-04 10:57
2002.12.02
HELP......me


14-4582
Txxx
2002-11-08 01:57
2002.12.02
Принтер + Сканер = Ксерокс.


14-4621
alex134
2002-11-12 20:18
2002.12.02
Мышь оптическая A4


7-4654
Mac_b
2002-09-29 10:11
2002.12.02
отсчёты временных интервалов