Ссылка на класс в *.inc... Область видимости?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Ссылка на класс в *.inc... Область видимости?
Всем привет! Был написан класс в app-файле и ссылки на него, которые используют как методы этого класса, так и я, при его использовании... все работает. Потом кидаю его описание в inc, а класс - в clw. В inc также кладу ссылки на класс (типа MyRef &MyClass; MyRef создаю методами класса). Затем INCLUDE(...inc)...
Когда пытаюсь обратиться к свойствам или вызвать метод (MyRef.SomeProp)... программа вылетает на дебаг .
Подскажите кто-нидь в чем дело? раньше на том же коде все работало...
Когда пытаюсь обратиться к свойствам или вызвать метод (MyRef.SomeProp)... программа вылетает на дебаг .
Подскажите кто-нидь в чем дело? раньше на том же коде все работало...
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Ok... пожалста простой примерru_alex писал(а):Поточнее бы:
Что значит:
MyRef создаю методами класса
где includе делаешь?
а вообще лучше код в студию, простейший, и точки вставки.
xMyClass.inc
Код: Выделить всё
OMIT('_EndOfInclude_',_xRPTClassPresent_)
_xRPTClassPresent_ EQUATE(1)
!**********************************************************
MyClass1 CLASS,TYPE,MODULE('xMyClass.clw'),LINK('xMyClass.clw',_ABCLinkMode_), DLL(_ABCDllMode_)
!описание свойств/методов
Construct PROCEDURE()
Destruct PROCEDURE()
QMyClass2 &QueMyClass2
AddMyClass2 PROCEDURE()
ChooseMyClass2 PROCEDURE(LONG NElement)
END
MyClass2 CLASS,TYPE,MODULE('xMyClass.clw'),LINK('xMyClass.clw',_ABCLinkMode_), DLL(_ABCDllMode_)
!описание свойств/методов
END
QueMyClass2 QUEUE, TYPE
IClass &MyClass2
END
CurMyClass2 &MyClass2
_EndOfInclude_
Код: Выделить всё
MEMBER
MAP.
INCLUDE('xMyClass.inc'),ONCE
MyClass1.Construct PROCEDURE()
CODE
self.QMyClass2 &= new QueMyClass2
MyClass1.Destruct PROCEDURE()
CODE
! тут все мочим
MyClass1.AddMyClass2 PROCEDURE()
CODE
self.QMyClass2.IClass &= new MyClass2
ADD(self.QMyClass2)
MyClass1.ChooseMyClass2 PROCEDURE(LONG NElement)
GET(self.QMyClass2, NElement)
CurMyClass2&=self.QMyClass2.IClass
затем в точке "After GLOBAL INCLUDEs"
Код: Выделить всё
INCLUDE('xMyClass.inc'),ONCE
Код: Выделить всё
Local Data
MyC &MyClass1
CODE
MyC &= new MyClass1
MyC.AddMyClass2()
MyC.ChooseMyClass2(1)
!!!до этих пор все ok, а когда я обращаюсь к CurMyClass2 програма слетает
CurMyClass2.SomeProperty=...
dispose(MyC)
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
из-за чего падает понятно
но причина лежит вне области моего понимания
можно обойти данный момент изменив метод ChooseMyClass2[/code]
Код: Выделить всё
MyC.ChooseMyClass2(1)
if CurMyClass2 &= NULL then message('CurMyClass2 &= NULL').
можно обойти данный момент изменив метод ChooseMyClass2
Код: Выделить всё
! прототип - будем возвращать ссылку
ChooseMyClass2 PROCEDURE(LONG NElement),LONG
! код метода
MyClass1.ChooseMyClass2 PROCEDURE(LONG NElement)
code
GET(self.QMyClass2, NElement)
if errorcode() then message('get error').
return address(self.QMyClass2.IClass)
! и собственно сам вызов
CurMyClass2 &= MyC.ChooseMyClass2(1)
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
причина падения действительно очевидна...StillZero писал(а):из-за чего падает понятно
но причина лежит вне области моего пониманияКод: Выделить всё
MyC.ChooseMyClass2(1) if CurMyClass2 &= NULL then message('CurMyClass2 &= NULL').
Когда мы делаем
Код: Выделить всё
MyClass1.ChooseMyClass2 PROCEDURE(LONG NElement)
GET(self.QMyClass2, NElement)
CurMyClass2&=self.QMyClass2.IClass
Message(CurMyClass2.SomeProperty)! все ok
Вопрос остается открытым: Как сделать так чтобы переменную или ссылку присвоенную в методе класса можно было использовать после вызова метода...
спасибо за вариант...я уже прикидывал, что так можно сделать, но людям больше нравится MyClass1.ChooseMyClass2(1), чем CurMyClass2 &= MyC.ChooseMyClass2(1)...StillZero писал(а): можно обойти данный момент изменив метод ChooseMyClass2Код: Выделить всё
! прототип - будем возвращать ссылку ChooseMyClass2 PROCEDURE(LONG NElement),LONG ! код метода MyClass1.ChooseMyClass2 PROCEDURE(LONG NElement) code GET(self.QMyClass2, NElement) if errorcode() then message('get error'). return address(self.QMyClass2.IClass) ! и собственно сам вызов CurMyClass2 &= MyC.ChooseMyClass2(1)
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Я так понимаю, iBAH, ты хочешь объявить переменную в inc-файле, а потом где этот файл проиклюдил, там ей и пользоваться? Смело, но неверно. INCLUDE('file.inc') - текст вставляется компилятором вместо INCLUDE, так что в модуле, где реализован класс, будет свой CurMyClass2, в апп - свой.
С уважением, ДП
если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:
в APP я декларирую такую переменную как
всё, работа с GloRef идёт на ура
Код: Выделить всё
GloRef &myClass
myClass.Constructor
CODE
GloRef &= SELF
Код: Выделить всё
GloRef &myClass,EXTERNAL
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Спасибо за ответ... все действительно идет на ураAndrew Myalin писал(а):если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:в APP я декларирую такую переменную какКод: Выделить всё
GloRef &myClass myClass.Constructor CODE GloRef &= SELF
всё, работа с GloRef идёт на ураКод: Выделить всё
GloRef &myClass,EXTERNAL
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Такая схема не работает в Clarion5... когда делаю в app MyRef &= new(MyClass) программа слетает что делать? clw-ху к проекту подключил... та же фигняiBAH писал(а):Спасибо за ответ... все действительно идет на ураAndrew Myalin писал(а):если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:в APP я декларирую такую переменную какКод: Выделить всё
GloRef &myClass myClass.Constructor CODE GloRef &= SELF
всё, работа с GloRef идёт на ураКод: Выделить всё
GloRef &myClass,EXTERNAL
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Можно и так, но у меня ссылки объявлены в clw...ru_alex писал(а):Если тебе не нужно видеть указатель MyRef в clw, в котором лежит реализация методов класса, то объяви его в основной APP проекта прямо в глобальных данных APP, в других как external. Должно работать, у меня работает на С5, С5.5, С6
Ситуация:
Класс объявлен в *.inc ...
в app делаю include, объявляю ссылку MyRef &MyClass, делаю MyRef&=new(Myclass)... слетает на Clarion5, а на Clarion6 работает...
Последний раз редактировалось iBAH 09 Июнь 2006, 17:56, всего редактировалось 1 раз.
-
- Ветеран
- Сообщения: 333
- Зарегистрирован: 21 Сентябрь 2005, 11:05
- Откуда: Нижний Новгород
- Контактная информация:
Тогда наверное проблема в том, как ты подвязываешь inc и clw.
У меня сейчас в рабочем проекте
MyClass.inc в нем объявление типа класса и GLORef - указатель на этот тип
MyClass.clw в нем реализация методов
include(MyClass.inc) в точку вставки ABC AfterGlobalInclude в GlobalEmbeds.
MyClass.clw в проектнике как External Source Files
все в APP GLORef видно в любой процедуре APP.
У меня сейчас в рабочем проекте
MyClass.inc в нем объявление типа класса и GLORef - указатель на этот тип
MyClass.clw в нем реализация методов
include(MyClass.inc) в точку вставки ABC AfterGlobalInclude в GlobalEmbeds.
MyClass.clw в проектнике как External Source Files
все в APP GLORef видно в любой процедуре APP.
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
все аналогично... однако GLORef в clw, если объявлять в *.inc то в случае, если метод класса делает GLORef&=SomeRef... в app он один фиг видит GLORef=NULL... поэтому объявление у меня GLORef &MyClass в clw, а в Global Data: GLORef &MyClass, EXTERNAL и все работало до тех пор пока меня не попросили перетащить класс в Clarion5 ... пользоваться классом вообще не дает... при любом объявлении типа MyC MyClass слетает напрочьru_alex писал(а):Тогда наверное проблема в том, как ты подвязываешь inc и clw.
У меня сейчас в рабочем проекте
MyClass.inc в нем объявление типа класса и GLORef - указатель на этот тип
MyClass.clw в нем реализация методов
include(MyClass.inc) в точку вставки ABC AfterGlobalInclude в GlobalEmbeds.
MyClass.clw в проектнике как External Source Files
все в APP GLORef видно в любой процедуре APP.
-
- Бывалый
- Сообщения: 56
- Зарегистрирован: 14 Январь 2006, 13:44
- Откуда: Ярославль
- Контактная информация:
Неподходит тем, что, оказыватся ваще с классом в C5 работать невозможно... в предыдущем посте написал всеru_alex писал(а):Сейчас повнимательнее посмотрел код, у меня присвоение указателя идет в самой APP, так что наверное я поторопился с ответом.
Чем тебе не подходит вариант предложенный StillZero. По-моему здесь все корректно должно отрабатывать.