В плане отдыха от работы вчера-сегодня решил изучить полезные пожелания по программе сообщениями выше, которые дали специалисты форума, да и до кучи изучить новые для себя технологии программирования... Конечно делал так, как сам вижу, но учел рекомендации. Изменения программы:
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