Lazarus какие события возникают при открытии формы
Lazarus offers various events that you can use to enter your own procedures to handle things that happen in your application (e.g. a user clicks a button).
There are rather a lot of possible events to cater for a lot of different scenarios. Somebody who does not know Lazarus or Delphi could well pick the wrong event.
Lazarus documentation
The Lazarus tutorial has some information on what events do what.
Forms
Typical event order for forms is:
Form.OnCreate
This is the equivalent to the class constructor in forms. Use this to initialize form-level variables etc. The form is not yet shown at this time.
Form.OnShow
When the form is shown (e.g. when loading the form or setting its .Visible property to true), this event is fired — just before the form is visible. This allows you to modify the visual appearance of controls (e.g. disable certain controls) without flickering.
Form.OnActivate
This occurs after Form.Show.
At the OnActivate stage controls instantiated in OnCreate are present and correct, and should have the minimum needed properties set (such as Parent) plus anything else OnCreate specified.
OnActivate signals that this form now has focus, so mouse/key events will start arriving.
Form.OnDeactivate
Fired after the form loses focus.
Note: Switching between different applications in the OS will not cause either Form.OnActivate or Form.OnDeactivate to fire. Thus Form.OnActivate/Form.OnDeactivate only track different forms changing focus within an application.
To track whether the Application itself receives or loses focus, use Application.OnActivate and Application.OnDeactivate.
Form.OnDestroy
The equivalent to a class destructor in forms. Use this to clean up/free variables.
When the main form of an application is destroyed, the application terminates.
General controls
These events apply to various controls. Please use the Object Inspector to check if it is available for the control you’re currently using.
OnEditingDone
The OnEditingDone event for controls can act like the Validate event in other programming languages: it indicates the user is done changing the control and intends to keep that value. The program can now check the control content for correctness, show error messages, update database fields, etc.
Note: As soon as you click outside the control (even on a control that cannot receive focus) OnEditingDone is triggered.
(See TControl.MouseDown procedure, introduced in r11778).
Applicable Delphi information
Because the implementation of events in Lazarus and Delphi is similar, a lot of Delphi-related documentation is applicable to Lazarus with minor modifications.
Delphi documentation is often handy. You can search for the actual control you want to know more about to get a list of its events.
Lazarus какие события возникают при открытии формы
- biMinimize — кнопка минимизации окна;
- biMaximize — кнопка максимизации окна.
Любой из этих кнопок можно присвоить значение False — недоступна.
- bsDialog — рамка диалоговой панели;
- bsSingle — тонкая рамка;
- bsNone — без рамки;
- bsSizeToolWindow — инструментальная панель Windows с изменяемыми размерами;
- bsToolWindow — инструментальная панель.
- poDesigned — форма при запуске приложения будет находиться в том положении на экране, как она находится в конструкторе Delphi;
- poDefault — форма при запуске может оказаться в любом месте экрана;
- poScreenCenter -форма при запуске находится в центре экрана.
- wsNormal — приложение имеет нормальные размеры;
- wsMaximized — приложение развернуто на весь экран;
- wsMinimized — приложение свернуто.
Далее создадим еще одно событие — onMouseMove. Это событие отслеживает перемещение курсора мыши на форме. Событие будет заключаться в следующем: при перемещении мыши на форме, в заголовке формы будут отображаться координаты положения мыши. Текст вставляемый в процедуру должен быть таким:
caption:= ‘X:’+IntToStr(x) +’ Y:’+ IntToStr(y);
(IntToStr — функция преобразующая числовой целый тип к строке, т.к. заголовок окна имеет тип String. X и Y — координаты курсора мыши (тип Integer), они передаются в процедуру как параметр).
Работа с формами 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.
Если Вы не просто читали эту статью, а создавали попутно описанную тестовую программу, самое время её запустить. Только снова не забудьте убрать дополнительную форму из списка автоматически создающихся при старте приложения.
RAD Studio from Embarcadero
Почему в обработчиках событий OnActivate/OnDeactivate нельзя вы вызать методы Hide/Show для других форм того же приложения?
Я в подобных случаях использую свойство Visible других форм. Все работает прекрасно.
Did you hear there's a 12 word sentence you can communicate to your crush. that will induce intense feelings of love and instinctual attraction to you deep within his heart?
Because deep inside these 12 words is a "secret signal" that triggers a man's instinct to love, adore and look after you with his entire heart.
This instinct is so built-in to a man's mind that it will drive him to work better than before to make your relationship as strong as it can be.
In fact, triggering this dominant instinct is so binding to getting the best ever relationship with your man that the second you send your man one of these "Secret Signals".
. You'll soon notice him open his soul and mind to you in a way he haven't expressed before and he'll perceive you as the one and only woman in the galaxy who has ever truly appealed to him.
70: Lazarus — Обработка событий
Обработчики событий. Создание обработчика события. События для основных компонентов. Примеры создания процедур обработки событий.
Компонент Form1 – событие OnCreate. Компонент Form1 – событие OnActivate.
Компонент Edit – событие OnKeyPress. Компонент Edit – событие OnChange. Компонент Edit – событие OnClick.
Компонент Button – событие OnClick.
События мыши и клавиатуры.. События мыши. События клавиатуры. Распознавание нажатых клавиш.