Шаг 34.
Свойства класса TForm

    На этом шаге мы рассмотрим некоторые свойства класса TForm. Описание некоторых свойств приведено на шаге 11.

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

    Рассмотрим более подробно некоторые свойства класса TForm.

    1) property Active: Boolean; - определяет, имеет ли форма фокус ввода. Если имеет, оно возвращает True, если нет - False. Windows выводит заголовок активной формы цветом, отличающимся от цвета неактивных.


    Примечание. Неактивные окна продолжают получать сообщения о перемещении и выборе мыши.

    Независимо от типа приложения в каждый момент времени может быть активной только одна форма. Обратите внимание на то, что заголовок родительской формы в MDI-приложении изображен "активным" цветом. Однако свойство Active родительского MDI-окна, никогда не бывает равным True.


Примечание. Свойство ActiveForm класса TScreen возвращает форму, которая в данный момент имеет фокус ввода.

    2) property ActiveControl: TWinControl; - указывает на потомка TWinControl, имеющего в настоящий момент фокус ввода. Значение этого свойства можно установить во время создания программы, определив, какой элемент будет иметь фокус ввода при инициализации формы. Назначение ActiveControl во время работы программы - установка фокуса ввода в поле с некорректно введенными данными. Приведенный ниже фрагмент кода позволяет проверить текст, введенный в элемент editCustName перед закрытием формы:

procedure TDataEntryForm.FormCloseQuery(Sender: TObject;
                        var CanClose: Boolean); 
begin
   if editCustNme.Text = '' then {Проверяем, введен ли текст в элемент.}
   begin
     CanClose:=False; {Запрещаем закрытие.}
     {Устанавливаем фокус в поле с некорректными данными.} 
     ActiveControl:= editCustName; 
   end;
end;


Примечание. Метод SetFocus потомков TWinControl устанавливает фокус ввода и обновляет свойство ActiveControl. Большинство событий передает параметр Sender своему обработчику. Этот параметр определяет, какой элемент обнаружил событие и запустил обработчик на выполнение.

    3) property AutoScroll: Boolean; property HorzScrollBar: TControlScrollBar; property VertScrollBar: TControlScrollBar. Свойство AutoScroll управляет появлением полос прокрутки в форме, размеры которой не позволяют вывести все ее элементы одновременно. Если свойство равно True, и размеры формы были изменены так, что не все элементы стали видны, то в форме автоматически появляются полосы прокрутки. Если же значение свойства равно False, то будет потерян доступ к элементам формы, не поместившимся на экране.


Примечание. Компонент ТScrollВаr (вкладка Standard), позволяет прокручивать форму независимо от значения свойства AutoScroll.

    Можно управлять полосами прокрутки с помощью свойств HorzScrollBar и VertScrollBar. Это весьма полезно в программах, реализующих свойство распахивания окна. Поскольку размеры, например, выводимой диаграммы могут быть больше размеров формы, а ее вывод осуществляется самостоятельно, AutoScroll не активизируется, и поэтому прокрутку и рисование должен обеспечить сам программист. Вот пример такого кода, обеспечивающего прокрутку в двойном размере формы:

.    .    .    .    .    .
{Устанавливаем диапазон вертикальной прокрутки.} 

VertScrollBar.Range:= Height*2;
{Показываем вертикальную полосу прокрутки.}
VertScrollBar. Visible:= True;
{Устанавливаем диапазон горизонтальной 
прокрутки.}
HorzScrollBar.Range:= Width*2; 
{Показываем горизонтальную полосу прокрутки.} 
HorzScrollBar.Visible:=True;
.    .    .    .    .    .

    4) property BorderStyle: TFormBorderStyle; - определяет общий вид окна и операции с ним, которые разрешено выполнять пользователю. Это свойство может принимать следующие значения:

    По умолчанию свойство BorderStyle имеет значение bsSingle, создающее обычное окно с изменяемыми размерами. Такое окно имеет стандартную строку заголовка и не имеет ограничений на расположение в ней кнопок. Примеры таких окон - программы Explorer (Проводник) и Notepad (Блокнот).

    Значение bsDialog создает диалоговое окно, которое используется, когда программа требует ответа для продолжения выполнения программы или для вывода какой-либо другой информации. Видимое различие между стандартными и диалоговыми окнами заключается в том, что последнее не может изменять размеры.


Примечание. Значения biMinimize и biMaximize свойства BorderIcons не будут работать, если свойство BorderStyle установлено равным bsDialog.

    Третий по популярности стиль окон - bsSingle, создающий форму, которая не может изменять размеры во время работы. В отличие от bsDialog, bsSingle не запрещает установку любых пиктограмм. Единственное ограничение состоит в том, что кнопка сворачивания окна, будучи выведенной, является недоступной (блокированной). Примep такой программы - Calculator (Калькулятор).

    Панель инструментов (Toolbar) позволяет быстро получить доступ к сгруппированным функциям. В Delphi можно сконструировать панель инструментов, поместив группу компонентов TSpeedButton в форму, имеющую стиль bsSizeToolWin или bsToolWindow. Окно в стиле bsSizeToolWin может изменять размеры и не имеет кнопок минимизации и максимизации. Окно в стиле bsToolWindow действует так же, но не позволяет изменять свои размеры.

    Стиль bsNone создает окно без рамки и заголовка. Такое окно не рекомендуется использовать в качестве стандартного или диалогового, однако оно может быть полезным в программах сохранения экрана или заставках.


Примечание. Если для свойства BorderStyle было установлено значение, создающее окно с разрешенным изменением размеров, Delphi автоматически установит значение AutoScroll равным True. Формы со стилями bsDialog и bsNone не могут иметь строки меню.

    5) property BorderIcons: TBorderIcons; - определяет набор кнопок, которые имеются в полосе заголовка.

    6) property Height: Integer; property Width: Integer; - определяют высоту и ширину формы в пикселях и обычно используются для изменения размеров формы во время работы на дисплеях разной разрешающей способности. Вот пример увеличения размеров формы до размеров всего экрана:

.      .      .      .       .
{Перемещаем форму в верхний левый угол 
экрана.}
Left:= 0; 
Тор:= 0;
{Изменяем размеры  формы.}
Width:=Screen.Width;
Height:= Screen.Height;
.      .      .      .       .

    Приведенный код будет работать плохо, так как требуется четыре обновления формы. Для этих целей лучше использовать метод SetBounds, определенный у потомков TWinControl:

     procedure SetBounds(ALeft, ATop, AWidth, AHeight: 
Integer);      .

    7) property ClientHeight: Integer; property ClientWidth: Integer;. Окно состоит из двух частей - клиентской и неклиентской. Обычно приложение выводит изображения только в клиентской области, размер которой возвращается через свойства ClientHeight и ClientWidth. Обычно эти свойства используются для того, чтобы убедиться, что в форме может выводиться весь объект определенного размера. Показанный ниже текст приводит размер клиентской области формы в соответствие размерам изображения, содержащегося в компоненте TImage с именем imgPicture:

.      .      .      .       .
with imgPicture.Picture do
  beqin {Изменение размера.} 
    ClientWidth:= Width; 
    ClientHeight:= Height; 
  end;
.      .      .      .       .

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

    8) property FormStyle: TFormStyle; - задает тип формы.

    9) property Icon: TIcon; - определяет пиктограмму, выводимую Windows при сворачивании формы до кнопки на панели задач.

    10) property KeyPreview: Boolean;. Объект TForm наследует от класса TWinControl обработку событий OnKeyDown, OnKeyUp и OnKeyPress, и свойство KeyPreview определяет ситуации, в которых эти сообщения запускаются. Если значение KeyPreview равно False, события клавиатуры пересылаются только тому управляющему элементу, который имеет фокус ввода. В неординарном случае, когда в форме нет управляющих элементов, событие передается форме. Если же значение свойства установлено равным True, событие сначала пересылается форме, а затем - управляющему элементу, имеющему фокус ввода.


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

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

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

    При этом все нажатия клавиш отсылаются обработчикам событий OnKeyDown, OnKeyUp и OnKeyPress автоматически, и для "отлова" нажатия функциональной клавиши надо написать только один обработчик события OnKeyDown формы. Вот пример закрытия формы при нажатии клавиши F2.

procedure  TForm1. FormKeyDown (Sender: TObject; var  Key: Word;
                                  Shift: TShiftState);
begin
  {Проверить, нажата ли клавиша F2.} 
  if Key =VK_F2  then Close; {Закрыть  форму.}
end;

    Рассматривая принцип работы этого кода, имейте в виду, что события OnKeyDown и OnKeyUp используют виртуальные коды (все они перечислены в файле WINDOWS.PAS).

    11) property Menu: TMainMenu; - определяет компонент TMainMenu, который предоставляет главное меню формы. Свойство Menu позволяет сделать меню контекстно-зависимым и часто используется в OLE-приложениях при замене исходного меню на меню приложения-сервера. Для изменения свойства Menu просто присвойте ему новое значение.

    12) property Position: TPosition; - определяет положение формы на экране. Возможные значения:


Примечание. Рассмотренные свойства работают тогда, когда WindowState=wsNormal.

    Таким образом, значение по умолчанию (poDesigned) заставляет форму выводиться в месте, определенном при разработке приложения. Положение и размер формы при этом берутся из свойств Left, Top, Height и Width. Поскольку заранее неизвестно, в какой системе будет запущено приложение, то может оказаться, что на мониторе с низким разрешением при использовании этого значения свойства будет видна только часть формы.

    Более полезно значение poScreenCenter, которое использует заданные при создании приложения значения Width и Height, но оно так изменяет Left и Тор, что форма выводится в центре экрана.

    Если свойство Position равно poDefault Windows автоматически установит размеры и положение формы, но при этом нельзя будет контролировать ее размеры. Можно создать форму размером 200x200 точек, которая будет выведена как 640x480 точек. Из-за этого, в частности, не допускается применение данного значения для MDI-форм.

    Значение poDefaultPosOnly более полезно, так как оно автоматически определяет расположение формы, но не ее размеры (а потому рекомендуется для MDI-форм, в которых требуются определенные размеры дочерних форм).

    Значение свойства (poDefaultSizeOnly) автоматически определяет размер, но не расположение формы. Это значение может использоваться там, где важно положение формы на экране, а не ее размер.

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

    Приведем код приложения с комментариями.

procedure TForm1.FormDestroy(Sender: TObject);
var
   sAppPath:   String;
   iniSettings:   TINIFile;
begin
   //Получаем путь к EXE-файлу приложения.
    sAppPath:=  ExtractFilePath(Application.EXEName);
   //Создаем объект TINIFile.
   iniSettings:=TINIFile.Create(sAppPath+'SETTINGS.INI');
   try
     //Записываем свойства в INI-файл.
     iniSettings.WriteInteger(Name, 'Left',Left) ;
     iniSettings.WriteInteger(Name,'Top', Top);
     iniSettings.WriteInteger(Name,'Width',Width);
     iniSettings. WriteInteger (Name, 'Height',Height) ;
   finally
     iniSettings.Free; //Удаляем объект TINIFile.
   end;
end;


    Примечание. Для компиляции примера не забудьте включить в раздел uses модуль INIFiles.

    После выполнения приложения INI-файл будет содержать строки такого типа:

  [Form1]
  Left=52
  Top=46
  Width=696
  Height=480


    Примечание. Для строки раздела используется свойство Name формы.

    Восстановить положение формы на экране можно следующим образом:

procedure TForm1.FormCreate (Sender: TObject);
const
  cNOTFOUND  = -1;
var
  sAppPath:   String;
  iniSettings:   TINIFile;
  liValue:   Longint;
begin
  //Получаем путь к EXE-файлу приложения.
  sAppPath:=  ExtractFilePath(Application.ExeName);
  //Создаем объект TINIFile.
  iniSettings:=  TINIFile.Create(sAppPath+'SETTINGS.INI');
  try
    //Пытаемся прочитать значение свойства Left.
     liValue:= iniSettings.ReadInteger(Name, 'Left', cNOTFOUND);
    //Проверяем, считано ли значение.
    if   liValue = cNOTFOUND  then
     begin
     //Значение не считано - центрируем форму.
     Left:= (Screen.Width - Width) div 2;
     Top:= (Screen.Height - Height) div 2;
     end
    else
       begin
        //Считываем значения из INI-файла.
        Left:= iniSettings.ReadInteger(Name,'Left',Left);
        Top:= iniSettings.ReadInteger(Name,'Top',Top);
        Height:= iniSettings.ReadInteger(Name,'Height', Height);
        Width:= iniSettings.ReadInteger(Name,'Width', Width);
       end;
  finally
    iniSettings.Free;
  end;
end;

    Текст этого примера можно взять здесь.

    13) property WindowState: TWindowState; - определяет вид, в котором окно первоначально предъявляется пользователю при выполнении приложения. Имеет следующие значения:

    Методы класса TForm рассмотрены на шаге 4.

    На следующем шаге мы познакомимся с MDI-приложениями.




Предыдущий шаг Содержание Следующий шаг