запуск метода (процедуры) по адресу

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
vd-vuf
Бывалый
Сообщения: 61
Зарегистрирован: 12 Декабрь 2008, 12:09
Откуда: Верхний Уфалей
Контактная информация:

запуск метода (процедуры) по адресу

Сообщение vd-vuf »

c6.3
что то не могу пробится
суть.
есть класс
в нем много методов
в зависмости от задачи нужно запустить по очереди нескоько методов в определенном порядке.
на данный момент это сделано так, в queue записываются номера событий
ну и потом счтиваются записи по очереди
а какую процедуру запустить определяется по CASE (case получился очень длинный) ну и плюс ко всему, неудобно при разработке
описать соьбытие (EQUATE), в CASE связать событие с процедурой (если забыл то косяк),
Хотелось бы проще, в QUEUE запихиваем очередь из адресов процедур
а потом запускем их по очереди :)

близкое решение.. завалялся у меня чейто пример:
Member()
MAP
ExternalProcedure(),BYTE,TYPE
CallAddr(*ExternalProcedure),BYTE,PROC,NAME('CallAddr')
END

CallAddr Function(Ptr)
CODE
RETURN Ptr()

НО, если вызваем CallAddr(myprocedure) то все ок
если вызывать CallAddr(SELF.myMetod)
то клаша матерится уже во время компиляции, говорит что прототип не тот.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: запуск метода (процедуры) по адресу

Сообщение Yufil »

Self.Mymethod имеет в качестве первого параметра ссылку на объект.
Если передаёшь метод Self.Method(Params), надо его тип описывать как Procedure(*Object,Params) . Ну и, соответственно, передавать ссылку на объект переходнику.
vd-vuf
Бывалый
Сообщения: 61
Зарегистрирован: 12 Декабрь 2008, 12:09
Откуда: Верхний Уфалей
Контактная информация:

Re: запуск метода (процедуры) по адресу

Сообщение vd-vuf »

неполучается :/
Yufil, нада на пальцах :)


В MAP прописано
TestProcType(),TYPE
--------
MODULE('SSOPS012.CLW')
CallTest PROCEDURE(*TestProcType UsingProc)
END

CallTest PROCEDURE (*TestProcType UsingProc) ! Declare Procedure
CODE
UsingProc
----------
В другой процедуре юзается класс

SwitchCl CLASS(SwitchClient)
TestMessage PROCEDURE
GoCallTest PROCEDURE
END

SwitchCl.TestMessage PROCEDURE
CODE
MESSAGE('UsingProc')

SwitchCl.GoCallTest PROCEDURE
CODE
CallTest(SELF.TestMessage) ! < тут ошибка
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: запуск метода (процедуры) по адресу

Сообщение Yufil »

Ну, ты описал динамический вызов процедуры БЕЗ ПАРАМЕТРОВ.
А метод класса имеет параметры. Class.Method(...) является синонимом Method(*Class,....) . Это процедура не может быть без параметов, у неё как минимум один параметр.

Привожу пример динамического вызова по адресу с параметром String

StrProc(String),Type
CallStrProc(Long,String),Name('CallProc')
CallProc(StrProc,String),Name('CallProc')

CallProc PROCEDURE (Proc,Param),Name('CallProc')
CODE
Proc(Param)

И теперь можно вызывать CallStrProc( Address(MyProc),String)
А теперь поменяй String на *Class ...
vd-vuf
Бывалый
Сообщения: 61
Зарегистрирован: 12 Декабрь 2008, 12:09
Откуда: Верхний Уфалей
Контактная информация:

Re: запуск метода (процедуры) по адресу

Сообщение vd-vuf »

Yufil, СПАСИБА, очередной раз выручил :)
расклад такой

Код: Выделить всё

    TestProcType(*SwitchClient),TYPE
   MODULE('') ! методом тык завернул объявление в module, иначе клаша ругалась на муссинг 
     CallStrTestProc(LONG,LONG),Name('CallTestProc')
   END
   CallTestProc(TestProcType,*SwitchClient),Name('CallTestProc')

CallTestProc  PROCEDURE (Proc,Param) !,Name('CallTestProc')
  CODE
  Proc(Param)

SwitchCl CLASS(SwitchClient)
TestMessage PROCEDURE
GoCallTest    PROCEDURE
             END

SwitchCl.TestMessage PROCEDURE
  CODE
  MESSAGE('UsingProc')

SwitchCl.GoCallTest PROCEDURE
  CODE
  CallStrTestProc(ADDRESS(SELF.TestMessage),ADDRESS(SELF))
Ответить