Быстро пишем форму для ТСД для «неуправляемого» интерфейса.

В этой статье автор делится опытом как быстро и просто написать или изменить формы, размер которых сам подстроится под терминал сбора данных (ТСД).

Часто бывает необходимо организовать работу через терминал сбора данных (ТСД). Нередко бывает так, что организация использует терминалы с различными разрешениями экрана. Делать различные формы под каждое разрешение, конечно не сложно, но это можно не делать, если форму сделать такой, чтобы она сама подстраивалась под любое разрешение. При этом должен подстраиваться и шрифт на элементах формы.

Для начала сделаем форму под самый малый размер ТСД, а именно 235х310. Он должен быть чуть меньше реального (240 х 320) , чтобы  точно избежать дополнительных элементов прокрутки. Дело в том, что ими пользоваться в ТСД очень неудобно, т.к. нельзя прикрутить клавиши ТСД.

 

Затем на форму поместим таблицу, клавиши, поле для ввода. Способ отображения окна сделаем «Максимизированное» и поставим галку на Режим рабочего стола, чтобы окно открывалось во весь экран ТСД.

На форму добавим  4 кнопки «Вверх», «Вниз», «Ввод» и «Закрыть». К кнопкам формы «Вверх», «Вниз» (которые у нас будут перемещать выделенную строку в таблице) мы привяжем соответствующие клавиши ТСД, к кнопке «Закрыть» привяжем клавишу «ECS», а к кнопке «Ввод» — «ENTER».

Теперь о привязке кнопок. Воспользуемся нестандартным способом привязки горячих клавиш, поскольку, стандартным нельзя привязать Enter и многие другие.

Функция ВернутьСочетаниеКлавиш(Знач КодКлавиши, Alt=Ложь, Ctrl =Ложь, Shift=Ложь) Экспорт

    Если ТипЗнч(КодКлавиши)=Тип(«Строка») Тогда

             КодыКлавиш =Новый Соответствие();

             КодыКлавиш.Вставить(«ESC»,27);

             КодыКлавиш.Вставить(«TAB»,9);

        КодыКлавиш.Вставить(«BACKSPACE»,8);

             КодыКлавиш.Вставить(«ENTER»,13);

             КодыКлавиш.Вставить(«SHIFT»,16);

             КодыКлавиш.Вставить(«CTRL»,17);

             КодыКлавиш.Вставить(«ALT»,18);

             КодыКлавиш.Вставить(«CAPSLOCK»,20);

        КодыКлавиш.Вставить(«SPACE»,20);

        КодыКлавиш.Вставить(«END»,35);

             КодыКлавиш.Вставить(«HOME»,36);

        КодыКлавиш.Вставить(«LEFT»,37);

             КодыКлавиш.Вставить(«UP»,38);

        КодыКлавиш.Вставить(«RIGHT»,39);

        КодыКлавиш.Вставить(«DOWN»,40);

        КодыКлавиш.Вставить(«INS»,45);

        КодыКлавиш.Вставить(«DEL»,46);

             КодыКлавиш.Вставить(«F1»,112);

             КодыКлавиш.Вставить(«F2»,113);

             КодыКлавиш.Вставить(«F3»,114);

             КодыКлавиш.Вставить(«F4»,115);

             КодыКлавиш.Вставить(«F5»,116);

             КодыКлавиш.Вставить(«F6»,117);

             КодыКлавиш.Вставить(«F7»,118);

             КодыКлавиш.Вставить(«F8»,119);

             КодыКлавиш.Вставить(«F9»,120);

             КодыКлавиш.Вставить(«F10»,121);

             КодыКлавиш.Вставить(«F11»,122);

             КодыКлавиш.Вставить(«F12»,123);

             текКод = КодыКлавиш.Получить(ВРЕГ(КодКлавиши));

             Если текКод=Неопределено Тогда

                    Возврат Неопределено;

             Иначе 

                 КодКлавиши = текКод;

             КонецЕсли;

       КонецЕсли;

      

      

    Модификатор = 0;

       Если Alt Тогда

             Модификатор = Модификатор + 16;

       ИначеЕсли Ctrl Тогда

             Модификатор = Модификатор + 8;

       ИначеЕсли Shift Тогда

             Модификатор = Модификатор + 4;

       КонецЕсли;

 

    стрВнутр = «{«»#»»,69cf4251-8759-11d5-bf7e-0050bae2bc79,1,» + Символы.ПС + «{0,» + КодКлавиши + «,» + Модификатор + «}» + Символы.ПС + «}»;

    Возврат ЗначениеИзСтрокиВнутр(стрВнутр);

КонецФункции

 

После того как мы привяжем основные клавиши, мы сможем сэкономить место на ТСД, если уберем основные под таблицу, поместив ее на передний план.

 

 

 

Теперь сделаем привязки элементов формы так, чтобы они масштабировались.

    

 

 

Когда возникает событие формы «ПередОткрытием», форма еще имеет исходные размеры. Мы запомним эти размеры. Потом уже после открытия формы и изменения ее под размер экрана мы отмасштабируем шрифты (а элементы формы изменят размер сами в соответствии с настройками привязок) следующей процедурой, в которой увеличим шрифт либо в соответствии с новыми размерами формы, либо подстроив его под размер поля ввода по формуле, что 1 пункт размера шрифта это ¾ пиксела:

 

Процедура ПриИзмененииРазмеровФормы(Форма,сткИсходныеРазмеры=0) Экспорт

       Если сткИсходныеРазмеры=0 Тогда

             сткИсходныеРазмеры = Новый Структура(«Ширина,Высота»,240,320);

       КонецЕсли;

 

       КоэфУвеличения =  Окр(Форма.Высота/сткИсходныеРазмеры.Высота,0);

      

       Для каждого Элемент Из Форма.ЭлементыФормы Цикл

             Если ТипЗнч(Элемент) = Тип(«ПолеВвода») Тогда

                    текШрифт =  Элемент.Шрифт;

                    текРазмер =  (Элемент.Высота-2)*3/4;

                    Элемент.Шрифт = Новый Шрифт(текШрифт,,текРазмер);

             ИначеЕсли ТипЗнч(Элемент) = Тип(«ТабличноеПоле») Тогда

                    текШрифт =  Элемент.Шрифт;

                    текРазмер =  текШрифт.Размер*КоэфУвеличения;

                    Элемент.Шрифт = Новый Шрифт(текШрифт,,текРазмер);

                    Элемент.ШрифтШапки =  Новый Шрифт(текШрифт,,текРазмер);

                   

                    КоэфШирины =  Форма.Ширина/сткИсходныеРазмеры.Ширина;

                    Для Каждого текКолонка Из  Элемент.Колонки Цикл

                           Если текКолонка.Видимость Тогда

                                  текКолонка.Ширина = текКолонка.Ширина*КоэфШирины;

                           КонецЕсли;

                    КонецЦикла;

 

             Иначе

                    Попытка

                           текШрифт =  Элемент.Шрифт;

                    Исключение

                        Продолжить;

                    КонецПопытки;

              текШрифт =  Элемент.Шрифт;

                    текРазмер =  текШрифт.Размер*КоэфУвеличения;

                    Элемент.Шрифт = Новый Шрифт(текШрифт,,текРазмер);

                    Если ТипЗнч(Элемент) = Тип(«Кнопка») Тогда

                           Если Элемент.Имя = «КнопкаЗакрыть» Тогда

                                  Элемент.СочетаниеКлавиш =ВернутьСочетаниеКлавиш(«ESC»);

                           ИначеЕсли Элемент.Имя = «КнопкаВверх» Тогда

                       Элемент.СочетаниеКлавиш =ВернутьСочетаниеКлавиш(«UP»);

                           ИначеЕсли Элемент.Имя = «КнопкаВниз» Тогда

                       Элемент.СочетаниеКлавиш =ВернутьСочетаниеКлавиш(«DOWN»);

                           ИначеЕсли Элемент.Имя = «КнопкаВвод» Тогда

                       Элемент.СочетаниеКлавиш =ВернутьСочетаниеКлавиш(«ENTER»);

                           КонецЕсли;

                    КонецЕсли;

             КонецЕсли;         

       КонецЦикла;

       Возврат;

КонецПроцедуры

 

 События «ПослеОткрытия» нет, но есть событие, которое срабатывает сразу же После открытия формы. Это  — «ОбновлениеОтображения». Мы этим событием для определения конечных размеров формы и  установления размеров шрифтов воспользуемся только раз и вызовем от-туда функцию, которая изменит размеры шрифтов.

 

В итоге получим модуль формы:

 

Перем сткИсходныеРазмеры;

Перем ФлФормаОткрыта;

 

Процедура ОбновлениеОтображения()

       Если НЕ ФлФормаОткрыта Тогда

             ПриИзмерениеРазмеровФормы(ЭтаФорма,сткИсходныеРазмеры);

             ФлФормаОткрыта = Истина;

       КонецЕсли;

КонецПроцедуры

 

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

       ФлФормаОткрыта = Ложь;

       сткИсходныеРазмеры  = Новый Структура(«Ширина,Высота»,ЭтаФорма.Ширина,ЭтаФорма.Высота);

КонецПроцедуры

 

Функции «ПриИзмененииРазмеровФормы» и «ВернутьСочетаниеКлавиш» мы поместим в глобальный модуль, чтобы их можно было вызвать из других форм.

 

 

20 Comments

  1. Magister

    Оригинальный способ назначения горячих клавиш!

    Зачет 🙂

    Reply
  2. Angeros

    Я что-то вообще не понял что это за функция «ВернутьСочетаниеКлавиш»?! Кто ее вызывает? Откуда взялся уид в конце функции?

    Reply
  3. Angeros

    По(2)вник походу, но непонятно откуда вы такой метод выдумали?!

    Reply
  4. YuraLu

    Я в реале сталкивался с такой проблемой. Сяду курить методу. Если получится, то прекрасно…

    Reply
  5. chekonst

    (3) Angeros,

    Методу назначения горячих клавиш нашел уже давно, где то в дебрях интернета. Мне ее лишь пришлось немного доработать. А основная метода по ТСД родилась после того, как в очередной раз «достали» с изменением размеров ТСД. «Задолбало» каждый раз переписывать или перенастраивать.

    Reply
  6. SatanClaws

    (3) Angeros, года 3 уже как здесь было:

    http://infostart.ru/public/22214/

    Reply
  7. Angeros

    По моему настоящий програмерский пост. То что и нужно. +

    Reply
  8. dyak84

    Спасибо очень пригодилось

    Reply
  9. Mell

    Интересный пост, имеем много ТСД, но подключали их только стандатрными способами. Узнал много нового)

    Reply
  10. pablo_escobar

    Что то не пойму как использовать эти формы на ТСД? В режиме терминального доступа?

    Reply
  11. chekonst

    Да, именно в терминальном режиме

    Reply
  12. Milanick

    Ребята, кто работал с ТСД и штрих кодами, подскажите , с чего начать можно. Горю желанием попробовать сие чуда техники, но не знаю как подойти к этому

    Reply
  13. chekonst

    С покупки ТСД. Подключение к 1С через терминальное соединение. У ТСД разрешения обычно 240*320 или 480*640. В ТСД установлена программа для передачи штрих кода непосредственно в поле ввода, она позволяет передать код через терминальное соединение в приложение.

    Можно для пробы взять также телефон с разрешением 240*320 или 480*640 и операционной системой windows for mobile ну или небольшой GPS навигатор с wifi с windows CE. Считывать он штрих коды, конечно не будет, но на нем можно отладить интерфейс.

    Reply
  14. Светлый ум

    Респект, то чего обычно не хватает под рукой.

    Reply
  15. Milanick

    chekonst

    Есть список ТСД, которые нормально интегрятся с 1С, без бубнов?

    Reply
  16. chekonst

    Выпускают разные ТСД под разные задачи, под разные температурные и влажностные режимы: складские , почтовые и прочие. Список здесь в открытом доступе опубликовать не могу, т.к. это будет либо рекламой либо антирекламой.

    Reply
  17. tolyan_ekb

    Есть информация на сколько хватает зарядки ТСД в режиме терминального доступа? Есть ли другая технология, например, веб-клиент, которая выигрывает по энергозатратам?

    Reply
  18. expert.1c8

    (15) Да тоже интересен такой список для склада, например, дешевый сегмент,

    личный опыт — это часто и есть та самая реклама..

    Reply
  19. opus70

    подскажите как назначить кнопкам клавиши

    не понятно где использовать

    ВернутьСочетаниеКлавиш(…

    Reply
  20. CheBurator

    Незачет

    Отсутствуют скрины-примеры получившейся формы

    Меня как потребителя мало интересует код

    В первую очередь интересует юзабельный интерфейс

    Возможно из статьи почерпну полезное

    Придется видимо переписывать интерфейс промышленной wms на восьмерке

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *