Тарифы Услуги Сим-карты

Delphi. Общие свойства компонентов. Стандартные компоненты Delphi

Еремин Андрей

Что такое свойства? Что является свойствами в реальной жизни? Например, в физике это температура плавления, температура кипения, вязкость, плотность, растворимость и т.д. Аналогично и объектно-ориентированном программировании. Каждый объект имеет какие-либо свойства. Свойства отвечают либо за внешний вид объекта, либо за его поведение в программе во время её выполнения. Рассмотрим свойства в Delphi .

Где найти свойства

Каждый компонент, помещённый на форму, имеет своё отражение в Инспекторе объектов (Object Inspector). Попробуйте, к примеру, поместить на форму кнопку TButton и текстовое поле TEdit и выделить по очереди сначала один объект, а затем другой, наблюдая при этом за Инспектором объектов. Вы заметите, что содержимое его окна изменяется. Это связано с тем, что каждый объект имеет свои свойства. Свойство может быть у одного объекта, но его может не быть у другого. Например, у поля ввода (TEdit) есть свойство ReadOnly , отвечающее за возможность изменения текста в этом поле. Совершенно логично, что у кнопки (TButton) этого свойства нет и быть не может.

Как создаются программы

Чтобы научиться создавать программы, для начала нужно понять основные принципы их создания. Коротко на этом остановимся. Итак, Вы уже научились помещать компоненты на форму, управлять ими и просматривать свойства. Размещение компонентов на форме - один из первых этапов разработки программы. Однако, просто поместив компоненты никаких действий происходить не будет - по кнопке можно будет щёлкнуть, но при этом ничего не произойдёт. В поле ввода можно ввести текст, но этот текст никуда не отправится и никак не обработается. Поэтому совершенно логичным этапом является настройка взаимодействий между компонентами. Некоторые простые взаимодействия уже "встроены" в стандартные компоненты и легко изменяются через Инспектор объектов. Всё остальное нужно создавать и программировать вручную. Практически основным методом создания взаимодействий компонентов является написание реакций на события. Но об этом чуть позже.

Типы свойств

Прежде чем перейти к рассмотрению типов свойств, нужно понять, что же из себя вообще представляет свойство? Всё очень просто. Свойство - это поле какой-либо структуры, содержащее определённое значение. Отталкиваясь от того, каким образом задаются эти значения и какую "природу", т.е. структуру имеет свойство, выделено несколько типов свойств.

Простыми являются те свойства, значения которых являются числами, либо строками (текстом). Примерами таких свойств могут служить Left и Top формы. Эти свойства определяют положение формы на экране (в частности, её левого верхнего угла). Значения этих свойств - числа. Пример свойства со значением-строкой - Caption формы. Это свойство хранит заголовок формы и задаётся в виде обычного текста.

2. Перечислимые свойства. Такими являются свойства, задать значения которым в явном виде нельзя, а можно только выбрать из списка. Список возможных значений определяется заранее. Пример такого свойства - свойство AutoSize формы. Оно отвечает за то, будет ли форма автоматически изменять свой размер, чтобы отобразить все размещённые на ней компоненты. Значение - либо истина (True), либо ложь (False). Другой пример - свойство BorderStyle . Это свойство отвечает за внешний вид формы, а также за поведение её границ, т.е. можно ли изменять размеры формы во время работы программы. Это свойство принимает одно из 6 значений.

3. Вложенные свойства. Это те свойства, которые имеют внутри несколько других свойств. В Инспекторе объектов слева от названий таких свойств отображается маленькая кнопка со знаком "+ ", нажатие на которую раскрывает данное свойство (знак при этом меняется на "- "). Повторный щелчок "сворачивает" свойство обратно. Вложенные свойства бывают двух основных типов - это множества и комбинированные значения. Множества - это набор каких-либо значений, каждое из которых либо "включено", либо "выключено". Комбинированные значения - это набор из нескольких свойств, которые могут иметь разный тип данных. Примером множества является свойство BorderIcons у формы - оно отвечает за кнопки, которые будут показаны в строке заголовка окна. Понятно, что любая из кнопок может либо отображаться на экране, либо нет - такой набор очень удобно задавать с помощью множества. Примером комбинированного значения является свойство Font (оно есть у большинства визуальных компонентов) - задаёт шрифт для элемента. В его включено несколько других свойств - название шрифта, цвет, стиль, размер и т.п.

Управление свойствами

Управлять свойствами, т.е. изменять их значения можно двумя способами - в режиме проектирования программы (Design-time) и во время выполнения (Run-time). В данный момент нас интересует режим проектирования. Изменять свойства можно всё в том же Инспекторе объектов. Если это простое свойство, то достаточно щёлкнуть по строке с названием этого свойства и ввести новое значение. Если это перечислимое свойство, то значение можно выбрать из списка. Некоторые свойства (например, Left , Top , Width и Height) можно изменять простыми операциями перетаскивания и изменением размеров с помощью мыши.
Примечание: Left , Top - положение формы на экране, Width - ширина, Height - высота формы.

Следует отметить, что в режиме проектирования через Инспектор объектов могут быть доступны не все свойства выбранного компонента. Эти свойства доступны в режиме выполнения и изменяются они программным путём.

Немного о компонентах

Чтобы у Вас не возникало путаниц и непонятных моментов, считаю необходимым сделать следующее уточнение. Все компоненты подразделяются на визуальные и невизуальные. Во время проектирования (Design-time) видны все компоненты без исключения. А вот во время выполнения (Run-time) - не все. Те, которые представляют собой какой-то видимый объект (поле, кнопка, таблица и т.д.) и являются визуальными. Невизуальные компоненты на экране не видны, но при этом используются в самой программе. В качестве примера невизуального компонента можно привести TApplicationEvents со вкладки Additional . Во время проектирования этот компонент присутствует на форме и он доступен через Инспектор объектов, но во время работы программы его не видно. За видимость объекта на экране в большинстве случаев отвечает свойство Visible (True - видимый, False - невидимый).

Однако в отличие от “просто†поля любое изменение значения некоторого свойства любого компонента сразу же приводит к изменению визуального представления этого компонента поскольку свойство инкапсулирует в себе методы действия связанные с чтением и записью этого поля которые в свою очередь включают в себя необходимую перерисовку. Свойства служат двум главным целям. А вовторых свойства определяют поведение формы или компонента.


Поделитесь работой в социальных сетях

Если эта работа Вам не подошла внизу страницы есть список похожих работ. Так же Вы можете воспользоваться кнопкой поиск


Лекция-8 (2 часа)

Тема: Свойства в Delphi

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

Существует несколько типов свойств, в зависимости от их “природы”, т.е. внутреннего устройства.

Рис. 1: Отображение комбинированных значений вложенных свойств

  • Простые свойства - это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы.
  • Перечислимые свойства - это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример - это свойство типа Boolean , которое может принимать значения True или False .
  • Вложенные свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “+” слева от названия таких свойств. Имеется два вида таких свойств: множества и комбинированные значения . Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как . Установки для вложенных свойств вида “множество” обычно имеют значения типа Boolean . Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных (рис 1). Некоторые свойства, например, Font , для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство.

Delphi позволяет легко манипулировать свойствами компонент как в режиме проектирования (design time), так и в режиме выполнения программы (run time).

В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или, как Вы уже видели, на страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector. Рис. 2: Изменение размеров с помощью Дизайнера Форм

С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком. В следующем разделе мы рассмотрим, как это делается.

Управление свойствами визуальных компонент в режиме выполнения

Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector. Однако, доступ к свойствам компонентов довольно легко получить программным путем. Все, что Вы должны сделать для изменения какого-либо свойства - это написать простую строчку кода аналогично следующей:

MyComponent . Width := 35;

Вышеприведенная строка устанавливает ширину (Width ) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, Вы увидите, как компонента визуально изменит свою ширину.

Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector просто является удобным способом

Рис. 3: Изменение размеров с помощью Инспектора Объектов

выполнения в режиме проектирования того, что может быть осуществлено программным путем в режиме выполнения. Более того, как уже было сказано выше, у компонента могут быть свойства, не отображаемые в окне Инспектора Объектов.

Объектно-ориентированный язык Паскаль, лежащий в основе Delphi, в качестве базового имеет принцип соответствия визуальных компонент тем вещам, которые они представляют. Разработчики Delphi поставили перед собой цель, чтобы, например, представление компонента Button (кнопка), инкапсулирующее некий код, соответствовало визуальному изображению кнопки на экране и являлось как можно более близким эквивалентом реальной кнопки, которую Вы можете найти на клавиатуре. И именно из этого принципа родилось понятие свойства.

Если Вы измените свойства Width и Height компонента Button , кнопка соответствующим образом изменит свои ширину и высоту. Вам нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так Вы и должны поступать. Свойства - это более чем просто данные. Напротив, они делают эти данные “живыми”, и все это происходит перед Вашими глазами! Свойства дают Вам иллюзию, как будто Вы имеете дело с реальными объектами, а не с их программным представлением.

Программа SHAPEDEM.DPR, изображенная на рис. 4, демонстрирует различные способы, с помощью которых можно изменять пользовательский интерфейс при выполнении программы. Эта программа не производит никаких полезных действий кроме демонстрации того, как легко можно создать “дельфийское” приложение с настраиваемым интерфейсом.

Программа SHAPEDEM содержит всего лишь объект TShape , размещенный на форме, вместе с двумя полосами прокрутки и несколькими кнопками. Эта программа интересна тем, что позволяет в режиме выполнения изменять размер, цвет и внешний вид объекта TShape , равно как размер и цвет самой формы.

Листинг А показывает код программы SHAPEDEM. Код головного модуля этой программы мы приведем по частям - по мере его написания.

Листинг А: Исходный код программы SHAPEDEM.DPR.

program Shapedem;

uses

Forms,

Mina in "MAIN.PAS" {Form1} ;

begin

Application.CreateForm(TForm1, Form1);

Application . Run ; Рис. 4: Программа SHAPEDEM

end . имеет 2 полосы прокрутки и несколько кнопок

В нашем примере полосы прокрутки (ScrollBars) используются для изменения размера фигуры, изображенной в средней части экрана, как показано на рис.5. Для выбора нового вида фигуры используйте выпадающий список (ComboBox), а для изменения цвета фигуры или окна (формы) используйте стандартное диалоговое окно выбора цвета, вызываемое кнопками “ Цвет фигуры ” и “ Цвет формы ”.

Что нужно сделать пользователю (программисту) для того чтобы получить

Рис. 5: Вы можете использовать полосы прокрутки, кнопки и список для изменения внешнего вида приложения

возможность “в режиме выполнения” изменять цвет какого-либо элемента или всего окна (формы)? Для этого достаточно выполнить всего лишь несколько действий. Убедитесь сами. Для изменения цвета окна просто выберите компонент ColorDialog из палитры компонентов (она находится на страничке “Dialogs”) и поместите его на форму. Кроме того, поместите на форму обычную кнопку (компонент Button , находится на страничке “Standard”). Для удобства чтения с помощью Object Inspector измените имя компонента (свойство Name ) с “Button1” (которое дается по умолчанию) на “FormColor”, а его заголовок (свойство Caption ) - на “Цвет формы”. Дважды щелкните по кнопке “Цвет формы” - Delphi сгенерирует заготовку метода, который выглядит следующим образом:

procedure

begin

end ;

Теперь введите две простые строчки кода:

procedure TForm1.FormColorClick(Sender: TObject);

begin

Form1.Color:= ColorDialog1.Color;

end ;

Данный код во время выполнения при нажатии кнопки “Цвет формы” вызывает стандартное диалоговое окно выбора цвета, как показано на рис.6.Если в этом диалоговом окне Вы щелкните кнопку OK, выполнится следующая строка:

Form 1. Color := ColorDialog 1. Color ;

Этот код установит свойство Color формы Form 1 в цвет, который был выбран с помощью диалогового окна ColorDialog 1 . Это очень просто!!!

Та же самая техника может использоваться для изменения цвета фигуры (компонент Shape , объект TShape). Все, что Вам нужно сделать - это поместить на форму другую кнопку, изменить (при желании) ее имя на “ShapeColor”, а заголовок - на “Цвет Фигуры”, дважды щелкнуть по ней мышкой и создать метод аналогичный следующему:

procedure TForm1.ShapeColorClick(Sender: TObject);

begin

if ColorDialog1.Execute then

Shape1.Brush.Color:= ColorDialog1.Color;

end ;

Что может быть проще?!!

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

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

Весь механизм Windows-сообщений, используемый при взаимодействии компонент во время выполнения, оказывается скрытым от программиста, делая процесс создания программ наиболее легким. Сложное программирование в среде Windows становится доступным “широким” массам программистов. Например, программирование изменения размера фигуры с помощью полос прокрутки, требовавшее в “чистом” Windows сложной обработки сообщений в конструкции типа “case”, в Delphi сводится к написанию одной-единственной строчки кода.

Для начала, поместите два компонента ScrollBar на форму (находится на страничке “Standard”) и установите свойство Kind первого компонента в sbHorizontal , а второго - в sbVertical . Переключитесь на страничку “Events” в Инспекторе Объектов и создайте заготовки метода для отклика на событие OnChange для каждой полосы прокрутки. Напишите в каждом из методов по одной строчке следующим образом:

procedure TForm1.ScrollBar1Change(Sender: TObject);

begin

Shape1.Width:= ScrollBar1.Position * 3;

end ;

procedure TForm1.ScrollBar2Change(Sender: TObject);

begin

Shape1.Height:= ScrollBar2.Position * 2;

end ;

Код, показанный здесь, устанавливает свойства Width и Height фигуры TShape в соответствие с положением “бегунка” на полосах прокрутки (сомножители 3 и 2 введены только для лучшего представления).

Последняя часть программы SHAPEDEM демонстрирует большие возможности языка Object Pascal, на основе которого построен Delphi. Вы можете ввести элементы в список компонента ComboBox как в режиме проектирования, так и при выполнении программы. При этом в режиме проектирования Вы можете просто ввести нужные элементы в список Items , щелкнув маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство (Items ).

Рис. 7: Текстовый редактор для ввода строк

Перед Вами появится диалоговое окно текстового редактора (String List Editor), в котором Вы и введете элементы (рис.7). Вы могли заметить, что список этих элементов совпадает со списком опций свойства Shape компонента Shape1 (Shape ). Другими словами, если Вы выделите компонент Shape1 на форме (просто щелкнув по нему) и посмотрите свойство Shape в Инспекторе Объектов, Вы увидите список возможных видов фигур, которые может принимать данный компонент. Это как раз те самые виды фигур, которые мы перечисляли в списке у компонента ComboBox1. Этот список Вы можете найти в on-line справочнике по Delphi по контексту “TShapeType”. Или же, если Вы заглянете в исходный код класса TShape , там увидите те же элементы, формирующие перечислимый тип TShapeType:

TShapeType = (stRectangle, stSquare, stRoundRect,

StRoundSquare, stEllipse, stCircle);

Итак, смысл всего сказанного в том, что за всеми объектами, которые Вы видите в “дельфийской” программе, стоит некий код на Паскале, к которому Вы имеете доступ при “прямом” программировании. Ничто не скрыто от Вас. Это значит, что Вы можете изменить поведение любой части Вашей программы во время выполнения путем написания соответствующего кода.

В нашем конкретном случае, Вам нужно написать только одну строчку кода, которая будет выполнена в качестве отклика на щелчок пользователем по выпадающему списку ComboBox1. Чтобы написать код этого отклика, в режиме проектирования выделите компонент ComboBox1 на форме (как всегда, просто щелкнув по нему левой кнопкой мыши), затем перейдите на страничку “Events” в Инспекторе Объектов. Дважды щелкните по пустому полю напротив события OnClick . В редакторе автоматически сгенерируется следующая заготовка метода:

procedure

begin

end ;

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

procedure TForm1.ComboBox1Click(Sender: TObject);

begin

Shape1.Shape:= TShapeType(ComboBox1.ItemIndex);

end ;

Эта строчка кода устанавливает свойство Shape компонента Shape1 в вид, который пользователь выберет в выпадающем списке. Этот код работает благодаря соответствию между порядковыми членами перечислимого типа и числовыми значениями различных элементов в ComboBox . Другими словами, первый элемент перечислимого типа имеет значение 0, что соответствует первому элементу, показанному в ComboBox (см. рис.7). Давайте рассмотрим этот подход несколько подробней.

Если Вы рассмотрите декларацию перечислимого типа TShapeType, Вы увидите, что первый его элемент называется “stRectangle”. По определению, компилятор назначает этому элементу порядковый номер 0. Следующему по порядку элементу назначается номер 1 и т.д. Таким образом, слова “stRectangle”, “stSquare” и т.п., в действительности, просто символизируют порядковые номера в данном перечислимом типе. На элементы в списке ComboBox также можно сослаться по их порядковому номеру, начиная с 0. Именно поэтому так важно (в данном случае) вводить указанные строки в строгом соответствии с декларацией типа TShapeType. Таким образом, используя преобразование типа “ TShapeType (ComboBox 1. ItemIndex ) ”, Вы можете указать компилятору, что общего имеют элементы в ComboBox и перечислимый тип в TShapeType: а именно, порядковые номера.

Итак, Вы видите, что Delphi является очень гибким и мощным программным средством, которое позволяет Вам быстро реализовать логику Вашей программы и предоставляет полное управление приложением.

Другие похожие работы, которые могут вас заинтересовать.вшм>

6923. Методы в Delphi 57.07 KB
Для создания программы CONTROL1 поместите с помощью мышки компонент Edit находится на страничке “Stndrd†Палитры Компонентов на форму. После этого в активизировавшемся окне Редактора Вы увидите сгенерированный “скелет†метода Edit1DblClick являющегося реакцией на событие OnDblClick: procedure TForm1.Edit1DblClickSender: TObject; begin Edit1. Текст в этой строке изменится в соответствии с тем что мы написали в методе Edit1DblClick: см.
6924. События в Delphi 19.79 KB
События в Delphi Объекты из библиотеки визуальных компонент VCL Delphi равно как и объекты реального мира имеют свой набор свойств и свое поведение набор откликов на события происходящие с ними. Среди набора событий для различных объектов из VCL есть как события портируемые из Windows MouseMove KeyDown так и события порождаемые непосредственно в программе DtChnge для TDtSource. Простейшие события на которые иногда нужно реагировать это например события связанные с мышкой они есть практически у всех видимых объектов...
2451. GDI: графика в Delphi 26.05 KB
В Delphi контекст устройства представлен как TCnvs. Ниже приведены две функции которые используются для рисования линий и обе принадлежат TCnvs: Имя Описание Пример MoveTo Перемещает точку начала рисования линии в указанные координаты x и y Cnvs. Cnvs. например Cnvs.
6933. Управление проектом Delphi 80.6 KB
Как Вы увидите позже, большинство операций из пункта меню “File” можно выполнить с помощью Менеджера Проекта (Project Manager), который можно вызвать из пункта меню View. Некоторые операции доступны и через SpeedBar. Данная стратегия типична для Delphi: она предоставляет несколько путей для решения одной и той же задачи, Вы сами можете решать, какой из них более эффективен в данной ситуации.
6929. История языка Delphi 13.01 KB
Delphi это греческий город где жил дельфийский оракул. Delphi это комбинация нескольких важнейших технологий: Высокопроизводительный компилятор в машинный код Объектно-ориентированная модель компонент Визуальное а следовательно и скоростное построение приложений из программных прототипов Масштабируемые средства для построения баз данных Компилятор в машинный код Компилятор встроенный в Delphi обеспечивает высокую производительность необходимую для построения приложений в архитектуре...
6932. Стандартные компоненты Delphi 28.77 KB
На первой странице Палитры Компонент размещены 14 объектов рис. Создание меню включает три шага: 1 помещение TMinMenu на форму 2 вызов Дизайнера Меню через свойство Items в Инспекторе Объектов 3 определение пунктов меню в Дизайнере Меню. Вы можете изменить шрифт и цвет метки если дважды щелкнете на свойство Font в Инспекторе Объектов. Это полный список объектов на первой странице Палитры Компонент.
6931. Среда программирования Delphi 25.84 KB
0 Word for Windows Progrm Mnger это все MDI приложения и выглядят подругому чем Delphi. Среда Delphi же следует другой спецификации называемой Single Document Interfce SDI и состоит из нескольких отдельно расположенных окон. Если Вы используете SDI приложение типа Delphi то уже знаете что перед началом работы лучше минимизировать другие приложения чтобы их окна не загромождали рабочее пространство.
1421. Способы активизации 4-х окон Delphi 232.27 KB
Вычислить зарплату преподавателя с вычетом подоходного налога(13%) либо без него за указанный период (в часах) с учетом ставки почасовой оплаты: ассистент – 75 рублей/час, доцент – 150 рублей/час, профессор – 200 рублей/час. Рекомендованный вид формы показан на рисунке. Предусмотреть, чтобы пользователь мог ввести в поле
20996. Графические объекты в среде Delphi 365.54 KB
Цель работы: изучение графических возможностей среды Delphi для создания учебного материала по графике в Delphi. Для работы с графикой в Delphi существует библиотека визуальных компонентов VCL скрывающая механизм взаимодействия приложения с операционной системой и облегчающая работу с графикой. В каждом параграфе предлагается основной теоретический материал по теме практические задания с описанием пошагового выполнения действий для их выполнения вопросы для закрепления основных умений и навыков вырабатываемых в процессе изучения...
12494. Разработка аудиоплеера в кроссплатформенной среде Embarcadero Delphi 1.21 MB
Профессия программиста состоит не только из написания кода к физическим и логическим объектам программной среды она подразумевает умение работать с растровыми и векторными графическими редакторами использовать внешние аудио библиотеки и кодеки группировать объекты согласно их назначению и придавать законченный программный вид понятный и доступный для работы широкого спектра пользователей. Embrcdero Delphi [дэ́лф’и] ранее Borlnd Delphi и CodeGer Delphi интегрированная среда разработки ПО для Microsoft Windows Mc OS iOS иndroid на...

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

BorderIcons – свойство определяет, какие кнопки должны быть у полученного окна. Имеет только 4 значения, каждое из которых может быть True , то есть кнопка есть, и False , то есть, ее нет.

  • BiSystemMenu определяет, будет ли у формы системное меню, которое показано в виде иконки слева на заголовке окна. Кроме того, будут ли там другие кнопки заголовка.
  • BiMinimize определяет кнопку минимизации (сворачивания) окна. При этом False не убирает саму кнопку, а только делает ее неактивной.
  • BiMaximize точно также определяет кнопку разворачивания окна.
  • BiHelp – кнопка помощи в виде вопросительного знака. Не покажется у обычного вида формы, даже если поставить в True .

BorderStyle – свойство формы, определяет ее общий вид. Может быть:

  • BsSizeable – обычное окно. Установлено по умолчанию. Стандартное окно, которое может менять размеры.
  • BsDialog – окно в форме диалога, имеет только кнопку "закрыть".
  • BsNone – окно вообще без оборки и без заголовка окна.
  • BsSingle – отличается от обычного окна тем, что у него нельзя изменить размеры.
  • BsSizeToolWin – окно с тонкой оборкой. Особенно это заметно у заголовка окна.
  • BsToolWindow – такое же, как предыдущее, но у этого окна нельзя менять размеры.

BorderWidth – ширина оборки окна. По умолчанию установлен 0.

Color – цвет рабочей области окна. Не очень-то увлекайтесь раскраской окон! По крайней мере, помните, что если вы решили сделать окно, непохожее на стандартное, то все окна приложения придется делать такими же, чтобы поддержать общий стиль программы. А вообще все профессиональные приложения стремятся иметь стандартный вид.

Cursor – вид указателя мыши. Вы выбираете, как будет выглядеть указатель при наведении на форму.

Font – выбор шрифта по умолчанию. Другими словами, если Вы измените шрифт, то все компоненты, устанавливаемые на форму, по умолчанию примут его.

Height – высота окна. Обратите внимание, что когда вы мышью изменяете размер окна, это свойство автоматически меняет значение.

Icon – иконка в заголовке окна. Если дважды щелкнуть по этому свойству, выйдет окно загрузки другой иконки. По умолчанию установлена стандартная иконка Delphi 7, но можно сделать и свою собственную. Чаще всего используют коллекции иконок, скачанных из интернета. Но если Вы чувствуете в себе талант художника, можете попробовать сделать иконку для своего проекта самостоятельно. Для этого используйте встроенную утилиту Editor, ярлык которой находится там же, где Delphi. Выберите команду "File – New – Icon file", и рисуйте на здоровье!

Name – имя компонента формы. Это свойство вместе со свойством Caption мы уже рассматривали, так что просто вспомним, что Name главной формы желательно всегда указывать одинаково, например, fMain .

Position – расположение окна. Довольно важное свойство! Оно имеет несколько значений:

  • PoDefault – Windows сам будет решать, где расположить Ваше окно на экране, и какие у него будут размеры.
  • PoDefaultPosOnly – Windows решает, где будет окно, а размеры его будут такими же, как Вы их установили.
  • PoDefaultSizeOnly – позиция остается, как Вы указали, но Windows решает, какие у окна будут размеры.
  • PoDesigned – это значение по умолчанию. И позиция, и размеры остаются такими, как Вы их создали.
  • PoDesktopCenter – выбирайте этот вариант, если желаете, чтобы окно всегда выходило по центру рабочего стола.
  • PoMainFormCenter – это значение используют для дочерних окон, о которых речь будет впереди. Если у дочернего окна выбран этот вариант, то оно всегда будет появляться по центру главной формы.
  • PoOwnerFormCenter – это значение заставит дочернее окно появляться по центру того окна, из которого оно вызвано.
  • PoScreenCenter – окно появляется по центру экрана. Почти то же самое, что и PoDesktopCenter .

Width – ширина окна. Как и высота, это свойство меняет свое значение, когда Вы меняете размер формы.

WindowState – состояние окна после запуска. Имеет три значения:

  • WsNormal – по умолчанию. Окно показывается в нормальном состоянии.
  • WsMaximized – окно появляется в развернутом виде.
  • WsMinimized – окно появляется в свернутом виде.

Вот, собственно, и все основные . Теперь попробуйте поэкспериментировать с этими свойствами, и посмотреть, как будет меняться внешний вид формы. Большинство из этих свойств общие для всех компонентов. Мы уже говорили, что свойства компонента (в данном случае, формы) можно рассматривать как переменные определенных типов. Значения в эти свойства чаще всего заносят в момент создания формы, с помощью Объектного инспектора. Однако многие свойства позволяют заносить в них новые значения программно, то есть, в момент работы готового приложения.

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

Свойство Align

Задает способ выравнивания компонента внутри формы. Имеет одно из следующих значений:

Значение

Описание

Выравнивание не используется. Компонент располагается на том месте, куда был помещен во время создания программы. Принимается по умолчанию

Компонент перемещается в верхнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Компонент перемещается в нижнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Компонент перемещается в левую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

Компонент перемещается в правую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

Компонент занимает всю рабочую область формы

Свойство Color

Задает цвет фона формы или цвет компонента или графического объекта. Может иметь одно из следующих значений:

Цвета, приведенные в следующей таблице, являются системными цветами Windows и зависят от используемой цветовой схемы.

Значение

Текущий цвет фона окна

CllnactiveCaption

Текущий цвет заголовка неактивного окна

Текущий цвет фона меню

Текущий цвет фона Windows

Текущий цвет рамки окна

Текущий цвет текста элемента меню

Текущий цвет текста внутри окна

Текущий цвет заголовка активного окна

Текущий цвет рамки активного окна

CllnactiveBorder

Текущий цвет рамки неактивного окна

Текущий цвет рабочей области окна

Текущий цвет фона выделенного текста

ClHightlightText

Текущий цвет выделенного текста

Текущий цвет кнопки

Текущий цвет фона кнопки

Текущий цвет недоступного элемента меню

Текущий цвет текста кнопки

Помимо перечисленных в таблице цветов значение свой­ства Color может задаваться шестнадцатеричными значениями.

Свойство Ctl3D

Позволяет задать вид компонента. Если значение этого свойства равно False, компонент имеет двумерный вид, если True - трехмерный (значение по умолчанию).

Свойство Cursor

Позволяет определить вид курсора, который он будет иметь, находясь в активной области компонента. В DELPHY предопределено большое количество стандартных курсоров. Кроме того, пользователь может создавать свои собственные курсоры или использовать созданные другими.

Свойство DrogCursor

Позволяет определить вид курсора, который будет отображаться, когда в компонент «перетаскивается» другой компонент. Значения этого свойства те же, что и у свойства Cursor.

Свойство DrogMode

Позволяет определить режим поддержки протокола drag-and-drop. Возможны следующие значения:

Свойство Enabled

Если это свойство имеет значение True, компонент реагирует на сообщения от мыши, клавиатуры и таймера. В противном случае (значение False) эти сообщения игнорируются.

Свойство Font

Многие визуальные компоненты используют шрифт по умолчанию. При создании компонента изначальное значение свойства Font (класс TFont) имеет следующие параметры:

Свойство

Значение

— MulDiv(10, GetDeviceCaps(DC, LOGPIXELSY), 72)

Свойство Height

Это свойство задает вертикальный размер компонента или формы.

Свойство HelpContext

Задает номер контекста справочной системы. Этот номер должен быть уникальным для каждого компонента. Если компонент активен (находится в фокусе), нажатие клавиши F1 приводит к отображению экрана справочной системы (если такой существует для данного компонента).

Свойство Hint

Задает текст, который будет отображаться при обработке события OnHint, происходящего, если курсор находится в области компонента.

Свойство Left

Задает горизонтальную координату левого угла компонента относительно формы в пикселах. Для форм это значение указывается относительно экрана.

Свойство ParentColor

Это свойство позволяет указать, каким цветом будет отображаться компонент. Если значение этого свойства равно True, компонент использует цвет (значение свойства Color) родительского компонента. Если же значение свойства ParentColor равно False, компонент использует значение собственного свойства Color.

Свойство ParentCtl3D

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

Свойство ParentFont

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

Свойство PopupMenu

Это свойство задает название локального меню, которое будет отображаться при нажатии правой кнопки мыши. Локальное меню отображается только в случае, когда свойство AutoPopup имеет значение True или когда вызывается метод Popup.

Свойство TabOrder

Задает порядок получения компонентами фокуса при нажатии клавиши Tab. По умолчанию этот порядок определяется размещением компонентов в форме: первый компонент имеет значение этого свойства, равное 0, второй - 1 и т. д. Для изменения этого порядка необходимо изменить значение свойства TabOrder определенного компонента. TabOrder может использоваться только совместно со свойством Tab Stop.

Свойство TabStop

Это свойство позволяет указать, может компонент получать фокус или нет. Компонент получает фокус, если значение его свойства TabStop равно Тruе.

Свойство Tag

С помощью этого свойства можно «привязать» к любому компоненту значение типа Longlnt.

Обзор

Управление свойствами визуальных компонент в режиме выполнения

Программа SHAPEDEM2

Заключение

Каждый компонент, который Вы помещаете на форму, имеет свое отражение в окне Инспектора Объектов (Object Inspector). Как Вы помните, Object Inspector имеет две “странички” - “Properties” (Свойства) и “Events” (События). Создание программы в Delphi сводится к “нанесению” компонент на форму (которая, кстати, также является компонентом) и настройке взаимодействия между ними путем:

  • изменения значения свойств этих компонент
  • написания адекватных реакций на события .

Более подробно события мы рассмотрим на следующем уроке, а сейчас сосредоточимся на свойствах и, в меру необходимости, затронем создание откликов на события.

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

Существует несколько типов свойств, в зависимости от их “природы”, т.е. внутреннего устройства.

  • Простые свойства - это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы.
  • Перечислимые свойства - это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример - это свойство типа Boolean , которое может принимать значения True или False .
  • Вложенные свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “ +” слева от названия таких свойств. Имеется два вида таких свойств: множества и комбинированные значения . Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как . Установки для вложенных свойств вида “множество” обычно имеют значения типа Boolean . Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных (рис 1). Некоторые свойства, например, Font , для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство.

Delphi позволяет легко манипулировать свойствами компонент как в режиме проектирования (design time), так и в режиме выполнения программы (run time).

В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или, как Вы уже видели, на страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector.

С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком. В следующем разделе мы рассмотрим, как это делается.

      1. Управление свойствами визуальных компонент в режиме выполнения
      2. Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector. Однако, доступ к свойствам компонентов довольно легко получить программным путем. Все, что Вы должны сделать для изменения какого-либо свойства - это написать простую строчку кода аналогично следующей:

        MyComponent.Width:= 35;

        Вышеприведенная строка устанавливает ширину (Width ) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, Вы увидите, как компонента визуально изменит свою ширину.

        Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector просто является удобным способом выполнения в режиме проектирования того, что может быть осуществлено программным путем в режиме выполнения. Более того, как уже было сказано выше, у компонента могут быть свойства, не отображаемые в окне Инспектора Объектов.

        Объектно-ориентированный язык Паскаль, лежащий в основе Delphi, в качестве базового имеет принцип соответствия визуальных компонент тем вещам, которые они представляют. Разработчики Delphi поставили перед собой цель, чтобы, например, представление компонента Button (кнопка), инкапсулирующее некий код, соответствовало визуальному изображению кнопки на экране и являлось как можно более близким эквивалентом реальной кнопки, которую Вы можете найти на клавиатуре. И именно из этого принципа родилось понятие свойства.

        Если Вы измените свойства Width и Height компонента Button , кнопка соответствующим образом изменит свои ширину и высоту. Вам нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так Вы и должны поступать. Свойства - это более чем просто данные. Напротив, они делают эти данные “живыми”, и все это происходит перед Вашими глазами! Свойства дают Вам иллюзию, как будто Вы имеете дело с реальными объектами, а не с их программным представлением.

        Программа SHAPEDEM.DPR, изображенная на рис. 4, демонстрирует различные способы, с помощью которых можно изменять пользовательский интерфейс при выполнении программы. Эта программа не производит никаких полезных действий кроме демонстрации того, как легко можно создать “дельфийское” приложение с настраиваемым интерфейсом.

        Программа SHAPEDEM содержит всего лишь объект TShape , размещенный на форме, вместе с двумя полосами прокрутки и несколькими кнопками. Эта программа интересна тем, что позволяет в режиме выполнения изменять размер, цвет и внешний вид объекта TShape , равно как размер и цвет самой формы.


        Рис. 4: Программа SHAPEDEM имеет 2 полосы прокрутки и несколько кнопок

        Листинг А показывает код программы SHAPEDEM. Код головного модуля этой программы мы приведем по частям - по мере его написания.

        Листинг А: Исходный код программы SHAPEDEM.DPR.

        program Shapedem;

        uses

        Forms,

        Mina in "MAIN.PAS" {Form1} ;

        begin

        Application.CreateForm(TForm1, Form1);

        Application.Run;

        end .


        В нашем примере полосы прокрутки (ScrollBars) используются для изменения размера фигуры, изображенной в средней части экрана, как показано на рис.5. Для выбора нового вида фигуры используйте выпадающий список (ComboBox), а для изменения цвета фигуры или окна (формы) используйте стандартное диалоговое окно выбора цвета, вызываемое кнопками “ Цвет фигуры ” и “ Цвет формы ”.

        Что нужно сделать пользователю (программисту) для того чтобы получить возможность “в режиме выполнения” изменять цвет какого-либо элемента или всего окна (формы)? Для этого достаточно выполнить всего лишь несколько действий. Убедитесь сами. Для изменения цвета окна просто выберите компонент ColorDialog из палитры компонентов (она находится на страничке “Dialogs”) и поместите его на форму. Кроме того, поместите на форму обычную кнопку (компонент Button , находится на страничке “Standard”). Для удобства чтения с помощью Object Inspector измените имя компонента (свойство Name ) с “Button1” (которое дается по умолчанию) на “FormColor”, а его заголовок (свойство Caption ) - на “Цвет формы”. Дважды щелкните по кнопке “Цвет формы” - Delphi сгенерирует заготовку метода, который выглядит следующим образом:

        procedure

        begin

        end ;

        Теперь введите две простые строчки кода:

        procedure TForm1.FormColorClick(Sender: TObject);

        begin

        if ColorDialog1.Execute then

        end ;

        Данный код во время выполнения при нажатии кнопки “Цвет формы” вызывает стандартное диалоговое окно выбора цвета, как показано на рис.6.Если в этом диалоговом окне Вы щелкните кнопку OK, выполнится следующая строка:

        Form1.Color:=ColorDialog1.Color;

        Этот код установит свойство Color формы Form1 в цвет, который был выбран с помощью диалогового окна ColorDialog1 . Это очень просто!!!

        Та же самая техника может использоваться для изменения цвета фигуры (компонент Shape , объект TShape). Все, что Вам нужно сделать - это поместить на форму другую кнопку, изменить (при желании) ее имя на “ShapeColor”, а заголовок - на “Цвет Фигуры”, дважды щелкнуть по ней мышкой и создать метод аналогичный следующему:

        procedure TForm1.ShapeColorClick(Sender: TObject);

        begin

        if ColorDialog1.Execute then

        Shape1.Brush.Color:= ColorDialog1.Color;

        end ;

        Что может быть проще?!!

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

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

        Весь механизм Windows-сообщений, используемый при взаимодействии компонент во время выполнения, оказывается скрытым от программиста, делая процесс создания программ наиболее легким. Сложное программирование в среде Windows становится доступным “широким” массам программистов. Например, программирование изменения размера фигуры с помощью полос прокрутки, требовавшее в “чистом” Windows сложной обработки сообщений в конструкции типа “case”, в Delphi сводится к написанию одной-единственной строчки кода.

        Для начала, поместите два компонента ScrollBar на форму (находится на страничке “Standard”) и установите свойство Kind первого компонента в sbHorizontal , а второго - в sbVertical . Переключитесь на страничку “Events” в Инспекторе Объектов и создайте заготовки метода для отклика на событие OnChange для каждой полосы прокрутки. Напишите в каждом из методов по одной строчке следующим образом:

        procedure TForm1.ScrollBar1Change(Sender: TObject);

        begin

        Shape1.Width:= ScrollBar1.Position * 3;

        end ;

        procedure TForm1.ScrollBar2Change(Sender: TObject);

        begin

        Shape1.Height:= ScrollBar2.Position * 2;

        end ;

        Код, показанный здесь, устанавливает свойства Width и Height фигуры TShape в соответствие с положением “бегунка” на полосах прокрутки (сомножители 3 и 2 введены только для лучшего представления).

        Последняя часть программы SHAPEDEM демонстрирует большие возможности языка Object Pascal, на основе которого построен Delphi. Вы можете ввести элементы в список компонента ComboBox как в режиме проектирования, так и при выполнении программы. При этом в режиме проектирования Вы можете просто ввести нужные элементы в список Items , щелкнув маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство (Items ).


        Перед Вами появится диалоговое окно текстового редактора (String List Editor), в котором Вы и введете элементы (рис.7). Вы могли заметить, что список этих элементов совпадает со списком опций свойства Shape компонента Shape1 (Shape ). Другими словами, если Вы выделите компонент Shape1 на форме (просто щелкнув по нему) и посмотрите свойство Shape в Инспекторе Объектов, Вы увидите список возможных видов фигур, которые может принимать данный компонент. Это как раз те самые виды фигур, которые мы перечисляли в списке у компонента ComboBox1. Этот список Вы можете найти в on-line справочнике по Delphi по контексту “TShapeType”. Или же, если Вы заглянете в исходный код класса TShape , там увидите те же элементы, формирующие перечислимый тип TShapeType:

        TShapeType = (stRectangle, stSquare, stRoundRect,

        stRoundSquare, stEllipse, stCircle);

        Итак, смысл всего сказанного в том, что за всеми объектами, которые Вы видите в “дельфийской” программе, стоит некий код на Паскале, к которому Вы имеете доступ при “прямом” программировании. Ничто не скрыто от Вас. Это значит, что Вы можете изменить поведение любой части Вашей программы во время выполнения путем написания соответствующего кода.

        В нашем конкретном случае, Вам нужно написать только одну строчку кода, которая будет выполнена в качестве отклика на щелчок пользователем по выпадающему списку ComboBox1. Чтобы написать код этого отклика, в режиме проектирования выделите компонент ComboBox1 на форме (как всегда, просто щелкнув по нему левой кнопкой мыши), затем перейдите на страничку “Events” в Инспекторе Объектов. Дважды щелкните по пустому полю напротив события OnClick . В редакторе автоматически сгенерируется следующая заготовка метода:

        procedure

        begin

        end ;

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

        procedure TForm1.ComboBox1Click(Sender: TObject);

        begin

        Shape1.Shape:= TShapeType(ComboBox1.ItemIndex);

        end ;

        Эта строчка кода устанавливает свойство Shape компонента Shape1 в вид, который пользователь выберет в выпадающем списке. Этот код работает благодаря соответствию между порядковыми членами перечислимого типа и числовыми значениями различных элементов в ComboBox . Другими словами, первый элемент перечислимого типа имеет значение 0, что соответствует первому элементу, показанному в ComboBox (см. рис.7). Давайте рассмотрим этот подход несколько подробней.

        Если Вы рассмотрите декларацию перечислимого типа TShapeType, Вы увидите, что первый его элемент называется “stRectangle”. По определению, компилятор назначает этому элементу порядковый номер 0. Следующему по порядку элементу назначается номер 1 и т.д. Таким образом, слова “stRectangle”, “stSquare” и т.п., в действительности, просто символизируют порядковые номера в данном перечислимом типе. На элементы в списке ComboBox также можно сослаться по их порядковому номеру, начиная с 0. Именно поэтому так важно (в данном случае) вводить указанные строки в строгом соответствии с декларацией типа TShapeType. Таким образом, используя преобразование типа “ TShapeType(ComboBox1.ItemIndex) ”, Вы можете указать компилятору, что общего имеют элементы в ComboBox и перечислимый тип в TShapeType: а именно, порядковые номера.

        Итак, Вы видите, что Delphi является очень гибким и мощным программным средством, которое позволяет Вам быстро реализовать логику Вашей программы и предоставляет полное управление приложением.

Программа SHAPEDEM проста в написании и в освоении. Однако при изменении пользователем размера окна она будет выглядеть “некрасиво”. Давайте изменим ее таким образом, чтобы программа сама обрабатывала изменение размера окна, а заодно изучим компонент меню. Для достижения этих целей сделаем следующее:

  • Кнопки и выпадающий список уберем с экрана и вместо них поместим на форму компонент меню (MainMenu )
  • “Заставим” полосы прокрутки изменять свое положение в зависимости от размера окна
  • “Заставим” свойство Position полос прокрутки изменяться, чтобы правильно отражать размер формы.

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


Рис. 8: Программа SHAPDEM2 имеет возможность реагировать на изменение пользователем размера окна

Листинг B : Программа SHAPDEM2 включает метод FormOnResize. Представлен главный модуль.

unit Main;

interface

uses

WinTypes, WinProcs, Classes, Graphics, Forms, Controls, ColorDlg, StdCtrls, Menus, Dialogs, ExtCtrls;

type

TForm1 = class (TForm)

Shape1: TShape;

ColorDialog1: TColorDialog;

ScrollBar1: TScrollBar;

ScrollBar2: TScrollBar;

MainMenu1: TMainMenu;

Shapes1: TMenuItem;

ShapeColor1: TMenuItem;

FormColor1: TMenuItem;

Shapes2: TMenuItem;

Rectangle1: TMenuItem;

Square1: TMenuItem;

RoundRect1: TMenuItem;

RoundSquare1: TMenuItem;

Ellipes1: TMenuItem;

Circle1: TMenuItem;

Exit1: TMenuItem;

procedure NewShapeClick(Sender: TObject);

procedure ShapeColorClick(Sender: TObject);

procedure FormColorClick(Sender: TObject);

procedure ScrollBar2Change(Sender: TObject);

procedure ScrollBar1Change(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure Exit1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end ;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure

begin

as TMenuItem).Tag);

end ;

procedure

begin

if ColorDialog1.Execute then

end ;

procedure

begin

if ColorDialog1.Execute then

Form1.Color:= ColorDialog1.Color;

end ;

procedure TForm1.ScrollBar2Change(Sender: TObject);

begin

Shape1.Height:= ScrollBar2.Position;

end ;

procedure TForm1.ScrollBar1Change(Sender: TObject);

begin

Shape1.Width:= ScrollBar1.Position;

end ;

procedure

var

Menu,

Caption,

Frame: Integer;

begin

Scrollbar1.Max:= Width;

Scrollbar2.Max:= Height;

Scrollbar1.Top:= Height - ScrollBar2.Width - Frame - Caption - Menu;

Scrollbar2.Height:= Height - Frame - Caption - Menu - Scrollbar1.Height;

end ;

procedure TForm1.Exit1Click(Sender: TObject);

begin

Close;

end ;

end .

Главное меню для программы создается с помощью компонента MainMenu (находится на страничке “Standard” палитры компонентов). Поместив его на форму, дважды щелкните по нему мышкой - откроется редактор меню, в котором Вы сможете ввести нужные Вам названия пунктов меню и, при желании, изменить их имена (задаваемые Delphi по умолчанию) для удобочитаемости. Создадим меню программы SHAPEDEM2 с тремя главными пунктами: “ Цвета ”, “ Фигуры ”, “ Выход ”.

Для первого пункта создадим следующие подпункты:

  • Цвет фигуры
  • Цвет окна

Для второго:

  • Прямоугольник
  • Квадрат
  • Закругленный прямоугольник
  • Закругленный квадрат
  • Эллипс
  • Окружность

Третий пункт меню не будет содержать никаких подпунктов.

После создания всех пунктов и подпунктов меню для работы программы SHAPEDEM2 нужно назначить номера для каждого из подпунктов меню, связанных с типом фигуры. Для этого воспользуемся свойством Tag , имеющимся у каждого пункта меню. Свойство Tag (типа Integer ) специально введено в каждый компонент Delphi с тем, чтобы программисты могли использовать его по своему усмотрению. Назначим 0 свойству Tag пункта “ Прямоугольник ”, 1 - пункту “ Квадрат ”, 2 - пункту “ Закругленный прямоугольник ” и т.д. Цель такого назначения будет объяснена позднее.

Два метода, созданные для подпунктов изменения цвета аналогичны тем, которые были в программе SHAPEDEM:

procedure TForm1.ShapeColorClick(Sender: TObject);

begin

if ColorDialog1.Execute then

Shape1.Brush.Color:= ColorDialog1.Color;

end ;

procedure TForm1.FormColorClick(Sender: TObject);

begin

if ColorDialog1.Execute then

Form1.Color:= ColorDialog1.Color;

end ;

Как Вы видите, ничего не изменилось по сравнению с первой версией программы, хотя данные методы уже вызываются из меню, а не из кнопок.

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

procedure TForm1.NewShapeClick(Sender: TObject);

begin

Shape1.Shape:= TShapeType((Sender as TMenuItem).Tag);

end ;

Этот код “работает” правильно благодаря тому, что перечислимый тип TShapeType в качестве начального имеет значение 0 и в свойство Tag подпунктов меню мы также записали порядковые номера, начинающиеся с нуля.

Отметим, что мы использовали оператор as , который позволяет надежно преобразовывать типы из одного в другой: в частности, преобразовать параметр Sender (имеющий общий тип TObject ) в тип TMenuItem . Как правило, параметр Sender в Delphi - это управляющий элемент, посылающий сообщения функции, в которой он фигурирует. В данном случае, Sender является пунктом меню, и, следовательно, Вы можете работать с этим параметром как если бы он был декларирован с типом TMenuItem .

Главная причина использования оператора as состоит в том, что он обеспечивает очень ясный синтаксис, даже если Вы проводите сложное двухуровневое преобразование типов. Более того, оператор as обеспечивает проверку преобразования в режиме выполнения программы. Когда Вы используете оператор as , Вы можете быть уверены в том, что преобразование Sender в TMenuItem реально будет произведено лишь в том случае, если Sender действительно имеет тип TMenuItem .

Две полосы прокрутки в программе SHAPEDEM2 всегда будут располагаться возле границ окна, независимо от его размеров. Выполнение этих действий требует от Вас написания несколько более сложного программирования, чем было ранее. Как было указано ранее, Delphi, хотя и скрывает от программиста детали Windows-программирования, однако не запрещает обращаться к функциям Windows API (прикладного пользовательского интерфейса). Таким образом, Delphi поддерживает низкоуровневое программирование на уровне Windows API. Короче говоря, если Вам нужно углубиться в дебри низкоуровневого программирования - пожалуйста!

procedure TForm1.FormResize(Sender: TObject);

var

Menu,

Caption,

Frame: Integer;

begin

Caption:= GetSystemMetrics(sm_cyCaption);

Frame:= GetSystemMetrics(sm_cxFrame) * 2;

Menu:= GetSystemMetrics(sm_cyMenu);

Scrollbar1.Max:= Width;

Scrollbar2.Max:= Height;

Scrollbar2.Left:= Width - Frame - Scrollbar2.Width;

Scrollbar1.Top:=

Scrollbar1.Width:= Width - Scrollbar2.Width - Frame;

end ;

Код, показанный здесь, является реакцией на событие OnResize . Это событие перечислено среди других на страничке “Events” Инспектора Объектов в состоянии, когда выбрана форма (окно). Как Вы можете ожидать, событие (сообщение) OnResize посылается форме (окну) каждый раз, когда пользователь “захватывает” мышкой за какой-либо край окна и делает размер окна большим или меньшим. Однако, это же сообщение (событие) посылается окну и тогда, когда происходит максимизация окна (но не минимизация).

Первое, что делается в данном методе - запрашиваются системные параметры, определяющие размеры заголовка окна, огибающей его рамки и меню. Эта информация “добывается” путем вызова функции GetSystemMetrics , являющейся частью Windows API. Функции GetSystemMetrics передается один аргумент в виде константы, определяющей вид запрашиваемой информации. Например, если Вы передадите функции константу sm_cyCaption , получите в качестве результата высоту заголовка окна (в пикселах). Полный список этих констант имеется в on-line справочнике Delphi (Help|Windows API|Alphabetical functions|User functions|GetSystemMetrics), здесь же мы приведем небольшую выдержку из справочника:

  • SM_CXBORDER Ширина огибающей окно рамки, размер которой не может быть изменен.

    SM_CYBORDER Высота огибающей окно рамки, размер которой не может быть изменен.

    SM_CYCAPTION Высота заголовка окна, включая высоту огибающей окно рамки, размер которой не может быть изменен (SM_CYBORDER).

    SM_CXCURSOR Ширина курсора.

    SM_CYCURSOR Высота курсора.

    SM_CXFRAME Ширина огибающей окно рамки, размер которой может быть изменен.

    SM_CYFRAME Высота огибающей окно рамки, размер которой может быть изменен.

    SM_CXFULLSCREEN Ширина клиентской части для полноэкранного окна.

    SM_CYFULLSCREEN Высота клиентской части для полноэкранного окна (эквивалентна высоте экрана за вычетом высоты заголовка окна).

    SM_CXICON Ширина иконки.

    SM_CYICON Высота иконки.

    SM_CYMENU Высота полосы меню в одну строку. Это высота меню за вычетом высоты огибающей окно рамки, размер которой не может быть изменен (SM_CYBORDER).

    SM_CXMIN Минимальная ширина окна.

    SM_CYMIN Минимальная высота окна.

    SM_CXSCREEN Ширина экрана.

    SM_CYSCREEN Высота экрана.

    SM_MOUSEPRESENT Не 0, если мышь установлена.

  • В методе FormResize программа вычисляет новые размеры полос прокрутки:

    Scrollbar1.Max:= Width;

    Scrollbar2.Max:= Height;

    Scrollbar2.Left:= Width - Frame - Scrollbar2.Width;

    Scrollbar2.Height:= Height - Frame - Caption - Menu;

    Scrollbar1.Top:=

    Height - Scrollbar2.Width - Frame - Caption - Menu;

    Scrollbar1.Width:= Width - Scrollbar2.Width - Frame;

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

    В программе SHAPEDEM свойство Max каждой полосы прокрутки оставалось равным значению по умолчанию - 100; это означало, что после того как бегунок полосы прокрутки пройдет все доступное расстояние (как для вертикальной, так и для горизонтальной полосы прокрутки), свойство Position будет установлено в 100. Если бегунок возвращался к началу, свойство Position устанавливалось равным свойству Min , которое, по умолчанию, 0.

    В программе SHAPEDEM2 Вы можете изменять значения свойств Min и Max так, чтобы диапазон значений Position полос прокрутки отражал текущий размер окна (формы), даже при изменении формой своего размера в режиме выполнения. Здесь приведены соответствующие строки из метода FormResize .

    procedure TForm1.FormResize(Sender: TObject);

    begin

    Scrollbar1.Max:= Width;

    Scrollbar2.Max:= Height;

    end ;

    Две строчки кода, показанные выше, просто устанавливают максимальные значения полос прокрутки равными ширине и высоте формы соответственно. После этого Вы всегда сможете сделать помещенную на форму фигуру такой же “большой”, как и сама форма. После введения таких изменений Вам больше не потребуется умножать свойство Position на какой-либо множитель.

    procedure TForm1.Scrollbar2Change (Sender: TObject);

    begin

    Shape1.Height:= Scrollbar2.Position;

    end ;

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

    В конце хотелось бы сделать одно маленькое замечание. Как Вы, возможно, уже заметили, каждая форма, по умолчанию, имеет две полосы прокрутки (HorzScrollbar и VertScrollbar ), которые появляются автоматически всякий раз, когда размер формы становится меньше, чем область, занимаемая управляющими элементами, расположенными на этой форме. Иногда эти полосы прокрутки могут быть очень полезными, но в нашей ситуации они сделают совсем не то, что хотелось бы. Поэтому, для надежности, Вы можете установить их вложенные свойства Visible в False .

    В этом уроке мы рассмотрели, как изменять свойства компонент во время выполнения. В целом, такие действия не намного сложнее, чем изменение свойств в режиме проектирования с помощью Object Inspector. В конце раздела Вы могли увидеть, что язык Object Pascal, лежащий в основе Delphi, дает Вам полное управление над работой приложения, включая прямое обращение к функциям Windows API.