Ссылки на GROUP

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Январь 2020, 16:00Объявите LIKE(TGroup) в классе, и проблем не будет:
Уже пробовал - не работает. :(
Мне нужен именно адрес структуры данных, потому что работа с ней идёт через функции в DLL на VC6:

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

  Self.MyGroup  &= ZBarcode_Create()
  If ~(Self.MyGroupl &= NULL) then Self.FlagLoad = True.
Если без класса, то всё прекрасно объявляется и работает ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылки на GROUP

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

Игорь Столяров писал(а): 13 Январь 2020, 16:20Мне нужен именно адрес структуры данных
и кто мешает в DLL передать ADDRESS(Self.MyGroup)?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Январь 2020, 16:27и кто мешает в DLL передать ADDRESS(Self.MyGroup)
Именно так далее работа и идёт с группой по адресу … но !
Сначала ведь надо инициализировать эту структуру данных получив её адрес ИЗ DLL …

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

   Self.MyGroup  &= ZBarcode_Create()  ! Вот здесь проблемка-с
   ...
   If ~(Self.MyGroupl &= NULL)
      ZBarcode_Encode(Address(Self.MyGroup),Loc:Cod,0) 
      ! и т.д. здесь всё понятно и проблем нет
В принципе, ZBarcode_Create() возвращает просто ULONG с адресом на созданную им структуру данных (*Struct),
но почему элементарное объявление MyGroup &TGroup не работает именно внутри класса - непонятно.
Что-то здесь не то совсем. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Ссылки на GROUP

Сообщение finsoftrz »

А объявление кьи структуры вместо группы не сработает?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Ссылки на GROUP

Сообщение finsoftrz »

Еще как вариант можно попробовать декларировать группу внутри clw без type. Это что-то по типу модульных переменных получается. Все методы класса их видят.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

finsoftrz писал(а): 13 Январь 2020, 20:42Еще как вариант можно попробовать декларировать группу внутри clw без type
Можно. Но по сути это получится просто объявление в Global … со всеми вытекающими последствиями. ;)
А ещё можно пойти на изврат и обмануть компилятор там, где он этого меньше всего ожидал … ;)

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

TGroup         Group,Type
Number             Long
Phone                CString(121)
                    end

XXX Group,Type   ! 1. ЗАВОРАЧИВАЕМ ССЫЛКУ НА ГРУППУ
YYY &TGroup
  end                    

TClass           Class, Type, Module('XXX.clw'), Link('XXX.clw')
!MyGroup              &TGroup     ! <--- ОШИБКА: НЕВЕРНЫЙ ТИП ДАННЫХ
MyGroup               Like(XXX)    ! 2. Теперь в MyGroup.YYY у нас есть &TGroup
FlagLoad              Byte(False)
                    end
Компьютер супротив человека, всё равно что плотник супротив столяра !
smile28.gif
smile28.gif (8.19 КБ) 2612 просмотров
(С) Каштанка, А.П. Чехов
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылки на GROUP

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

Не знаю, что Вы там за библиотеку курочите, но обычно C api устроено так: есть некая внутренняя структура (struct, GROUP по нашему), содержимое которой спрятано внутри и наружу обычно не выдаётся; есть инициализирующая функция, которая при успешном выполнении возвращает адрес этой структуры (void*, по нашему LONG, обычно называется хэндл); есть другие функции, которые в качестве аргумента получают этот хэндл.
То есть обычно (я много всяких сишных библиотек адаптировал, все так устроены) GROUP или ссылка на GROUP не нужна, достаточно адреса.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

Полностью согласен, возможно я чего-то изначально не понимаю … :(
Потрошу библиотеку ZINT: https://sourceforge.net/projects/zint/

Да, есть внутренняя структура и я получаю её адрес из DLL и есть методы в DLL,
которые выполняют операции и в них передаётся адрес структуры.

Но перед вызовом методов, нужно выполнить установку некоторых параметров в этой структуре данных … :(
Вижу два варианта:

1. Описать эту структуру как GROUP, инициализировать её по адресу и менять параметры (поля GROUP).
За основу взял пример с ClaList и всё работает, пока не возникла проблема с объявлением &MyGroup внутри класса.

2. Напрямую записывать параметры по адресу структуры со смещением, через memcpy().
Но там разные типы данных - и это большая головная боль ...

Какие ещё могут быть варианты ? :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылки на GROUP

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

Судя по примеру с их сайта, это не мой случай :(

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

    my_symbol = ZBarcode_Create();
    my_symbol->input_mode = UNICODE_MODE;
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Ссылки на GROUP

Сообщение RaFaeL »

Если ты можешь сам создать структуру, то создавай и передавай адрес. В классе описывай при этом просто как группу, не как указатель. Не забыть про выравнивание полей
Если надо именно записать в структуру, созданную библиотекой, то через прямую работу с памятью пожалуй проще всего. А какие там типы сложные? Real он же Double разве что, а всякие там строки один фиг тоже через адреса передаются
Еще можно, наверное (сам не пробовал), создать метод класса как (*Tgroup) и передавать туда этот полученный от библиотеки адрес, должно по идее тоже сработать, а внутри уже работать с полями
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Январь 2020, 23:09my_symbol->input_mode = UNICODE_MODE
Так вот и я о том же … :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Ссылки на GROUP

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

Я бы сделал как-то так...

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

  PROGRAM

TGroup                        GROUP, TYPE
i                               LONG
r                               REAL
                              END

internalGrp                   LIKE(TGroup)
handle                        LONG, AUTO

  MAP
    GetGroupRef(), LONG
    SetInt(LONG pHandle, LONG pValue)
  END

  CODE
  handle = GetGroupRef()
  SetInt(handle, 200)
  MESSAGE('i='& internalGrp.i &'; r='& internalGrp.r)

GetGroupRef                   PROCEDURE()
  CODE
  internalGrp.i = 100
  internalGrp.r = 3.14
  RETURN ADDRESS(internalGrp)
  
SetInt                        PROCEDURE(LONG pHandle, LONG pValue)
thisGrp                         &TGroup
  CODE
  thisGrp &= (pHandle)
  thisGrp.i = pValue
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Январь 2020, 23:46 SetInt PROCEDURE(LONG pHandle, LONG pValue)
thisGrp &TGroup
CODE
thisGrp &= (pHandle)
thisGrp.i = pValue
Спасибо ! :) Это очень красивое решение вопроса.
Всё работает, теперь пошла рутина - наполнение класса методами и т.д. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить