Страница 1 из 2

Ссылка на класс в *.inc... Область видимости?

Добавлено: 02 Июнь 2006, 16:13
iBAH
Всем привет! Был написан класс в app-файле и ссылки на него, которые используют как методы этого класса, так и я, при его использовании... все работает. Потом кидаю его описание в inc, а класс - в clw. В inc также кладу ссылки на класс (типа MyRef &MyClass; MyRef создаю методами класса). Затем INCLUDE(...inc)...
Когда пытаюсь обратиться к свойствам или вызвать метод (MyRef.SomeProp)... программа вылетает на дебаг :( .
Подскажите кто-нидь в чем дело? раньше на том же коде все работало...

Добавлено: 02 Июнь 2006, 17:44
ru_alex
Поточнее бы:
Что значит:

MyRef создаю методами класса
где includе делаешь?

а вообще лучше код в студию, простейший, и точки вставки.

Добавлено: 02 Июнь 2006, 18:45
iBAH
ru_alex писал(а):Поточнее бы:
Что значит:

MyRef создаю методами класса
где includе делаешь?

а вообще лучше код в студию, простейший, и точки вставки.
Ok... пожалста простой пример
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_
xMyClass.clw

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

  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
теперь об app-шке
затем в точке "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)

Добавлено: 03 Июнь 2006, 14:20
StillZero
из-за чего падает понятно

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

 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)
[/code]

Добавлено: 03 Июнь 2006, 18:14
iBAH
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) ссылка обнуляется... ИМХО область видимости глобальная, а значение переменной теряется...
Вопрос остается открытым: Как сделать так чтобы переменную или ссылку присвоенную в методе класса можно было использовать после вызова метода...
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)
спасибо за вариант...я уже прикидывал, что так можно сделать, но людям больше нравится MyClass1.ChooseMyClass2(1), чем CurMyClass2 &= MyC.ChooseMyClass2(1)...

Добавлено: 03 Июнь 2006, 20:36
Дед Пахом
Я так понимаю, iBAH, ты хочешь объявить переменную в inc-файле, а потом где этот файл проиклюдил, там ей и пользоваться? Смело, но неверно. INCLUDE('file.inc') - текст вставляется компилятором вместо INCLUDE, так что в модуле, где реализован класс, будет свой CurMyClass2, в апп - свой.

Добавлено: 05 Июнь 2006, 16:21
Andrew™
если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:

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

GloRef  &myClass
myClass.Constructor
   CODE
   GloRef &= SELF
в APP я декларирую такую переменную как

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

GloRef   &myClass,EXTERNAL
всё, работа с GloRef идёт на ура

Добавлено: 05 Июнь 2006, 18:10
iBAH
Andrew Myalin писал(а):если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:

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

GloRef  &myClass
myClass.Constructor
   CODE
   GloRef &= SELF
в APP я декларирую такую переменную как

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

GloRef   &myClass,EXTERNAL
всё, работа с GloRef идёт на ура
Спасибо за ответ... все действительно идет на ура :D

Добавлено: 09 Июнь 2006, 17:17
iBAH
iBAH писал(а):
Andrew Myalin писал(а):если мне надо какая то глобальная ссылка, я её декларирую в .CLW реализации типового класса, в конструкторе которого делаю присвоение:

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

GloRef  &myClass
myClass.Constructor
   CODE
   GloRef &= SELF
в APP я декларирую такую переменную как

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

GloRef   &myClass,EXTERNAL
всё, работа с GloRef идёт на ура
Спасибо за ответ... все действительно идет на ура :D
Такая схема не работает в Clarion5... когда делаю в app MyRef &= new(MyClass) программа слетает :( что делать? clw-ху к проекту подключил... та же фигня

Добавлено: 09 Июнь 2006, 17:41
ru_alex
Если тебе не нужно видеть указатель MyRef в clw, в котором лежит реализация методов класса, то объяви его в основной APP проекта прямо в глобальных данных APP, в других как external. Должно работать, у меня работает на С5, С5.5, С6

Добавлено: 09 Июнь 2006, 17:44
iBAH
ru_alex писал(а):Если тебе не нужно видеть указатель MyRef в clw, в котором лежит реализация методов класса, то объяви его в основной APP проекта прямо в глобальных данных APP, в других как external. Должно работать, у меня работает на С5, С5.5, С6
Можно и так, но у меня ссылки объявлены в clw...
Ситуация:
Класс объявлен в *.inc ...
в app делаю include, объявляю ссылку MyRef &MyClass, делаю MyRef&=new(Myclass)... слетает на Clarion5, а на Clarion6 работает...

Добавлено: 09 Июнь 2006, 17:51
ru_alex
Тогда наверное проблема в том, как ты подвязываешь inc и clw.
У меня сейчас в рабочем проекте

MyClass.inc в нем объявление типа класса и GLORef - указатель на этот тип
MyClass.clw в нем реализация методов

include(MyClass.inc) в точку вставки ABC AfterGlobalInclude в GlobalEmbeds.

MyClass.clw в проектнике как External Source Files

все в APP GLORef видно в любой процедуре APP.

Добавлено: 09 Июнь 2006, 17:58
ru_alex
Сейчас повнимательнее посмотрел код, у меня присвоение указателя идет в самой APP, так что наверное я поторопился с ответом.

Чем тебе не подходит вариант предложенный StillZero. По-моему здесь все корректно должно отрабатывать.

Добавлено: 09 Июнь 2006, 18:15
iBAH
ru_alex писал(а):Тогда наверное проблема в том, как ты подвязываешь inc и clw.
У меня сейчас в рабочем проекте

MyClass.inc в нем объявление типа класса и GLORef - указатель на этот тип
MyClass.clw в нем реализация методов

include(MyClass.inc) в точку вставки ABC AfterGlobalInclude в GlobalEmbeds.

MyClass.clw в проектнике как External Source Files

все в APP GLORef видно в любой процедуре APP.
все аналогично... однако GLORef в clw, если объявлять в *.inc то в случае, если метод класса делает GLORef&=SomeRef... в app он один фиг видит GLORef=NULL... поэтому объявление у меня GLORef &MyClass в clw, а в Global Data: GLORef &MyClass, EXTERNAL и все работало до тех пор пока меня не попросили перетащить класс в Clarion5 ... пользоваться классом вообще не дает... при любом объявлении типа MyC MyClass слетает напрочь :(

Добавлено: 09 Июнь 2006, 18:18
iBAH
ru_alex писал(а):Сейчас повнимательнее посмотрел код, у меня присвоение указателя идет в самой APP, так что наверное я поторопился с ответом.

Чем тебе не подходит вариант предложенный StillZero. По-моему здесь все корректно должно отрабатывать.
Неподходит тем, что, оказыватся ваще с классом в C5 работать невозможно... в предыдущем посте написал все