Страница 2 из 2
Ссылки на GROUP
Добавлено: 13 Январь 2020, 16:20
Игорь Столяров
Дед Пахом писал(а): ↑13 Январь 2020, 16:00Объявите LIKE(TGroup) в классе, и проблем не будет:
Уже пробовал - не работает.
Мне нужен именно адрес структуры данных, потому что работа с ней идёт через функции в DLL на VC6:
Код: Выделить всё
Self.MyGroup &= ZBarcode_Create()
If ~(Self.MyGroupl &= NULL) then Self.FlagLoad = True.
Если без класса, то всё прекрасно объявляется и работает ...
Ссылки на GROUP
Добавлено: 13 Январь 2020, 16:27
Дед Пахом
Игорь Столяров писал(а): ↑13 Январь 2020, 16:20Мне нужен именно адрес структуры данных
и кто мешает в DLL передать ADDRESS(Self.MyGroup)?
Ссылки на GROUP
Добавлено: 13 Январь 2020, 16:42
Игорь Столяров
Дед Пахом писал(а): ↑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 не работает именно внутри класса - непонятно.
Что-то здесь не то совсем.
Ссылки на GROUP
Добавлено: 13 Январь 2020, 17:19
finsoftrz
А объявление кьи структуры вместо группы не сработает?
Ссылки на GROUP
Добавлено: 13 Январь 2020, 20:42
finsoftrz
Еще как вариант можно попробовать декларировать группу внутри clw без type. Это что-то по типу модульных переменных получается. Все методы класса их видят.
Ссылки на GROUP
Добавлено: 13 Январь 2020, 21:06
Игорь Столяров
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 (8.19 КБ) 2723 просмотра
(С) Каштанка, А.П. Чехов
Ссылки на GROUP
Добавлено: 13 Январь 2020, 22:18
Дед Пахом
Не знаю, что Вы там за библиотеку курочите, но обычно C api устроено так: есть некая внутренняя структура (struct, GROUP по нашему), содержимое которой спрятано внутри и наружу обычно не выдаётся; есть инициализирующая функция, которая при успешном выполнении возвращает адрес этой структуры (void*, по нашему LONG, обычно называется хэндл); есть другие функции, которые в качестве аргумента получают этот хэндл.
То есть обычно (я много всяких сишных библиотек адаптировал, все так устроены) GROUP или ссылка на GROUP не нужна, достаточно адреса.
Ссылки на GROUP
Добавлено: 13 Январь 2020, 22:53
Игорь Столяров
Полностью согласен, возможно я чего-то изначально не понимаю …
Потрошу библиотеку ZINT:
https://sourceforge.net/projects/zint/
Да, есть внутренняя структура и я получаю её адрес из DLL и есть методы в DLL,
которые выполняют операции и в них передаётся адрес структуры.
Но перед вызовом методов, нужно выполнить установку некоторых параметров в этой структуре данных …
Вижу два варианта:
1. Описать эту структуру как GROUP, инициализировать её по адресу и менять параметры (поля GROUP).
За основу взял пример с ClaList и всё работает, пока не возникла проблема с объявлением &MyGroup внутри класса.
2. Напрямую записывать параметры по адресу структуры со смещением, через memcpy().
Но там разные типы данных - и это большая головная боль ...
Какие ещё могут быть варианты ?
Ссылки на GROUP
Добавлено: 13 Январь 2020, 23:09
Дед Пахом
Судя по примеру с их сайта, это не мой случай
Код: Выделить всё
my_symbol = ZBarcode_Create();
my_symbol->input_mode = UNICODE_MODE;
Ссылки на GROUP
Добавлено: 13 Январь 2020, 23:18
RaFaeL
Если ты можешь сам создать структуру, то создавай и передавай адрес. В классе описывай при этом просто как группу, не как указатель. Не забыть про выравнивание полей
Если надо именно записать в структуру, созданную библиотекой, то через прямую работу с памятью пожалуй проще всего. А какие там типы сложные? Real он же Double разве что, а всякие там строки один фиг тоже через адреса передаются
Еще можно, наверное (сам не пробовал), создать метод класса как (*Tgroup) и передавать туда этот полученный от библиотеки адрес, должно по идее тоже сработать, а внутри уже работать с полями
Ссылки на GROUP
Добавлено: 13 Январь 2020, 23:22
Игорь Столяров
Дед Пахом писал(а): ↑13 Январь 2020, 23:09my_symbol->input_mode = UNICODE_MODE
Так вот и я о том же …
Ссылки на GROUP
Добавлено: 13 Январь 2020, 23:46
Дед Пахом
Я бы сделал как-то так...
Код: Выделить всё
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
Ссылки на GROUP
Добавлено: 14 Январь 2020, 10:04
Игорь Столяров
Дед Пахом писал(а): ↑13 Январь 2020, 23:46
SetInt PROCEDURE(LONG pHandle, LONG pValue)
thisGrp &TGroup
CODE
thisGrp &= (pHandle)
thisGrp.i = pValue
Спасибо !
Это очень красивое решение вопроса.
Всё работает, теперь пошла рутина - наполнение класса методами и т.д.