Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.013 c
1-4468
delphi4fun
2002-11-19 20:06
2002.12.02
Замена подстроки в строке


1-4386
Dim!S
2002-11-22 13:35
2002.12.02
oleaut32.dll


14-4580
iNew
2002-11-11 18:38
2002.12.02
Скажите, а почему у кого-то Ник синий а у кого-то черный?


3-4199
Ali2002
2002-11-13 13:29
2002.12.02
Помогите начинающему, как программно создать DBF файл


1-4502
wer1
2002-11-20 09:30
2002.12.02
Работа с вещественными числами - Exstended




   Наверх