CALLBACK ?

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Hi, All

А вот такой вопрос :
Как средствами Клары (ну, скажем, С55) сымитировать вызов CallBack-рутинок ?
Что имеется ввиду.
Допустим, есть N пусть оконных процедурок (W1 - Wn).
В каждой из них надо выполнить определенный один и тот же код.
Естественно оформить этот код в виде внешней процедуры (пусть PROC1).
НО! В каждой из Wi надо проделать что-то сугубо"личное" _внутри_PROC1 (например, если в Wi есть кнопка, то сделать ?Button{Prop:Text}='ЭТО КНОПКА"}, а если есть String, то Prop = "ЭТО НЕ КНОПКА, а СТРОКА"). Посьба не заостряться на функционале этой "личной" обработки.
Хотелось бы в каждой из Wi определить ряд рутинок (R1-Rk), заполнить адресами Rj некоторый глобальный вектор или очередь и вызвать PROC1, в коде которой предусмотрено :
Если элемент вектора ненулевой, то передать управление по этому адресу.

Не могу сообразить КАК :
1 передать управление
2 куда вернется управление после Rj (надо в PROC1)

С уважением,
Анатолий

(Добавление)

проще через типовой класс, а не через процедуру:

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

myClassType    CLASS
W                    &Window

! необходимый набор свойств

Init                  PROCEDURE(Window W)
Init                  PROCEDURE(),VIRTUAL
 END

myClassType.Init        PROCEDURE(Window W)
    CODE
 SELF.W &= W

 SELF.Init

myClassType.Init        PROCEDURE
    CODE
 !общая подготовка для всех окон
далее в каждой оконной процедуре делаешь в EMBED Data section,

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

myClass        CLASS(myClassType)
Init                PROCEDURE(),VIRTUAL
 END
после открытия онка вызываешь в EMBED After Open Window
myClass.Init(Window)

реализуешь виртуальный метод в EMBED Local Procedures:

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

myClass.Init        PROCEDURE
    CODE

! тут своя подготовка конкретно для каждого окна

 PARENT.Init ! общая подгтовка
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com

(Добавление)

Вопрос честно говоря не очень понял, но рискну ответить как понял.
**************************************
Глобально описываем некий класс

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

MyProcClass    CLASS,TYPE
Proc                   PROCEDURE,VIRTUAL
                       END
Метод с общим для всех кодом, дополнительная обработка будет в наследниках

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

MyProcClass.Proc  PROCEDURE
  CODE
В каждой процедуре Wn создаем экземпляр порожденного класса

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

MyWProc        CLASS(MyProcClass)
Proc                   PROCEDURE,VIRTUAL
                       END
И вот тут уже метод, который делает все что нужно в данной конкретной процедуре Wn

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

MyWProc.Proc  PROCEDURE
  CODE
  DO Routine1      ! Некая уникальная для Wn обработка
  PARENT.Proc() ! Вызываем родительский метод, содержащий некий общий код.
  DO Routine2      ! Некая уникальная для Wn обработка
Ну и собственно где нужно выполнить функционал (планируемый для PROC1) в Wn вызываем MyWProc.Proc()
**************************************
ООП, однако. Угадал с ответом? :D

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)

Нет, не угадал (или я не вижу)

Надо

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

Wi  Procedure
   code
do  PROC1

R1  Routine
..............
R2  Routine
..............
Rk  Routine

PROC1  Routine  !!!!!!!!!!!!!!!!!!
common code 1
do R1
common code2
do R2
common code 3
........................
.......................
do Rk
common code k+1
! end PROC1
end   !Wi
Исходный вопрос - чтбы PROC1 НЕ Routine, а PROCEDURE а начинка каждого Rj своя для каждого Wi.

На счет разбить PROC1 на PROC1 - PROCk - я в курсе, но не интересно.

Спасибо, аналогично.
Анатолий.
Нет, не угадал (или я не вижу)
Наверное, не видишь :D

Ну аналогично все, только вместо рутин Rn виртуальные методы

**************************************
Глобально (или в данных модуля) описываем некий класс

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

MyProcClass    CLASS,TYPE
PROC1               PROCEDURE
R1                      PROCEDURE,VIRTUAL
R2                      PROCEDURE,VIRTUAL
R3                      PROCEDURE,VIRTUAL
...

Rk                      PROCEDURE,VIRTUAL
                       END
Метод с общим для всех кодом, это и есть внешняя процедура PROC1

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

MyProcClass.PROC1 PROCEDURE
  CODE
 common code 1
 SELF.R1()
 common code2
 SELF.R2()
 common code 3
 ........................
 .......................
 SELF.Rk()
 common code k+1
Виртуальные методы пустыми, будут использоваться виртуальные методы наследников

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

MyProcClass.Rk  PROCEDURE
 CODE
В каждой процедуре Wn создаем экземпляр порожденного класса

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

MyWProc        CLASS(MyProcClass)

R1                      PROCEDURE,VIRTUAL
R2                      PROCEDURE,VIRTUAL
R3                      PROCEDURE,VIRTUAL
...

Rk                      PROCEDURE,VIRTUAL
                       END
Вместо рудин описываем эти виртуальные методы.
Ну и собственно где нужно вызываем MyWProc.PROC1()
**************************************
Теперь понятно? :)

Удачи!
__________________________________
Владимир Якимченко
Написал: ClaList(2)
Ответить