ATOL драйвер 10.x
Добавлено: 10 Июль 2020, 20:19
Многие библиотеки на си или делфи однопоточные. При использовании их в mdi окнах вылезают разные сюрпризы. Скорее всего, это тот случай.
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Жуть ! Я это пробовал: открывал NotMDI модальное окно и даже передавал при вызове его {Prop:Handle} - не помогает.
Код: Выделить всё
cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
Код: Выделить всё
_libfptr_fn_query_data_ LONG,STATIC,NAME('libfptr_fn_query_data')
...
cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
Код: Выделить всё
libfptr_fn_query_data(LONG fptr),LONG,RAW,C,PROC,DLL(_libfptr_fn_query_data_)
Код: Выделить всё
!- - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - -!
Atol10.fnQueryData PROCEDURE()!,LONG,PROC
!- - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - - = * = - -!
CODE
IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
RETURN libfptr_fn_query_data(SELF.fptr)
!. . . . . к о н е ц п р о ц е д у р ы . . . . . .!
Код: Выделить всё
LOC:fn_Serial STRING(25)
...
fnQueryData PROCEDURE(),LONG,PROC
CODE
ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
ATOL.fnQueryData()
LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)
MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
Да, но применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE...Yufil писал(а): ↑30 Сентябрь 2020, 15:43 Иногда помогает парочка UnlockThread() - LockThread()
UnlockThread вызывается перед обращением к OLE-объекту, а LockThread - после обращения.
Если у объекта есть GUI - строго обязательно.
Да, внутри cкобок UnlockThread - LockThread многие кларионовские вычисления недопустимы, передал-получил значения - закрывайся!
Игорь Столяров писал(а): ↑30 Сентябрь 2020, 18:09 О, точно ! Спасибо ! Вот это ещё забыл попробовать с вызовом метода окна настройки
драйвера АТОЛ ДКК10 libfptr_show_properties(). Сейчас сделаем и проверим.
Код: Выделить всё
IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
RETURN libfptr_show_properties(SELF.fptr, LIBFPTR_GUI_PARENT_NATIVE, WindowHandle)
Ну про OLE написал Юрий, в справке этого нет. Блокировка применяется к внешним вызовам с интерфейсом.SergioRaguzini писал(а): ↑30 Сентябрь 2020, 18:37 применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE
Да оно всегда открывается. Но при первом вызове из MDI окна как "с того света" (секунд 30), а если
Вы прикрутили некий метод по принципу похожести. Смысл действия ?
Игорь, извиняюсь за тугодумие, описание fnQueryData() я сделал интуитивно по аналогии с нормально работающей QueryData()Игорь Столяров писал(а): ↑30 Сентябрь 2020, 19:40 ...В справке АТОЛ ДККТ10 есть огромный раздел "Запрос информации из ФН" на человеческом языке.
В нём, в т.ч., подробно описано получение серийного номера ФН...
для получения серийного номера используются дополнительные size, а что будет эквивалентом в Clarion-программе и как правильно сделать аналогичный вызов для Clarion, я, к сожалению не пойму (+ м.б. мое описание fnQueryData() неверно?) потому и прошу помощи на примере куска кодаlibfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring fnSerial = std::wstring(&str[0]);
Куска когда нет, как и фискализированного накопителя.
Код: Выделить всё
Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
Atol10.FNQueryData()
Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
Игорь, Спасибо! Но в том то и дело что это (у меня, к сожалению) не работает! Гляньте несколько сообщений вверх, вот мое с которого я начал сегодняшнее обсуждение:Игорь Столяров писал(а): ↑30 Сентябрь 2020, 21:55 ...На вскидку:Код: Выделить всё
Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO) Atol10.FNQueryData() Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
идентичны ! если бы заработало - было бы хорошо, но это не так. Будет минутка - попробуйте у себяхочу получить серийный номер, вызываю:Код: Выделить всё
LOC:fn_Serial STRING(25) ... fnQueryData PROCEDURE(),LONG,PROC CODE ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO) ATOL.fnQueryData() LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER) MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
Номер ФН отображается независимо от того фискализирован он или нет
Я не вижу в этом коде проблем.
Не согласен - ошибка явно указывает на некорректное состояние ФН.SergioRaguzini писал(а): ↑30 Сентябрь 2020, 22:38 Номер ФН отображается независимо от того фискализирован он или нет
Дело не в том - фискализирован ли ФН или нет - информация о нем (номер ФН и т.д.) должна отображаться. Я, конечно, больше работал с "ШТРИХ"-ами, но, наверняка АТОЛ работает по такому же принципу.Игорь Столяров писал(а): ↑30 Сентябрь 2020, 22:41 ...не фискализирован ФН и как следствие не проходит запрос на параметры ФН...