Часто бывает необходимо организовать работу через терминал сбора данных (ТСД). Нередко бывает так, что организация использует терминалы с различными разрешениями экрана. Делать различные формы под каждое разрешение, конечно не сложно, но это можно не делать, если форму сделать такой, чтобы она сама подстраивалась под любое разрешение. При этом должен подстраиваться и шрифт на элементах формы.
Для начала сделаем форму под самый малый размер ТСД, а именно 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");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат;
КонецПроцедуры
События «ПослеОткрытия» нет, но есть событие, которое срабатывает сразу же После открытия формы. Это - «ОбновлениеОтображения». Мы этим событием для определения конечных размеров формы и установления размеров шрифтов воспользуемся только раз и вызовем от-туда функцию, которая изменит размеры шрифтов.
В итоге получим модуль формы:
Перем сткИсходныеРазмеры;
Перем ФлФормаОткрыта;
Процедура ОбновлениеОтображения()
Если НЕ ФлФормаОткрыта Тогда
ПриИзмерениеРазмеровФормы(ЭтаФорма,сткИсходныеРазмеры);
ФлФормаОткрыта = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ФлФормаОткрыта = Ложь;
сткИсходныеРазмеры = Новый Структура("Ширина,Высота",ЭтаФорма.Ширина,ЭтаФорма.Высота);
КонецПроцедуры
Функции «ПриИзмененииРазмеровФормы» и «ВернутьСочетаниеКлавиш» мы поместим в глобальный модуль, чтобы их можно было вызвать из других форм.