Как вызвать динамично Routine
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Бывалый
- Сообщения: 95
- Зарегистрирован: 09 Декабрь 2005, 10:47
- Откуда: Tbilisi, Georgia
- Контактная информация:
Как вызвать динамично Routine
Добрый день!
есть в файле записи где храняеться имени Routine. (напр: 100) есть ли возможность визвать из программи ети Routine и?
Rout_Name
a1
a2
a3
....
сделал Get(file,i) - прочитал 1 ую запись (a1) , и хочу сделать: Do a1; и так далее. Есть ли возможность? с Bind ом не смог(или неправильно сделал)
P.S.
можно и процедуру
Спасибо
с уважением
Гиоргий
есть в файле записи где храняеться имени Routine. (напр: 100) есть ли возможность визвать из программи ети Routine и?
Rout_Name
a1
a2
a3
....
сделал Get(file,i) - прочитал 1 ую запись (a1) , и хочу сделать: Do a1; и так далее. Есть ли возможность? с Bind ом не смог(или неправильно сделал)
P.S.
можно и процедуру
Спасибо
с уважением
Гиоргий
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Как вызвать динамично Routine
Согласен, Evaluate() не сможет выполнить команду вроде Evaluate('Do MyRoutine').
Препроцессор просто не знает куда передать управление ....
Нужно преобразовать Routine в процедуры, описать процедуры в Map, считывать имена процедур, биндить имя с описанием процедуры и тогда уже вызывать по имени через Evaluate(). Я так думаю.
Препроцессор просто не знает куда передать управление ....
Нужно преобразовать Routine в процедуры, описать процедуры в Map, считывать имена процедур, биндить имя с описанием процедуры и тогда уже вызывать по имени через Evaluate(). Я так думаю.
За теми кто отстал - не возвращаться. (С) Кодекс
Как вызвать динамично Routine
Код: Выделить всё
Case Clip(Rout_Name)
OF 'a1'
DO a1
OF 'a2'
DO a2
...
END
С уважением Larion.
-
- Бывалый
- Сообщения: 95
- Зарегистрирован: 09 Декабрь 2005, 10:47
- Откуда: Tbilisi, Georgia
- Контактная информация:
Как вызвать динамично Routine
Да через case все ясно Larion но 1) медленный 2) не удобно когда 200+ case.
пробовал и через Procedure и Evaluate с Bind ом Игорь, но не хочет. (1010 – Illegal Expression bla bla)
может кто нибуть показать рабочий пример? clarion 6.3
пробовал и через Procedure и Evaluate с Bind ом Игорь, но не хочет. (1010 – Illegal Expression bla bla)
может кто нибуть показать рабочий пример? clarion 6.3
Как вызвать динамично Routine
С Routine вряд ли чего выйдет. А вот процедуры можно вызывать по адресу, составить таблицу "имя процедуры-адрес процедуры", в таблице находить адрес - и вызывать. Особенно полезно для реализации всяких плагинов, аддонов и прочее
Кусок из реальной программы
Я хочу по адресу вызывать процедуру типа procedure(string)
Сначала описал её тип.
Потом написал вызывалку этой процедуры
Потом в map включил "двойника"
Волшебное имя справа можно подсмотреть с map-файле, например.
Или найти в Examples\Src\Pro2exp программу, которая поможет
Теперь CallProc и CallStrProc - одна и та же программа, но CallStrProc принимает в качестве первого параметра адрес процедуры.
Ну а дальше всё просто
Регистрим процедуры
...
И вызываем
Есть и более простой способ реализации - по Over наложить адрес и ссылку на процедуру, но мне так кажется яснее.
Кусок из реальной программы
Я хочу по адресу вызывать процедуру типа procedure(string)
Сначала описал её тип.
Код: Выделить всё
StrProc(String),Type
Код: Выделить всё
CallProc PROCEDURE(StrProc P,String S) !Вызов процедуры по адресу
P(S)
RETURN
Код: Выделить всё
CallStrProc(Long,String),Name('CALLPROC@F7STRPROCSB')
Или найти в Examples\Src\Pro2exp программу, которая поможет
Теперь CallProc и CallStrProc - одна и та же программа, но CallStrProc принимает в качестве первого параметра адрес процедуры.
Ну а дальше всё просто
Код: Выделить всё
ProcQ Queue, Pre(ProcQ)
Addr Long
id Cstring(10)
End
...
Код: Выделить всё
ProcQ.Id = 'a1'; ProcQ:addr = Address(a1) ; Add(ProcQ)
ProcQ.Id = 'a2'; ProcQ:addr = Address(a2) ; Add(ProcQ)
ProcQ.Id = 'a3'; ProcQ:addr = Address(a3) ; Add(ProcQ)
И вызываем
Код: Выделить всё
ProcQ.id = 'a1'; get(ProcQ,+ProcQ:Id); CallStrProc(ProcQ.Addr, ....)
Есть и более простой способ реализации - по Over наложить адрес и ссылку на процедуру, но мне так кажется яснее.
Как вызвать динамично Routine
Если немного покорпеть над языком шаблонов, то может получиться вот такой шаблончик:
Остаётся его сохранить в папке Templates, зарегистрировать в Template Registry, добавить в необходимую процедуру в качестве Extension, набить в него 100 имен вызываемых рутинок и - вуаля - всё заработает.
Может быть вам так проще?
Код: Выделить всё
#!CallSerialRoutines.tpl
#TEMPLATE(CallSerialRoutines,'CallSerialRoutines'),FAMILY('ABC','CW20','Clarion')
#EXTENSION(CallSerialRoutines,'CallSerialRoutines'),PROCEDURE,MULTI
#BOXED('Copyright (c) 2016 ...')
#DISPLAY ('This template realizes serial routines calls')
#ENDBOXED
#SHEET
#TAB('&General')
#PROMPT('Enable',CHECK),%CallSerialRoutineEnable, AT(10,30)
#ENABLE(%CallSerialRoutineEnable=%TRUE)
#PROMPT('Routine List',@s20),%Routines,UNIQUE,MULTI('Input Values...'), AT(10,45)
#ENDENABLE
#ENDTAB
#ENDSHEET
#!-------------------------------------------------------------------------------------------------------------------
#AT(%DataSection)
#IF(%CallSerialRoutineEnable)
LOC:SerialRoutine STRING(80) #<! Use this variable before DOing of CallSerialRoutines routine
#ENDIF
#ENDAT
#AT(%ProcedureRoutines)
#IF(%CallSerialRoutineEnable)
CallSerialRoutines ROUTINE
CASE LOC:SerialRoutine
#FOR(%Routines)
OF '%Routines'; DO %Routines
#ENDFOR
END !CASE
#ENDIF
#ENDAT
#!-------------------------------------------------------------------------------------------------------------------
Может быть вам так проще?
Последний раз редактировалось Shur 21 Март 2016, 15:04, всего редактировалось 1 раз.