Справочник по компонентам Delphi. Часть 3
Страница 10. Модальные формы


 

Модальные формы

Компонент TForm в VCL объединяет в себе свойства и может играть роль как главного окна программы, так и диалогового (модального) окна. Чтобы форма работала в качестве диалога, вместо метода Show нужно вызвать метод:

function ShowModal: Integer;

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

(Rb) property ModalResult: TModalResult ;

не изменит своего значения, первоначально нулевого. Напомним, что это свой­ство формы меняется непосредственно с помощью некоторых видов принад­лежащих ей кнопок (см. раздел "Кнопки"). Если для модальной формы прог­раммистом вызывается метод Close, то ее единственным действием является то, что свойству ModalResult присваивается значение mrCancel (без вызовов OnCloseQuery и OnClose).

Как только получено ненулевое значение ModalResult, вызьшается метод:

procedure CloseModal;

Его роль такая же, как у Close для обычной формы: сначала вызов CloseQuery, затем — генерация события OnClose. Установив в параметре Action этого события значение caNone, можно обнулить ModalResult и тем самым воспре­пятствовать закрытию. В противном случае форма деактивизируется и делается невидимой.

Этот набор методов неприменим к дочерним формам MDI (со стилем fsMDIChild).

  Управление дочерними элементами

Если вы хотите передать фокус одной из форм проекта, используйте метод этой формы:

procedure SetFocus;

Форма при этом обязана быть видимой и активной (Enabled), иначе создается исключительная ситуация EInvalidOperation.

Два метода отвечают за передачу фокуса между визуальными компонентами в составе формы. Метод

procedure FocusControl(Control: TWinControl);

передает фокус элементу управления Control, а метод

procedure DefocusControl(Control: TWinControl; Removing: Boolean);

отбирает его. Параметр Removing, равный True, означает, что элемент при этом должен передать фокус своему родительскому элементу. Напомним, что для элементов в эти моменты генерируются события OnEnter и OnExit. Имеющий фокус элемент определяется свойством:

(РЁ) property ActiveControl: TWinControl; Оно может принимать значение nil, если фокус имеет сама форма. В компоненте TForm доступен еще один метод, по предназначению сходный с FocusControl:

function SetFocusedControl(Control: TWinControl): Boolean;

Этот метод вызывается внутри многих компонентов (находящихся вне модуля FORMS) при получении фокуса ввода — именно поэтому он находится в секции public. Программисту не стоит его использовать, т. к. он не доку­ментирован.

Форма относится к компонентам с возможностью прокрутки содержимого клиентской области. К полосам прокрутки можно обратиться как к отдельным объектам с помощью свойств:

(pb) property HorzScrollBar;

(Pis) property VertScrollBar;

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

(Pb) property AutoScroll; установлено в значение True. Следующий метод помещает элемент управления AControl в видимую часть клиентской области: procedure ScrollInView(AControl: TControl);

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

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

(Pb) property KeyPreview: Boolean;

в True означает, что поступающие от клавиатуры сообщения будут сначала поступать форме, и только затем — элементу. Пример использования этой возможности приведен в разделе "Обработка событий от мыши и клавиатуры".

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

(Pb) property PixelsPerInch: Integer;

Вы можете присвоить этому свойству любое значение, превышающее 36, либо 0.

При ненулевом значении этого свойства во время создания форма и все ее элементы масштабируются в некоторой пропорции. Эта пропорция равна отно­шению числа точек на дюйм на экране в данный момент к этому же числу во время разработки. Если же PixelsPerInch = 0, никакого масштабирования не производится.

Чтобы не изменять PixelsPerInch напрямую, разработчики предусмотрели дру­гое — обобщающее — свойство:

(Pb) property Scaled: Boolean;

При установке Scaled в False PixelsPerInch обнуляется, в True — получает новое значение, равное числу точек на дюйм на экране в текущем видеорежиме.

Нужно учитывать, что если вы хотите сделать приложение, независимое от разрешения экрана, то значение свойства Position у всех его форм должно отличаться от poDesigned — иначе они будут появляться в разных местах (в том числе и за пределами экрана).

Внешний вид формы и ее составных частей можно отобразить не только на экране. Метод

function GetForrnImage: TBitmap;

возвращает "моментальный снимок" формы — битовую карту с ее изобра­жением. Печать на принтере изображения формы, полученного при помощи GetFormImage, осуществляется методом:

procedure Print;

Полученное изображение передается объекту TPrinter (см. ниже), при этом его масштабирование производится в соответствии со значением свойства:

(Pb) property PrintScale: TPrintScale;

TPrintScale = (poNone, poProportional, poPrintToFit) ;

poNone — отсутствует;

poProportional — производится изменение масштаба в пропорции, равной соотношению точек на дюйм у формы и принтера;

poPrintToFit — аналогично предыдущему, но осуществляется приведение размера изображения к размеру листа.

 
« Предыдущая статья   Следующая статья »