Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > КИС Lack & УС Land

Программа вывода из оборота маркированной молочной продукции : КИС Lack & УС Land

23.04.2024 15:24


31.12.2022 18:17
student
 
Зависит от того что надо если нигде больше не используется то зачем получать? Тупо переключать :)
Если используется то опрелить на старте в переменную и дёргать её а не винпапи
Но это уже дело вкуса...
31.12.2022 18:55
FinSoft
 
Переключить раскладку можно разными способами, а не только в нашем приложении программно. Поэтому вначале надо проверить, так как проверка менее затратная операция, чем переключение. Поэтому сохранение в переменной не прокатывает в обычной ситуации. Если я правильно понял, у тебя программа блокирует все остальное на компьютере, поэтому ты сделал через переменную.
31.12.2022 21:44
student
 
Блокировка есть или нет какя разница :) в винде есть настройка которая позволяет ей запоминать раскладки по окнам при их (окнах) переключении
.. Студент должен быть достаточно ленивым чтобы не делать лишней работы... (препод)
01.01.2023 11:17
FinSoft
 
Ммм... Пользователь может переключить раскладку через комбинацию клавиш или через языковую панель. Если это не заблокировано, то узнать текущую раскладку можно через функцию win api, я другого варианта не вижу. Она для этого и предназначена.
Ещё такой момент. Изменение настроек винды для обеспечения работоспособности отдельного приложения так себе идея, которая может прокатить в каких-то специфических ситуациях. В целом же мы не знаем, какой софт ещё будет работать на компьютере пользователя.
01.01.2023 11:37
student
 
Фишка запоминания раскладки приложения системная и включена по дефолту :) т.е. отслеживать внешнее смысла не имеет и пофиг какой там софт и кто там и чем раскладку переключает...
А внутри у себя ты сам себе хозяин и смысл постоянно проверять раскладку?
01.01.2023 14:28
FinSoft
 
Надо конкретнее писать, я тебя не понимаю. Например, у меня в приложении есть форма ввода, где может использоваться и кириллица, и латиница. Есть одно поле ввода, когда оно получает фокус, надо принудительно переключиться на латиницу. Находясь на другом поле ввода, я нажал ctrl+alt и переключился на кириллицу. Далее, жму tab, перехожу на поле, где нужна латиница. Как я в этом случае могу узнать, какая раскладка клавиатуры активная?

Откуда такая паника в использовании функции win api, которая предназначена для определения текущей раскладки? В наших приложениях под винду все на win api в конечном счёте, явно мы к нему обращаемся или через какую-то надстройку.
01.01.2023 16:12
student
 
Цитата:
FinSoft Как я в этом случае могу узнать, какая раскладка клавиатуры активная?
зачем ?
Цитата:
FinSoft надо принудительно переключиться на латиницу
просто переключайся принудительно - твое приложение ты и так знаешь где что у тебя должно быть - если был ENG и тебе нужен ENG - один вызов апи, если был RUS - два вызова, а при потере фокуса принудительно RUS т.к.
Цитата:
FinSoft одно поле ввода
и подводить теорию про монопольность и переключение окон кка это было в самом начале это лишнее :)

Цитата:
FinSoft Откуда такая паника в использовании функции win api
абсолютно никакой паники :) просто я за минимизацию телодвижений... но это уже дело вкуса и предлагаю закончить бессмысленную дискуссию :)
с наступившим !
01.01.2023 16:33
FinSoft
 
Ничего так и не понял. Проверка это одно обращение к апи, переключение это два обращения к апи (смотри приведённый код). В каких-то случаях экономим, в каких-то наоборот делаем лишнее. А с учётом того, что оформляется в виде библиотечной функции, вообще никакой минимизации телодвижений нет, прикладной код идентичный. Потом, вначале ты про запоминание раскладки в каких-то переменных писал...

Ладно, забиваем. С Новым годом!
06.01.2023 10:02
AndreyZh
 
В плане отдыха от работы вчера-сегодня решил изучить полезные пожелания по программе сообщениями выше, которые дали специалисты форума, да и до кучи изучить новые для себя технологии программирования... Конечно делал так, как сам вижу, но учел рекомендации. Изменения программы:

1. При запуске программы zV, которая однопроходная, проверяю на раскладку клавиатуры и рекомендую перевести на английскую раскладку, что не обязательно, если у пользователя аллергия на неё и используется подход копипаста:





Опишу для программистов подход. Инструмент разработки xHarbour: https://olegon.ru/showthread.php?t=17546 не имеет средств прямого обращения к API Windows, возможно по причине его многоплатформенности? Однако компилятор языка вначале переводит исходный код на ЯП Harbour в С++ код, который затем преобразуется в машинный код компилятором C++, как следствие ЯП С++ является родным "подмножеством" инструмента разработки и фрагменты на данном языке можно вставлять в любом месте программы

Вызов функций С++ для переключения раскладки:
Код:
	//	Проверка на текущую английскую раскладку и при необходимости, если не она, то перевожу на английскую
	IF !lIs_eng_kbd(@cRs)
		IF Fyn("Для сканера нужна английская раскладка! Перевести?",cHelpc) THEN ENG()
	ENDI
Непосредственно используемые функции и способ включения их в исходный код программы:
Код:
/*	Работа с анализом и изменением  раскладки клавиатуры - принудительный переход на латынь при вводе со сканера
Список раскладок: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values?view=windows-11
Базовый код для четырех раскладок (русская, английская, украина, армения), но их может быть больше
lIs_eng	:= lIs_eng_kbd(@rsl)
ШРИФТ ДЛЯ ФУНКЦИЙ С ВАЖЕН
*/

//	Набор функций проверки текущей раскладки
FUNC lIs_eng_kbd(rsl)
	rsl	:= RASKLADKA()
	RETU (rsl== "00000409")
FUNC lIs_rus_kbd(rsl)
	rsl	:= RASKLADKA()
	RETU (rsl== "00000419")
FUNC lIs_ukr_kbd(rsl)
	rsl	:= RASKLADKA()
	RETU (rsl== "00000422")
FUNC lIs_arm_kbd(rsl)
	rsl	:= RASKLADKA()
	RETU (rsl== "0000042b")

//	Набор функций для принудительного переключения раскладок ENG(), RUS(), UKR(), ARM() и проверки Raskladka на С++
#pragma BEGINDUMP
#include "Windows.h"
#include "hbapi.h"
HB_FUNC(RUS) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; }
HB_FUNC(ENG) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; }
HB_FUNC(UKR) { LoadKeyboardLayout("00000422", KLF_ACTIVATE) ; }
HB_FUNC(ARM) { LoadKeyboardLayout("0000042b", KLF_ACTIVATE) ; }

HB_FUNC(RASKLADKA)
{
TCHAR m_PreviousLayout[KL_NAMELENGTH] ;
GetKeyboardLayoutName(m_PreviousLayout);
hb_retc(m_PreviousLayout);
}
#pragma ENDDUMP

2. Читаем атрибуты акта вывода из оборота - сделал чуть красивше:





3. При вводе кода марки любым способом проверяю на вхождение в код марок русских букв, которые там не должны быть:




Это реализуется кодом на Harbour:

Код:
	//	Очищение от пробелов и проверка на вхождение русских букв
	nLen 	:= Len( cSh:=Alltrim(cSh) )
	cStr 	:= Upper(cSh)
	FOR nI := 1 TO nLen
		IF Subs(_ZRUS,nI,1) $ cStr
			ErrMess("Код марки не должен содержать русские буквы! При чтении со сканера переключите на английскую раскладку!",cError)
			RETU FALSE
		ENDI
	NEXT nI


P.S. Новая версия программы сейчас и в дальнейшем размещена в первом сообщении темы: https://olegon.ru/showthread.php?t=37545
14.02.2023 11:02
AndreyZh
 
Если судить по числу скачек, то интереса к программе нет, а посему ограничусь скрином и побудительным мотивам для небольших доработок. Было пару звонков с вопросами - замечаниями, что программа недостаточно хорошо помогает в своей работе:

1. Соседние ларёчники, другое ИП, попросили вывести из оборота часть молочки, т.к. кассу не адаптировали, а "ЧЗ" пристаёт к ним с замечаниями. Сделали XML для вывода, несколько раз попытались отправить - бесполезно, позвонили... Долго выяснял, но так и не понял о причине пока сами "опера" не подсказали, что неверно вводили их ИИН. Добавлен контроль на валидность вводимого ИНН;
2. Да и "здесь" переклинивало - забывали от куда забирать на сервис "ЧЗ" созданные файлы. Добавил подсказку о каталоге от куда брать файлы. Определяется текущий каталог программы.

... Недавно спрашивал... Более "заморочек" не возникало:

Часовой пояс GMT +3, время: 15:24.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.