Форма поиска банка Primer. Часть 1. Готовим макет формы

2022, Feb 18    

Начинаем серию статей, в которой рассмотрим поэтапно создание в демо-банке “Primer” управляющей формы для отбора кандидатов по заданным критериям.

На примере этой формы продемонстрируем возможности управляющих форм и скриптов по созданию элементов интерфейса, контролю вводимых пользователем данных, созданию собственных диалоговых окон и взаимодействию с ними основной формы, и, конечно, по формированию запросов и отбору записей из банка данных.

Начало

Итак, обрисуем задачу. Мы собираемся создать форму, которая позволяла бы отбирать кандидатов по направлению полученного ими образования, опыту работы на конкретных должностях, общему стажу работы в этих должностях, возрасту кандидата и месту его проживания.

Для начала нам необходимо создать саму форму разместить на ней нужные элементы управления.

Общий вид формы приведен на рисунке. Названия текстовых полей (TextBox) показаны прямо на соответствующем элементе, названия кнопок (PictureButton) - в выносках. Названия надписей (Label) сейчас не важны, так как мы не будем обращаться к ним в коде.

Форма поиска

Поля txtEducation и txtCareer предназначены для записи поисковых ограничений на направление образования и занимаемые должности. Чтобы работающему с нашей формой коллеге не приходилось угадывать, какие варианты есть в банке, предложим выбирать их из списков, которые будем формировать на основе записей в базах “Образование” и “Трудовая деятельность”.

Аналогичным образом в поле txtAddress будем формировать перечень поисковых ограничений на место проживания кандидата.

В полях txtExperience, txtAgeFrom и txtAgeTo разрешим записывать ограничения на стаж работы в выбранных должностях, минимально и максимально приемлемый возраст кандидата. Формат значения - целое положительное число.

Настройки окна

Позаботимся о том, чтобы наша форма аккуратно выглядела в любой ситуации. Печально было бы видеть развернутую на весь экран форму, в углу которой сиротливо жмутся элементы ввода.

Примерно так :-(

Постараемся не допустить такого. В первую очередь запретим разворачивать окно и растягивать границу. Для этого в свойствах формы установим тип границы - “Окно диалога”, в пункте “Кнопка размера” выберем вариант “Свертывания”.

Также необходимо установить значение “Да” в свойстве “Всплывающее”. В противном случае состояние окна нашей формы будет влиять на все открытые в Cronos окна: при активировании нашей формы они все будут переходить от развернутого или свернутого состояния в нормальное.

Наконец, отключим полосы прокрутки и установим свойство “Центрировать”.

Свойства формы

Наводим лоск

Итак, теперь наша форма выглядит достаточно прилично, но все же чего-то не хватает, а именно - визуальной границы между областью условий и кнопкой “Найти”.

К сожалению, Кронос не позволяет рисовать на форме произвольные фигуры, но горизонтальную линию можно имитировать с помощью панели высотой в 1 пиксель.

Чтобы не рисовать эту панель вручную, просто добавим с модуль формы функцию Line, которая выполнит всю работу за нас.

function Line(name, y)
	local line = Panel(name,"",0,y,Me.Width,1)
	line.Transparent = false
	line.BackColor = Color.ControlDark
	line.TabStop = false
	Me:AddControl(line)
end

В функцию Line передаются в качестве параметров имя будущего элемента (каждый элемент формы должен иметь уникальное имя) и вертикальную координату для размещения панели.

Функция выполняет следующие действия:

  • создает в точке с координатами (0,y) объект класса Panel с заданным именем, шириной, равной ширине формы, и высотой 1;
  • делает панель непрозрачной;
  • окрашивает ее цветом ControlDark из системной палитры;
  • отключает возможность остановки на этой панели при обходе элементов формы клавишей Tab;
  • и, наконец, размещает созданный элемент на форме.

А теперь разместим вызов функии Line в обработчике события Load формы.

function Форма_Load( form, event )
	Line("edge",Me.btnFind.Y - 15)
end

Таким образом мы создаем линию с именем edge на расстоянии 15px выше кнопки “Найти”.

Поиск

Научим нашу форму искать хоть что-нибудь в банке. Создадим функцию MakeRequest, которая должна будет сформировать строчный запрос по заданным условиям, и обработчик события Click для кнопки “Найти”, который выполнит этот запрос и отобразит результаты.

function btnFind_Click( control, event )
	local req, err = MakeRequest()
	if req then
		local rs = GetBank():StringRequest(req)
		if not rs then 
			MsgBox("При выполнении запроса произошла ошибка\r\n"..req)
		elseif rs.Count == 0 then
			MsgBox("Подходящих записей не найдено")
		else
		--	отображение найденных записей
			GetBank():GetBase("ЛЦ"):OpenReview(rs)
			Me.WindowState = Form.Minimized
		end
	else
		MsgBox(err)
	end
end

function MakeRequest()
	local req = "ОТ ЛЦ01"
	return req
end

Пока полезной работы наша форма выполняет немного: отбирает все записи из базы “Лицо”, отображает их в стандартном окне коррекции и сворачивается.

Далее по мере совершенствования формы мы будем добавлять в функцию MakeRequest новые условия отбора.

Страница создана на основе шаблона flexible-jekyll