gifts2017

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

Опубликовал Konstantin Cherepanov (chekonst) в раздел Программирование - Работа с интерфейсом

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

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

Для начала сделаем форму под самый малый размер ТСД, а именно 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");

                           КонецЕсли;

                    КонецЕсли;

             КонецЕсли;         

       КонецЦикла;

       Возврат;

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

 

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

 

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

 

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

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

 

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

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

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

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

       КонецЕсли;

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

 

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

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

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

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

 

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

 

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Misha ⁠ (Magister) 21.02.13 01:28
Оригинальный способ назначения горячих клавиш!
Зачет :)
2. Доржи Балбаров (Angeros) 21.02.13 04:39
Я что-то вообще не понял что это за функция "ВернутьСочетаниеКлавиш"?! Кто ее вызывает? Откуда взялся уид в конце функции?
3. Доржи Балбаров (Angeros) 21.02.13 04:45
По(2)вник походу, но непонятно откуда вы такой метод выдумали?!
4. Yura Yura (YuraLu) 21.02.13 06:53
Я в реале сталкивался с такой проблемой. Сяду курить методу. Если получится, то прекрасно...
5. Konstantin Cherepanov (chekonst) 21.02.13 10:15
(3) Angeros,
Методу назначения горячих клавиш нашел уже давно, где то в дебрях интернета. Мне ее лишь пришлось немного доработать. А основная метода по ТСД родилась после того, как в очередной раз "достали" с изменением размеров ТСД. "Задолбало" каждый раз переписывать или перенастраивать.
6. Павел Егоров (SatanClaws) 21.02.13 10:44
7. Доржи Балбаров (Angeros) 21.02.13 10:44
По моему настоящий програмерский пост. То что и нужно. +
8. andrey dyak (dyak84) 21.02.13 11:04
Спасибо очень пригодилось
9. roman melnikov (Mell) 21.02.13 12:03
Интересный пост, имеем много ТСД, но подключали их только стандатрными способами. Узнал много нового)
10. Алексей (pablo_escobar) 21.02.13 16:25
Что то не пойму как использовать эти формы на ТСД? В режиме терминального доступа?
11. Konstantin Cherepanov (chekonst) 21.02.13 16:31
Да, именно в терминальном режиме
12. Михаил С. (Milanick) 22.02.13 10:14
Ребята, кто работал с ТСД и штрих кодами, подскажите , с чего начать можно. Горю желанием попробовать сие чуда техники, но не знаю как подойти к этому
13. Konstantin Cherepanov (chekonst) 22.02.13 10:23
С покупки ТСД. Подключение к 1С через терминальное соединение. У ТСД разрешения обычно 240*320 или 480*640. В ТСД установлена программа для передачи штрих кода непосредственно в поле ввода, она позволяет передать код через терминальное соединение в приложение.
Можно для пробы взять также телефон с разрешением 240*320 или 480*640 и операционной системой windows for mobile ну или небольшой GPS навигатор с wifi с windows CE. Считывать он штрих коды, конечно не будет, но на нем можно отладить интерфейс.
14. Константин Куликов (Светлый ум) 22.02.13 10:27
Респект, то чего обычно не хватает под рукой.
15. Михаил С. (Milanick) 22.02.13 10:51
chekonst
Есть список ТСД, которые нормально интегрятся с 1С, без бубнов?
16. Konstantin Cherepanov (chekonst) 22.02.13 11:03
Выпускают разные ТСД под разные задачи, под разные температурные и влажностные режимы: складские , почтовые и прочие. Список здесь в открытом доступе опубликовать не могу, т.к. это будет либо рекламой либо антирекламой.
17. Анатолий Бычин (tolyan_ekb) 22.02.13 12:31
Есть информация на сколько хватает зарядки ТСД в режиме терминального доступа? Есть ли другая технология, например, веб-клиент, которая выигрывает по энергозатратам?
18. Василий Петров (expert.1c8) 22.02.13 21:01
(15) Да тоже интересен такой список для склада, например, дешевый сегмент,
личный опыт - это часто и есть та самая реклама..
19. oleg (opus70) 05.05.13 18:08
подскажите как назначить кнопкам клавиши
не понятно где использовать
ВернутьСочетаниеКлавиш(...
20. Сергей (Che) Коцюра (CheBurator) 24.12.14 04:27
Незачет
Отсутствуют скрины-примеры получившейся формы
Меня как потребителя мало интересует код
В первую очередь интересует юзабельный интерфейс

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