|
||||||||
|
Форма и ее свойства. Создание форым
Правила создания форм на этапе выполнения задаются в опциях проекта (страница Forms). Все формы, которые вы включили в состав приложения на этапе визуального проектирования, могут быть автоматически созданы при его запуске, для этого их имена должны находиться в списке AutoCreate Forms. Все прочие формы (список Available Forms) нужно создавать самостоятельно, вызвав конструктор Create или метод Application.CreateForm. Самым первым событием, которое возникает при создании формы, является:
Это событие инициируется в конструкторе формы и позволяет выполнить операции по начальной установке формы и ее элементов до визуализации. В обработчик этого события стоит включить присвоение значений неопубликованным свойствам формы и свойствам компонентов, которых нет в Палитре компонентов, например, TApplication. Также здесь нужно "подключить" написанные вами обработчики событий для этих компонентов. В этом случае внешний вид и поведение форм будут корректными с самого начала. Первоначально показана будет только одна ? главная форма. Вы также можете придать этот статус любой из всех автоматически создаваемых форм посредством опций проекта. По умолчанию главной будет первая включенная в проект форма". Для показа и активизации прочих форм необходимо вызвать одну из методов ? Show или ShowModal. Последний используется только для модальных форм, работа с которыми описана ниже. При вызове метода
происходит показ формы на экране. При показе она становится видимой и помещается поверх других форм приложения, что сопровождается инициализацией события:
При этом форма получает то положение и размеры, которые задаются значениями свойства:
После того, как форма стала видимой, возникает необходимость в ее перерисовке. Программист может определить, что и как изображается в клиентской области формы, описав реакцию на событие:
Для этого он должен использовать канву формы:
Обработчик события OnPaint вызывается до того, как начнется отрисовка всех компонентов, принадлежащих форме. Поэтому нарисованное в нем может послужить фоном. Пример:
После отрисовки форма получает фокус ввода сообщений от системных устройств, т. е. становится активной. Об этом извещает наступление события:
Узнать, активна ли форма, можно путем обращения к ее свойству:
При активизации формы ей посылается сообщение о настройке ее размеров (WM_SIZE). После того, как размеры изменены, возникает событие
которое может быть использовано для переустановки размеров как формы, так и всех элементов управления на ней. В следующем примере форма настраивает размеры своей клиентской области точно по размерам содержащейся в ней таблицы DrawGrid1, которая, в свою очередь, тоже пытается получить максимально возможный в данной области размер:
Здесь нужно обратить внимание на два момента. Во-первых, изменение размеров внутри обработчика OnResize влечет за собой как минимум один новый вызов этого события, поэтому возможны неоднократные перерисовки и изменения размеров. Во-вторых, чтобы этот процесс рано или поздно остановился, нужно ввести условия, при достижении которых размеры изменяться не будут, иначе наступит зацикливание. После изменения размеров вновь возникает событие OnPaint. Разумеется, описанные выше события (OnPaint, OnActivate и OnShow) возникают не только при инициализации формы, а и, к примеру, при каждом переключении между приложениями или формами в приложении. Последние два действия имеют парные события, возникающие при утере фокуса или исчезновении формы с экрана:
Метод
дает возможность сделать форму невидимой (изменяет свойство Visible). Во всех случаях, когда форма становится невидимой, возникает событие OnHide. С помощью пары методов Show/Hide обычно управляют из главной формы показом прочих форм. Будьте внимательны! При вызове Hide для главной формы подумайте о том, каким путем вы собираетесь после этого снова визуализировать ее. Основной способ, используемый для закрытия формы ? это вызов метода:
В первую очередь внутри Close вызывается метод:
Для закрытия формы необходимо, чтобы он вернул True. Этот метод ? прямой аналог метода CanClose в библиотеке OWL. Для проверки на возможность закрытия он вызывает обработчик события:
Здесь вы должны проверить возможность закрытия формы и вернуть нужное значение в параметре CanClose (который изначально имеет значение True). Например:
Таким образом, если обработчик события OnCloseQuery не описан, возвращается True (форму можно закрыть). Для форм стиля fsMDIForm (родительских окон MDI) сначала должны закрываться все дочерние формы (вызываются их методы CloseQuery). Если хотя бы одна из них возвращает False, метод тут же возвращает False, и обработчик события OnCloseQuery закрываемой родительской формы управления не получает. Затем метод Close вызывает обработчик следующего события
что позволяет определить дальнейшую реакцию. Дело в том, что закрытие можно реализовать различными способами, в зависимости от значения параметра Action:
Перед вызовом OnClose в параметр Action засылается значение caHide. Исключение составляют дочерние формы MDI, для которых засылается значение caMinimize или caNone в зависимости от возможности их сворачивания. Если обработчик вернул значение caNone, форма не закрывается. Таким путем можно продублировать OnCloseQuery. При закрытии главной формы приложения любое отличное от caNone значение вызывает завершение приложения. Для формы, не являющейся главной, значения caHide и caMinimize позволяют соответственно скрыть и свернуть ее в значок. Выбор значения caFree влечет за собой вызов деструктора путем обращения к методу:
Последним при уничтожении формы инициализируется событие:
Это событие является парным по отношению к OnCreate; обработчик его вызывается в деструкторе формы. Здесь программист может предусмотреть необходимые действия при уничтожении формы, к примеру, записать значения в файл .INI.
Для комментария : kadan@grsu.grodno.by | |||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |