Delphi 5.Учебник


         

Класс TForm предоставляет возможность изменять



Класс TForm предоставляет возможность изменять его поведение и внешний вид формы с помощью ряда свойств. Active
Свойство Active определяет, имеет ли форма фокус ввода. Если имеет, оно возвращает True, если нет False. Windows выводит заголовок активной формы цветом, отличающимся от цвета неактивных. Совет: Неактивные окна продолжают получать сообщения о перемещении и выборе мыши. Независимо от типа приложения в один момент времени может быть активной только одна форма. Вы можете обратить внимание на то, что заголовок родительской формы в MDI-приложении изображен "активным" цветом. Не попадитесь на эту удочку — свойство Active родительского MDI-окна, никогда не бывает равным True.
Совет: Свойство ActiveForm класса TScreen, возвращает форму, которая в данный момент имеет фокус ввода.
ActiveControl
Свойство ActiveControl указывает на потомка TWinControl, имеющего в настоящий момент фокус ввода. Вы можете установить значение во время создания программы, определив, какой элемент будет иметь фокус ввода при инициализации формы. Назначение ActiveControl во время работы программы— установка фокуса ввода в поле с некорректно введенными данными. Приведенный ниже фрагмент кода позволяет проверить текст, введенный в элемент editCustName, перед закрытием формы.
procedure TDataEntryForm.FormCloseQuery(Sender: Tobject;
var CanClose: Boolean);
begin
{Проверяем, введен ли текст в элемент.}
if edtCustName.Text = ' ' then
begin
{Запрещаем закрытие.}
CanClose:= False;
(Устанавливаем фокус в поле с некорректными данными.)
ActiveControl:= editCustName;
end;
end;
Совет: Метод SetFocus потомков TWinControl устанавливает фокус ввода и обновляет свойство ActiveControl. Большинство событий передает параметр Sender своему обработчику. Sender определяет, какой элемент обнаружил событие и запустил обработчика.

AutoScroll, HorzScrollBar и VertScrollBar
Свойство AutoScroll управляет появлением полос прокрутки в форме, размеры которой не позволяют вывести все ее элементы одновременно. Если свойство равно True, и вы изменили размеры так, что не все элементы формы видны, в форме автоматически появляются полосы прокрутки. Если же значение свойства— False, вы теряете доступ к элементам формы, не поместившимся на экране.
Совет: Компонент TScrollBar, позволяет прокручивать форму независимо от свойства AutoScroll.

Вы можете управлять полосами прокрутки с помощью свойств HorzScrollBar и VertScrollBar. Это весьма полезно в программах, реализующих свойство распахивания окна. Поскольку размеры выводимой диаграммы могут быть больше размеров формы, а выводите вы ее самостоятельно, AutoScroll не активизируется, и вам следует обеспечить прокрутку и рисование, самому. Вот пример такого кода, обеспечивающего прокрутку в двойном размере формы.
{Устанавливаем диапазон вертикальной прокрутки.}
VetrScrollBar.Range:= Height * 2;
{Показываем вертикальную полосу прокрутки.}
VertScrollBar.Visible:= True;
{Устанавливаем диапазон горизонтальной прокрутки.}
HorzScrollBar.Range:= Width * 2;
{Показываем горизонтальную полосу прокрутки.}
HorzScrollBar.Visible:= True;
BorderIcons
Свойство Borderlcons представляет собой набор логических значений, использующийся для определения набора пиктограмм в заголовке формы.
Значения biMinimize и biMaximize создают пиктограммы, которые позволяют свернуть и развернуть форму с помощью мыши.
Совет: Для того чтобы значения biMinimize и biMaximize работали, необходимо установить свойство BorderStyle равным bsSizeable или bsSizeToolWin.

Значение biHelp выводит кнопку с вопросительным знаком. Щелчок на ней вызывает контекстно-зависимую справку, которая выводится, как текст подсказки Hint, т.е. без вызова Windows Help. На Рисунок 1.1 представлена такая кнопка.
Рисунок 1.1. Доступ к контекстно-зависимой справке можно получить с помощью щелчка на кнопке с вопросительным знаком в заголовке формы.
Значение biSystemMenu создает слева от заголовка пиктограмму, позволяющую вызывать системное меню, как показано на Рисунок 1.2.

Рисунок 1.2. Системное меню позволяет перемещать и закрывать форму, а также изменять ее размеры.
Совет: Для того чтобы значения biMinimize, biMaximize и biHelp работали, необходимо присвоить свойству заметку BorderIcons значение biSystemMenu.

BorderStyle
Свойство BorderStyle перечислимого типа позволяет определить:
  • вид заголовка формы
  • доступные кнопки в заголовке формы
  • отображение строки меню
  • поведение границ формы
  • На Рисунок 1.3 показана форма для шести значений BorderStyle. Каждая форма создавалась как форма размером 200х200 пикселей.
    Рисунок 1.3. Влияние значения BorderStyle на вид формы. Значения по часовой стрелке, начиная с левой верхней формы, таковы: bsSizeable, bsDialog, bsSingle, bsSizeToolWin,bsToolWindow и bsNone
    По умолчанию свойство BorderStyle имеет значение bsSizeable, создающее обычное окно с изменяемыми размерами. Такое окно имеет стандартную строку заголовка и не имеет ограничений на расположение в ней кнопок. Примеры таких окон — программы Explorer и Notepad.
    Значение bsDialog создает диалоговое окно, которое используется, когда программа требует от вас ответа для продолжения выполнения программы или для вывода информации, 16-разрядные версии Windows выводили такое окно как окно с широкой границей того же цвета, что и заголовок. Сейчас, если вы будете следовать новому трехмерному интерфейсу, границы окна будут выглядеть так же, как границы обычного окна! Видимое различие между стандартными и диалоговыми окнами в связи с тем, что последнее не может изменять размеры, состоит лишь в том, что указатель мыши не изменяется при пересечении рамки окна.
    Совет: Значения biMinimize и biMaximize свойства Borderlcons не будут работать, если свойство BorderStyle установлено равным bsDialog.

    Третий по популярности стиль окон — bsSingle, создающий форму, которая не может изменять размеры во время работы. В отличие от bsDialog, bsSingle не запрещает установку любых пиктограмм. Единственное ограничение состоит в том, что кнопка сворачивания окна, будучи выведенной, является недоступной (блокированной). Пример такой программы — Calculator. На Рисунок 1.4 вы видите другой пример окна bsSingle.
    Рисунок 1.4. Стиль bsSingle полезен, когда пользователю не надо изменять размер окна.
    Панель инструментов (Toolbar) позволяет быстро получить доступ к сгруппированным функциям. В Delphi можно сконструировать панель инструментов, поместив группу компонентов TSpeedButton в форму, имеющую стиль bsSizeToolWin или bsToolWindow. Окно в стиле bsSizeToolWin может изменять размеры и не имеет кнопок biMinimize, biMaximize HbiHelp. Окно в стиле bsToolWindow действует так же, но не позволяет изменять размеры.
    Стиль bsNone создает окно без рамки и заголовка. Такое окно не рекомендуется использовать в качестве стандартного или диалогового, однако оно может быть полезным в программах сохранения экрана или заставках.
    Совет: Если вы выбрали для свойства BorderStyle значение, создающее окно с разрешенным изменением размеров, Delphi автоматически установит значение AutoScroll равным True. Формы со стилями bsDialog и bsNone не могут иметь строки меню.

    Height и Width
    Эти свойства определяют высоту и ширину формы в пикселях и обычно используются для изменения размеров формы во время работы на дисплеях разной разрешающей способности. Вот пример увеличения размеров формы до размеров всего экрана.
    {Перемещаем форму в верхний левый угол экрана.}
    Left:= 0;
    Тор:= 0;
    (Изменяем размеры формы.)
    Width:= Screen.Width;
    Height:= Screen.Height;

    (Класс TScreen, о котором будет сказано ниже, и его экземпляр Screen предоставляют доступ к информации о размерах всего экрана.)
    Приведенный код, конечно, работает, но плохо, так как требуется четыре обновления формы. На самом деле лучше использовать метод SetBounds, определенный у потомков TWinControl:

    SetBounds(0, 0, Screen.Width, Screen.Height);
    ClientHeight и ClientWidth
    Окно состоит из двух частей — клиентской и не клиентской. Обычно приложение выводит изображения только в клиентской области, размер которой возвращается через свойства ClientHeight и ClientWidth. Обычно эти свойства используются для того, чтобы убедиться, что в форме может выводиться весь объект определенного размера. Показанный ниже текст приводит размер клиентской области формы в соответствие размерам изображения, содержащегося в компоненте TImage, ImgPicture.

    with imgPicture.Picture do
    begin
    (Изменение размера.)
    ClientWidth:= Width;
    ClientHeight:= Height;
    end;
    Не клиентская область обычно прорисовывается Windows и включает строку заголовка, меню и рамку окна. Вы можете рисовать в этой части окна, перехватив сообщение WM_NCPAINT.

    FormStyle
    Свойство FormStyle перечислимого типа определяет, как форма взаимодействует с вашим приложением и Windows.
    Существует два основных стиля форм — MDI (Multiple Document Interface — многодокументный интерфейс) и не MDI. Имеется два MDI-стиля (fsMDIForm и fsMDIChild), которые рассматриваются ниже. Не MDI формы существуют также в двух вариантах— fsNormal и fsStayOnTop. Наиболее популярен стиль fsNormal, который создает стандартный стиль, используемый для диалогов, панелей инструментов и SDI-приложений.
    Стиль fsStayOnTop применяется реже и создает форму, всегда остающуюся поверх других форм и приложений, что может быть полезно при выводе системной информации и использовании ресурсов. Примером такого окна является окно программа Chat, используемой при работе в сети.
    Вот как можно реализовать, подобно программе Chat, установку вывода поверх других окон путем выбора пункта меню.
    procedure TFormI.mnuAlwaysOnTopClick(Sender: TObject);
    begin
    with mnuAlwaysOnTop do
    begin
    {Переключаем отметку выбора пункта меню.}
    Checked:= not Checked;
    {Проверка установок меню.}
    if Checked then
    (Устанавливаем стиль fsStayOnTop.)
    FormStyle:= fsStayOnTop
    else
    {Возвращаем нормальный стиль.}
    FormStyle:= fsNormal;
    end;
    end;
    Совет: Изменение свойства FormStyle вызывает событие OnShow.

    Icon
    Свойство Icon определяет пиктограмму, выводимую Windows при сворачивании вашей формы. В интерфейсе Windows 95 эта пиктограмма также выводится в левом верхнем углу формы на кнопке системного меню. Если вы не определите значения для этого свойства, будет использоваться свойство Icon глобального объекта Application.

    KeyPreview
    Объект TForm наследует от класса TWinControl обработку событий OnKeyDown, OnKeyUp и OnKeyPress, и свойство KeyPreview определяет ситуации, в которых эти сообщения запускаются. Если значение KeyPreview равно False, события клавиатуры пересылаются только тому управляющему элементу, который имеет фокус ввода. В неординарном случае, когда в форме нет управляющих элементов, событие передается форме. Если же значение свойства установлено равным True, событие сначала пересылается форме, а затем — управляющему элементу, имеющему фокус ввода.
    Совет: Поскольку клавиша <Tab> используется для передачи фокуса другому управляющему элементу, она не вызывает генерации события.

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

    procedure TFormI.FormKeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState):
    begin
    {Проверить, нажата ли клавиша <F2.}
    if Key = VK_F2 then
    {Закрыть форму.}
    Close;
    end;
    Рассматривая принцип работы этого кода, имейте в виду, что события OnKeyDown и OnKeyUp используют виртуальные коды (все они перечислены в файле WINDOWS.PAS).

    Menu
    Это свойство определяет компонент TMainMenu, который предоставляет главное меню формы. Свойство Menu позволяет сделать меню контекстно-зависимым и часто используется в OLE-приложениях при замене вашего исходного меню на меню приложения-сервера. На Рисунок 1.5 показан документ Wordpad с внедренным объектом MediaClip. Обратите внимание, что меню и панель инструментов при этом те же, что и у Media Player.
    Рисунок 1.5. Вы можете создать контекстно-зависимое меню с помощью свойства Menu
    Для изменения свойства Menu просто присвойте ему новое значение (TMainMenu или его потомок):
    Menu:= mnuMainMenu;

    Position
    Position — это свойство перечислимого типа, определяющее размещение формы при запуске приложения.
    Значение по умолчанию (poDesigned) заставляет форму выводиться в месте, определенном при разработке приложения. Положение и размер формы при этом берутся из свойств Left, Top, Height и Width. Поскольку вы не можете знать заранее, в какой системе будет запущено ваше приложение, может оказаться, что на мониторе с низким разрешением при использовании этого значения свойства будет видна только часть формы.
    Более полезно значение poScreenCenter, использующее заданные вами при создании приложения значения Width и Height, но оно так изменяет Left и Тор, что форма выводится в центре экрана.
    Если вы установите Position равным poDefault, Windows автоматически установит размеры и положение формы, но вы при этом лишитесь возможности контролировать ее размеры. Можете создать форму размером 200х200, которая будет выведена как 640х480. Из-за этого, в частности, не допускается применение данного значения для MDI-форм.
    Значение poDefaultPosOnly более полезно, так как оно автоматически определяет расположение формы, но не ее размеры (а потому рекомендуется для MDI-форм, в которых требуются определенные размеры дочерних форм).
    Последнее значение свойства (poDefaultSizeOnly) автоматически определяет размер, но не расположение формы. Это значение может использоваться там, где важно положение формы на экране, а не ее размер.
    Хотя свойство Position позволяет определить, каким образом будет выводиться форма, профессионально сделанные приложения сами запоминают свое расположение на экране и при следующем запуске выводятся в той же позиции и с тем же размером. Это осуществимо, например, благодаря записи положения окна в Registry или в INI-файле, в том же каталоге, где находится приложение. Обычно сохранение позиции и размеров экрана выполняется в самый последний момент — при уничтожении формы.
    procedure TForml.FormDestroy(Sender: TObject);
    var
    sAppPath: String;
    iniSettings: TINIFile;
    begin
    {Получить путь к ЕХЕ-файлу приложения.}
    sAppPath:= ExtractFilePath(Application.EXEName);
    {Создаем объект TINIFile.}
    iniSettings:= TINIFile.Create(sAppPath + 'SETTINGS.INI');
    try
    {Записываем свойства в INI-файл.}
    iniSettings.Writelnteger(Name,'Left',Left);
    iniSettings.Writelnteger(Name,'Top',Top);
    iniSettings.Writelnteger(Name,'Width',Width);
    iniSettings.Writelnteger(Name,'Height',Height);
    finally
    iniSettings.Free;
    end;
    end;
    Совет: Для компиляции примера не забудьте включить в раздел uses модуль INIFiles.

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

    [Form1]
    Left=108
    Тор=174
    Width=540
    Height=165
    Заметьте, что для строки раздела используется свойство Name вашей формы.
    Восстановить положение формы на экране немного сложнее (главным образом из-за того, что следует отработать ситуацию, когда INI-файла нет).
    procedure TFormI.Create(Sender: TObject);
    const
    CNOTFOUND = -1;
    var
    sAppPath: String;
    iniSettings: TINIFile;
    liValue: Longint;
    begin
    {Получаем путь к ЕХЕ-файлу приложения.}
    sAppPath:= ExtractFilePath(Application.ExeName);
    {Создаем объект TINIFile.}
    iniSettings:= TINIFile.Create(sAppPath + 'SETTINGS.INI');
    try
    {Пытаемся считать значение Left.}
    liValue:= iniSettings.Readlnteger(Name,'Left',cNOTFOUND);
    {Проверяем, считано ли значение.}
    if liValue = cNOTFOUND then
    begin
    {Свойства в INI-файле не найдены — центруем форму.}
    Left:= (Screen.Width - Width) div 2;
    Top:= (Screen.Height - Height) div 2;
    end
    else
    begin
    {Считываем значения из INI-файла.}
    Left:= iniSettings.Readlnteger(Name,'Left',Left);
    Top:= iniSettings.Readlnteger(Name,'Top',Top);
    Height:= iniSettings.Readlnteger(Name,'Height',Height);
    Width:= iniSettings.Readlnteger(Name,'Width'.Width);
    end;
    finally
    iniSettings.Free;
    end:
    end;
    WindowState
    Свойство перечислимого типа WindowState определяет состояние окна— свернутое, развернутое или нормальное. По умолчанию оно имеет значение wsNormal (при этом окно выводится в состоянии, определяемом свойствами Position, Left, Top, Height и Width). Чтобы свернуть или развернуть форму, используются значения wsMinimize и wsMaximize.

    Содержание раздела