Работа с формами Lazarus
Эта статья врядли будет интересна тем, кто раньше программировал в Delphi. Она в большей степени рассчитана на программистов VB, MS Access и других средств быстрой разработки. В каждой системе существуют свои правила и подходы, касающиеся программного открытия экранных форм, а также передачи и возврата пареметров. Вот я и хочу рассказать о том, как это сделано в Lazarus. При этом я предполагаю, что читатель достаточно хорошо понимает принципы ООП и уже знаком с синтаксисом языка Free Pascal.
Открытие форм в модальном режиме
Наиболее очевидным применением программного открытия дополнительной формы является выбор или поиск какого-либо значения в справочнике с последующим возвратом, например, кода найденного элемента в основную форму. Такую форму надо открывать модально, так как нет смысла продолжать выполнение основной программы, пока не сделан выбор и форма не закрыта. Попробуем это реализовать.
В качестве примера создадим новый проект и на главную форму поместим пару полей ввода и кнопок:
В качестве тестовой задачи будем открывать дополнительную форму с полем ввода, в котором первоначально должен содержаться текст из соответствующего поля ввода главной формы. Далее предусмотрим изменение этого текста и возврат обновленного значения в главную форму. Для этого сначала создадим дополнительную форму примерно такого вида:
В качестве программного интерфейса для передачи параметра будем использовать свойство TestValue, которое определим в секции public класса формы. Также определим и реализуем более чем очевидные методы для установки и считывание значения свойства, а также обработчик события нажатия на кнопку, в котором свойству формы ModalResult присваивается значение mrOK, что и приводит к закрытию (но не уничтожению!) формы.
Однако, самый большой интерес представляет функция RunTestForm. Как можно заметить, она определена вне класса формы, хотя и в том же модуле. Это может показаться странным программистам VB, где модуль класса полностью отождествляется с самим классом. Как и в Delphi, в Lazarus это не так. Хотя в одном модуле можно определить только одну форму (иначе визуальный дизайнер форм не сможет работать), другие элементы приложения не обязательно реализовывать отдельно. В нашем случае функция RunTestForm содержит код, необходимый для создания формы, передачи ей начального значения поля ввода и возврата отредактированного значения. Очевидно, что RunTestForm по смыслу связана с классом формы, поэтому будет разумно (хотя и вовсе не обязательно) расположить её в модуле формы.
Теперь посмотрим, как использовать всё это в основной форме. Добавим в обработчики событий нажатия на кнопки вызовы функции RunTestForm, в результате чего раздел реализации модуля главной формы приобретёт такой вид:
Вот и всё. Только не забудьте в свойствах проекта удалить дополнитетьную форму из списка автоматически создающихся форм. Теперь можно потестировать, то, что у нас получилось. Запустите программу и понажимайте кнопки на главной форме. Обратите внимание, что пока дополнительная форма присутствует на экране, Вы не можете перевести фокус на какую-либо другую форму, как и положено для модального режима. И наверняка Вы подумаете, что такое поведение не всегда является подходящим. Вот это и обсудим далее.
Открытие форм в немодальном режиме
Итак, для начала определимся, что предназначение, поведение немодальной формы и принципы работы с ней совершенно другие. Прежде всего, немодальные формы не приспособлены для возврата значений, так как после их открытия программа не останавливается в ожидании закрытия формы, а продолжает выполняться. Из-за этого, если не предпринять специальных мер, указатель на открываемую форму будет утерян после завершения работы кода, который её создаёт (в нашем случае — это функция RunTestForm). Так ли это ужасно? В большинстве случаев — нет. Помните, что при создании экземпляра формы в конструктор передавался параметр Application? Так вот: Application — это объект, который представляет всё наше приложение. При таком создании формы он будет помнить о её присутствии, а мы сможем этим воспользоваться. Создадим в главной форме список, который будем заполнять именами форм, открытых в приложении. Основная форма при этом несколько изменится и будет выглядеть примерно так:
Обратите внимание, что мы задекларировали новый метод FillWindowsList, который как раз и выполняет заполнение списка форм приложения. Его реализация не слишком сложна: Здесь есть некоторый интересный момент. Дело в том, что объект Application содержит единый список всех компонент, которыми владеет, поэтому приходится проверять, что очередной компонент является именно TForm.
Однако, что толку просто выводить список форм. Нужно сделать так, чтобы можно было переключиться на любую из них. В реальном приложении это, конечно, лучше сделать с помощью меню, но код получится несколько более громоздким, поэтому в нашем простом примере во-первых будем использовать список, а во-вторых опустим необходимые в реальном приложении проверки. Ниже представлен весь код секции реализации модуля основной формы. Обратите внимание, что вызывая метод RunTestForm мы уже не ждём возвращаемого значения, но зато вызываем процедуру заполнения списка окон приложения.
Теперь создадим дополнительную форму, которую будем открывать из главной формы в немодальном режиме. Внешне она ничем не будет отличаться от рассмотренной в предыдущей главе модальной формы, а вот код несколько изменится. Обратите внимание, что свойство TestValue теперь только для записи, а метод RunTestForm стал процедурой вместо функции.
Появилась и новая глобальная переменная — счётчик форм Form2Count. Она понадобится нам, когда создаваемому экземпляру формы мы будем присваивать имя. Все объекты приложения должны иметь уникальные имена, однако LCL об этом никак не заботится, поэтому придётся действовать самостоятельно. Код, связанный с переменной Form2Count достаточно тривиален, поэтому останавливаться на нём не будем.
Реализация тоже довольно сильно изменилась. Показ формы теперь производится вызовом метода Show, а не ShowModal, поэтому выполнение программы не передаётся в создаваемую форму до её закрытия, а продолжается. О закрытии и освобождении ресурсов теперь должна заботиться сама форма. Для этого в процедуре обработки события закрытия формы мы присвоим переменной CloseAction значение caFree. Нажатие на кнопку теперь вызывает не установку значения ModalResult, а явное обращение к методу Close.
Если Вы не просто читали эту статью, а создавали попутно описанную тестовую программу, самое время её запустить. Только снова не забудьте убрать дополнительную форму из списка автоматически создающихся при старте приложения.
Как работать с двумя формами?
У меня на одной форме находится кнопка TButton. При нажатии на нее, первая форма должна стать неактивна, вторая форма должна стать видимой, и надписи на метках второй формы должны измениться.
в первой форме я сделал такую процедуру
Во второй форме есть процедура, которая вызывается из первого юнита.
Как одновременно работать с двумя формами?
Здравствуйте! Подскажите, пожалуйста, как реализовать приложение для работы с несколькими формами.
Как работать с двумя формами если есть валидационные контролы
Добрый день! Подскажите пожалуйста как работать на webforms с двумя формами. Проблема в том.
Как организовать работу с двумя формами?
Подскажите пожалуйста, как организовать работу с двумя формами, на первой из которых пользователь.
Как создать программу с двумя формами?
Помогите создать программу с 2-мя формами , на 1-ой форме должна быть кнопка которая открывает.
Как создать вторую форму в лазарусе
- Вы здесь:
- Главная
- Видеотека
- Программирование и сеть
- Языки программирования
- Delphi-Embarcadero-Lazarus
- Lazarus
- Lazarus от TheMrDen3D
- Уроки программирования в Lazarus. Урок №10. Работа с несколькими формами.
Уроки программирования в Lazarus. Урок №10. Работа с несколькими формами.
В данном уроке мы научимся работать с несколькими формами в Lasarus, разберем как их связывать между собой.
Урок 7. Компонент TRadioGroup. Приложение с несколькими формами
В предыдущем уроке рассказывалось об организации ввода и вывода данных с помощью встроенных диалоговых окон InputBox, ShowMessage.
В этом уроке мы научимся создавать приложения, в которых используются несколько форм.
Кроме того мы изучим новый компонент TRadioGroup для создания групп переключателей. Научимся применять условный оператор для анализа состояния переключателей.
Для начала вам нужно перейти на страницу Новый компонент и ознакомиться с назначением и свойствами компонента TRadioGroup.
Чтобы повторить условный оператор if-then перейдите на станицу Повторим операторы .
Обязательно перейдите по ссылкам и изучите все, что там написано, прежде чем вы продолжите изучать этот урок.
Добавление новой формы
Компонент форма является объектом, отсутствующим на палитре компонентов. Чтобы добавить новую форму в проект, нужно выбрать команду Файл – Создать форму или щелкнуть кнопку Создать форму на панели инструментов.
Появиться новая пустая форма. Называться она будет Form2, а соответствующий ей файл с исходными текстами добавиться в Редактор кода на новую вкладку Unit2.
После добавления новой формы, проект нужно сохранить.
Для показа форм можно использовать один из двух методов: Show или ShowModal.
Метод Show предназначен для показа формы в обычном окне, а ShowModal — для показа формы в модальном окне.
Различие между этими двумя видами окон состоит в том, что между обычными окнами можно перемещаться произвольным способом, а перейти в другое окно из модального окна можно только после его закрытия.
Показ формы как обычного окна
Чтобы вызвать форму в обычном окне используют ее метод Show. Он показывает форму, перемещает ее на передний план экрана и делает активной.
В примере показан вызов формы Form3 в обычном окне после щелчка на кнопке Button1.
Показ формы как модального окна
Чтобы вызвать форму в модальном окне, надо использовать метод ShowMoal. Переключиться из модального окна на другие окна не удастся, пока оно не будет закрыто.
Пример показа формы Form3 в модальном окне после щелчка на кнопке Button2.
Модальные окна хорошо подходят для задания всевозможных настроек, выполнения ввода промежуточных значений, отображения результатов.
Теперь у нас есть все необходимое, для того чтобы создать свое первое приложение с несколькими формами.
Проект «Три формы»
Задание. Создать приложение с тремя формами: Главная, Опции и О программе. Форму Опции вызывать в обычном окне. Для вызова формы О программе использовать модальное окно.
На рисунке показаны главная форма и подформы нашего нового проекта.
Ход выполнения проекта
- Создайте новое приложение, сохраните файлы проекта в папке «Три формы».
- Разместите на форме Form1 3 кнопки, измените свойства объектов в соответствии с таблицей.
Компонент Свойство Значение Форма Name
CaptionfrmGeneral
ГлавнаяКнопка 1 Caption Опции Кнопка 2 Caption О программе Кнопка 3 Caption Закрыть - Создайте формуForm2. Для этого выберите в меню Файл команду Создать форму. На экране появиться новая форма Form2, в редакторе кода – новая вкладка Unit2.
- Установите на форме компонент RadioGroup для выбора цвета, надпись, поле вывода, две кнопки. Настройте свойства объектов в соответствии с таблицей.
Компонент Свойство Значение Форма Name
CaptionfrmOptions
ОпцииRadioGroup Caption
ItemsЦвет главной формы
Ввести списокLabel1 Caption Заголовок главного окна Edit1 Text Пусто Button1
Button2CaptionCaption ОК
Выход
После размещения на форме компонента TradioGroup, входящие в него переключатели задаются перечислением их названий. Эти названия вводятся в свойство Items.
Так как требуется ввести не одну строку, а несколько, для их ввода предусмотрен специальный редактор, который вызывается щелчком на специальной кнопке , расположенной справа в строке, описывающей свойство Items.
Большая текстовая область окна редактора предназначена для ввода названий переключателей по одному в каждой строке. Переход в начало следующей строки осуществляется при нажатии на клавиши Shift+Enter.