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

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

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

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

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

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

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

и вот такая конструкция мне очень нравится

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

myClass.Kill   PROCEDURE
tmp   &SELF
  CODE
  tmp &= SELF
  DISPOSE(tmp)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

А чем такая конструкция

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

myClass.Kill   PROCEDURE 
tmp   &SELF 
  CODE 
  tmp &= SELF 
  DISPOSE(tmp)
лучше/правильнее

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

myClass.Kill   PROCEDURE 
  CODE 
  DISPOSE(SELF)
С уважением, ДП
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Дед Пахом писал(а):А чем такая конструкция

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

myClass.Kill   PROCEDURE 
tmp   &SELF 
  CODE 
  tmp &= SELF 
  DISPOSE(tmp)
лучше/правильнее

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

myClass.Kill   PROCEDURE 
  CODE 
  DISPOSE(SELF)
а ты попробуй её реализовать, может быть в C6.x она и прокатит, не пробовал, но в ранних версиях Clarion компилер не пропускал такую конструкцию, а мне нужен универсальный код под все версии Clarion
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

Ясно. Про C6 точно могу сказать, что там работает.
С уважением, ДП
iBAH
Бывалый
Сообщения: 56
Зарегистрирован: 14 Январь 2006, 13:44
Откуда: Ярославль
Контактная информация:

Сообщение iBAH »

Andrew Myalin писал(а):...
да, блин, ну зачем же так утверждать, у меня коммерческие продукты для C5, C55, C6.x, и во всех юзается одна схема глобальных указателей, и всё работает на ура, проблема в ручках

и вот такая конструкция мне очень нравится

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

myClass.Kill   PROCEDURE
tmp   &SELF
  CODE
  tmp &= SELF
  DISPOSE(tmp)
Извиняюсь... Просто не в этой схеме дело... Проблема Clarion5 оказалась в другом: Если в качестве свойства класса1 использовать ссылку на класс2, то при вызове Метода класса2 из метода класса1 программа вылетает... т.е.

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

MyClass1.SomeMethod1 PROCEDURE()
 CODE
 self.RefMyClass2&=new(MyClass2)
 self.RefMyClass2.SomeMethod2 !здесь вылетает
классы описаны во внешнем модуле...
при этом, если вызывать тот же метод класса2 вне метода другого класса все ok

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

 !вызов в app
 RefMyClass1.RefMyClass2.SomeMethod2! а здесь все ok
А за схему еще раз спасибо: проверил на простом примере работает и в clarion5, а в C6 уже вовсю использую
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

iBAH писал(а):
Andrew Myalin писал(а):...
да, блин, ну зачем же так утверждать, у меня коммерческие продукты для C5, C55, C6.x, и во всех юзается одна схема глобальных указателей, и всё работает на ура, проблема в ручках

и вот такая конструкция мне очень нравится

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

myClass.Kill   PROCEDURE
tmp   &SELF
  CODE
  tmp &= SELF
  DISPOSE(tmp)
Извиняюсь... Просто не в этой схеме дело... Проблема Clarion5 оказалась в другом: Если в качестве свойства класса1 использовать ссылку на класс2, то при вызове Метода класса2 из метода класса1 программа вылетает... т.е.

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

MyClass1.SomeMethod1 PROCEDURE()
 CODE
 self.RefMyClass2&=new(MyClass2)
 self.RefMyClass2.SomeMethod2 !здесь вылетает
классы описаны во внешнем модуле...
при этом, если вызывать тот же метод класса2 вне метода другого класса все ok

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

 !вызов в app
 RefMyClass1.RefMyClass2.SomeMethod2! а здесь все ok
А за схему еще раз спасибо: проверил на простом примере работает и в clarion5, а в C6 уже вовсю использую
ну тут без примера трудно что сказать, одно могу сказать - это ручки, давай пример, покажу где ошибаешься
iBAH
Бывалый
Сообщения: 56
Зарегистрирован: 14 Январь 2006, 13:44
Откуда: Ярославль
Контактная информация:

Сообщение iBAH »

Andrew Myalin писал(а): ну тут без примера трудно что сказать, одно могу сказать - это ручки, давай пример, покажу где ошибаешься
сюда выложил пример (usemyclass.zip) ... http://slil.ru/22841410
запускал на Clarion5PE без патчей
Заранее спасибо
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

iBAH писал(а):
Andrew Myalin писал(а): ну тут без примера трудно что сказать, одно могу сказать - это ручки, давай пример, покажу где ошибаешься
сюда выложил пример (usemyclass.zip) ... http://slil.ru/22841410
запускал на Clarion5PE без патчей
Заранее спасибо
ну как я и говорил, ошибка в ручках, почему в C5 вылетает, а в C6 нет, объясняю

есть волшебные EQUATE

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

_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)

в C5 они декларируются в головносм .CLW проекта, в C6 в Project через Defines, в чём разница, в C5 эти EQUATE видны во всех модулях .CLW у которых MEMBER сылается на головной .CLW, в C6 - эти EQUATE видны во всех .CLW модулях, независимо от MEMBER

в твоём случае в xMyClass.clw, я после MEMBER вставил:

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

_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)
и GPF пропал

кстати, при использовании этих волшебных EQUATE надо бы и реализацию ABC классов было поглядеть, и сделать по образу и подобию, там именно так и сделано

короче, удачи в написании своих классов ;) ;) ;)
iBAH
Бывалый
Сообщения: 56
Зарегистрирован: 14 Январь 2006, 13:44
Откуда: Ярославль
Контактная информация:

Сообщение iBAH »

Andrew Myalin писал(а): ну как я и говорил, ошибка в ручках, почему в C5 вылетает, а в C6 нет, объясняю
есть волшебные EQUATE

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

_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)
в C5 они декларируются в головносм .CLW проекта, в C6 в Project через Defines, в чём разница, в C5 эти EQUATE видны во всех модулях .CLW у которых MEMBER сылается на головной .CLW, в C6 - эти EQUATE видны во всех .CLW модулях, независимо от MEMBER

в твоём случае в xMyClass.clw, я после MEMBER вставил:

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

_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)
и GPF пропал
гениально... вопрос исчерпан... спасибо
Andrew Myalin писал(а): кстати, при использовании этих волшебных EQUATE надо бы и реализацию ABC классов было поглядеть, и сделать по образу и подобию, там именно так и сделано
чего то я торможу в последнее время... я ведь даже не догадался туда посмотреть :oops: ... чего сессия с людьми делает
Andrew Myalin писал(а):короче, удачи в написании своих классов ;) ;) ;)
Будем стараться :D
iBAH
Бывалый
Сообщения: 56
Зарегистрирован: 14 Январь 2006, 13:44
Откуда: Ярославль
Контактная информация:

Сообщение iBAH »

Andrew Myalin писал(а): есть волшебные EQUATE

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

_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)
в C5 они декларируются в головносм .CLW проекта, в C6 в Project через Defines, в чём разница, в C5 эти EQUATE видны во всех модулях .CLW у которых MEMBER сылается на головной .CLW, в C6 - эти EQUATE видны во всех .CLW модулях, независимо от MEMBER
Опять поимел проблему... по не знанию... :oops:
В мульти dll пытаюсь проделать ту же операцию... gpf-а нет, но не знаю куда приляпать ссылки на класс... оставил их лежать в clw с классом, ее же сделал MEMBER('головной clw'). Когда пытаюсь пользоваться ссылками(EXTERNAL) в app... выдает Unresolved External. Волшебные EQUATES объявляю перед INCLUDE'ом в головном app и остальных, где использую класс...
Вот пример:
http://slil.ru/22886261
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

iBAH писал(а): Опять поимел проблему... по не знанию... :oops:
В мульти dll пытаюсь проделать ту же операцию... gpf-а нет, но не знаю куда приляпать ссылки на класс... оставил их лежать в clw с классом, ее же сделал MEMBER('головной clw'). Когда пытаюсь пользоваться ссылками(EXTERNAL) в app... выдает Unresolved External. Волшебные EQUATES объявляю перед INCLUDE'ом в головном app и остальных, где использую класс...
Вот пример:
http://slil.ru/22886261

не хватет CSKEYS.CLW


чтобы любые объекты были видны в других DLL необходимо их проэкспортировать в той APP, где они не EXTERNAL, для этого в Global есть соответвующий Embed - Inside to export list туды втавь

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

 $СсылкаНаКласс  @?
iBAH
Бывалый
Сообщения: 56
Зарегистрирован: 14 Январь 2006, 13:44
Откуда: Ярославль
Контактная информация:

Сообщение iBAH »

Andrew Myalin писал(а): не хватет CSKEYS.CLW


чтобы любые объекты были видны в других DLL необходимо их проэкспортировать в той APP, где они не EXTERNAL, для этого в Global есть соответвующий Embed - Inside to export list туды втавь

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

 $СсылкаНаКласс  @?
Спасибо за помощь... разобрался... все работает :D
А что такое CSKEYS.CLW?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

iBAH писал(а): А что такое CSKEYS.CLW?
а это тебя надо спросить, какой то шаблон юзаешь дополнительный или..., у меня в поставке C6.x такого файлика нету ;)
Ответить