|
|
|
WEB-БИБЛИОТЕКА |
|
Для просмотра сайта
рекомендуется :
-Разрешение : 800*600 -Броузер : Internet Explorer -Для более эффективного просмотра нажмите F11. |
Cвойства в Delphi Содержание Каждый компонент, который Вы помещаете на форму, имеет свое отражение в окне Инспектора Объектов (Object Inspector). Как Вы помните, Object Inspector имеет две “странички” - “Properties” (Свойства) и “Events” (События). Создание программы в Delphi сводится к “нанесению” компонент на форму (которая, кстати, также является компонентом) и настройке взаимодействия между ними путем: · изменения значения свойств этих компонент Более подробно события мы рассмотрим на следующем уроке, а сейчас сосредоточимся
на свойствах и, в меру необходимости, затронем создание откликов на события.
Существует несколько типов свойств, в зависимости от их “природы”, т.е. внутреннего устройства. · Простые свойства - это те, значения которых являются числами или строками.
Например, свойства Left и Top принимают целые значения, определяющие положение
левого верхнего угла компонента или формы. Свойства Caption и Name представляют
собой строки и определяют заголовок и имя компонента или формы. · Вложенные свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “+” слева от названия таких свойств. Имеется два вида таких свойств: множества и комбинированные значения. Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как []. Установки для вложенных свойств вида “множество” обычно имеют значения типа Boolean. Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных (рис 1). Некоторые свойства, например, Font, для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство. Рис. 1: Отображение комбинированных значений вложенных свойств Delphi позволяет легко манипулировать свойствами компонент как в режиме проектирования (design time), так и в режиме выполнения программы (run time). В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или, как Вы уже видели, на страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector. С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком. В следующем разделе мы рассмотрим, как это делается. Управление свойствами визуальных компонент в режиме выполнения Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector. Однако, доступ к свойствам компонентов довольно легко получить программным путем. Все, что Вы должны сделать для изменения какого-либо свойства - это написать простую строчку кода аналогично следующей: MyComponent.Width := 35; Вышеприведенная строка устанавливает ширину (Width) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, Вы увидите, как компонента визуально изменит свою ширину. Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector
просто является удобным способом выполнения в режиме проектирования того,
что может быть осуществлено программным путем в режиме выполнения. Более
того, как уже было сказано выше, у компонента могут быть свойства, не
отображаемые в окне Инспектора Объектов. Если Вы измените свойства Width и Height компонента Button, кнопка соответствующим образом изменит свои ширину и высоту. Вам нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так Вы и должны поступать. Свойства - это более чем просто данные. Напротив, они делают эти данные “живыми”, и все это происходит перед Вашими глазами! Свойства дают Вам иллюзию, как будто Вы имеете дело с реальными объектами, а не с их программным представлением. Программа SHAPEDEM.DPR, изображенная на рис. 2, демонстрирует различные
способы, с помощью которых можно изменять пользовательский интерфейс при
выполнении программы. Эта программа не производит никаких полезных действий
кроме демонстрации того, как легко можно создать “дельфийское” приложение
с настраиваемым интерфейсом. Рис. 2: Программа SHAPEDEM имеет 2 полосы прокрутки и несколько кнопок Листинг А показывает код программы SHAPEDEM. Код головного модуля этой программы мы приведем по частям - по мере его написания.
program Shapedem; Рис. 3: Вы можете использовать полосы прокрутки, кнопки и список для изменения внешнего вида приложения В нашем примере полосы прокрутки (ScrollBars) используются для изменения
размера фигуры, изображенной в средней части экрана, как показано на рис.3.
Для выбора нового вида фигуры используйте выпадающий список (ComboBox),
а для изменения цвета фигуры или окна (формы) используйте стандартное
диалоговое окно выбора цвета, вызываемое кнопками “Цвет фигуры” и “Цвет
формы”. procedure TForm1.FormColorClick(Sender: TObject); end;
procedure TForm1.FormColorClick(Sender: TObject); Данный код во время выполнения при нажатии кнопки “Цвет формы” вызывает стандартное диалоговое окно выбора цвета.Если в этом диалоговом окне Вы щелкните кнопку OK, выполнится следующая строка: Form1.Color:=ColorDialog1.Color;
Та же самая техника может использоваться для изменения цвета фигуры (компонент Shape, объект TShape). Все, что Вам нужно сделать - это поместить на форму другую кнопку, изменить (при желании) ее имя на “ShapeColor”, а заголовок - на “Цвет Фигуры”, дважды щелкнуть по ней мышкой и создать метод аналогичный следующему: procedure TForm1.ShapeColorClick(Sender: TObject); end;
Отметим, что код, написанный здесь, является самодокументированным. Т.е.
любой, мало-мальски знакомый с программированием человек сможет без особого
труда разобраться, что же делают эти строки; а если он перед этим прочтет
документацию, то для него вообще все будет прозрачно. Для начала, поместите два компонента ScrollBar на форму (находится на страничке “Standard”) и установите свойство Kind первого компонента в sbHorizontal, а второго - в sbVertical. Переключитесь на страничку “Events” в Инспекторе Объектов и создайте заготовки метода для отклика на событие OnChange для каждой полосы прокрутки. Напишите в каждом из методов по одной строчке следующим образом: procedure TForm1.ScrollBar1Change(Sender: TObject); Shape1.Width := ScrollBar1.Position * 3; procedure TForm1.ScrollBar2Change(Sender: TObject); Код, показанный здесь, устанавливает свойства Width и Height фигуры TShape
в соответствие с положением “бегунка” на полосах прокрутки (сомножители
3 и 2 введены только для лучшего представления). Перед Вами появится диалоговое окно текстового редактора (String List Editor), в котором Вы и введете элементы. Вы могли заметить, что список этих элементов совпадает со списком опций свойства Shape компонента Shape1 (Shape). Другими словами, если Вы выделите компонент Shape1 на форме (просто щелкнув по нему) и посмотрите свойство Shape в Инспекторе Объектов, Вы увидите список возможных видов фигур, которые может принимать данный компонент. Это как раз те самые виды фигур, которые мы перечисляли в списке у компонента ComboBox1. Этот список Вы можете найти в on-line справочнике по Delphi по контексту “TShapeType”. Или же, если Вы заглянете в исходный код класса TShape, там увидите те же элементы, формирующие перечислимый тип TShapeType: TShapeType = (stRectangle, stSquare, stRoundRect, Итак, смысл всего сказанного в том, что за всеми объектами, которые Вы
видите в “дельфийской” программе, стоит некий код на Паскале, к которому
Вы имеете доступ при “прямом” программировании. Ничто не скрыто от Вас.
Это значит, что Вы можете изменить поведение любой части Вашей программы
во время выполнения путем написания соответствующего кода. procedure TForm1.ComboBox1Click(Sender: TObject); end; Теперь вставьте одну строчку кода, чтобы метод выглядел следующим образом: procedure TForm1.ComboBox1Click(Sender: TObject); Эта строчка кода устанавливает свойство Shape компонента Shape1 в вид, который пользователь выберет в выпадающем списке. Этот код работает благодаря соответствию между порядковыми членами перечислимого типа и числовыми значениями различных элементов в ComboBox. Другими словами, первый элемент перечислимого типа имеет значение 0, что соответствует первому элементу, показанному в ComboBox. Давайте рассмотрим этот подход несколько подробней. Если Вы рассмотрите декларацию перечислимого типа TShapeType, Вы увидите, что первый его элемент называется “stRectangle”. По определению, компилятор назначает этому элементу порядковый номер 0. Следующему по порядку элементу назначается номер 1 и т.д. Таким образом, слова “stRectangle”, “stSquare” и т.п., в действительности, просто символизируют порядковые номера в данном перечислимом типе. На элементы в списке ComboBox также можно сослаться по их порядковому номеру, начиная с 0. Именно поэтому так важно (в данном случае) вводить указанные строки в строгом соответствии с декларацией типа TShapeType. Таким образом, используя преобразование типа “TShapeType(ComboBox1.ItemIndex)”, Вы можете указать компилятору, что общего имеют элементы в ComboBox и перечислимый тип в TShapeType: а именно, порядковые номера. Итак, Вы видите, что Delphi является очень гибким и мощным программным средством, которое позволяет Вам быстро реализовать логику Вашей программы и предоставляет полное управление приложением. Программа SHAPEDEM2 Программа SHAPEDEM проста в написании и в освоении. Однако при изменении пользователем размера окна она будет выглядеть “некрасиво”. Давайте изменим ее таким образом, чтобы программа сама обрабатывала изменение размера окна, а заодно изучим компонент меню. Для достижения этих целей сделаем следующее: · Кнопки и выпадающий список уберем с экрана и вместо них поместим на
форму компонент меню (MainMenu) Взглянув на рис.4, Вы сможете увидеть, как будет выглядеть программа после этих изменений. Рис. 4: Программа SHAPDEM2 имеет возможность реагировать на изменение пользователем размера окна Листинг B: Программа SHAPDEM2 включает метод FormOnResize. Представлен главный модуль. unit Main; interface uses type Square1: TMenuItem; procedure Exit1Click(Sender: TObject); var implementation {$R *.DFM} procedure TForm1.NewShapeClick(Sender: TObject); procedure TForm1.ShapeColorClick(Sender: TObject); begin procedure TForm1.FormColorClick(Sender: TObject); procedure TForm1.ScrollBar2Change(Sender: TObject); procedure TForm1.ScrollBar1Change(Sender: TObject); begin procedure TForm1.FormResize(Sender: TObject); Scrollbar1.Width := Width - Scrollbar2.Width - Frame; procedure TForm1.Exit1Click(Sender: TObject); end. Главное меню для программы создается с помощью компонента MainMenu (находится на страничке “Standard” палитры компонентов). Поместив его на форму, дважды щелкните по нему мышкой - откроется редактор меню, в котором Вы сможете ввести нужные Вам названия пунктов меню и, при желании, изменить их имена (задаваемые Delphi по умолчанию) для удобочитаемости. Создадим меню программы SHAPEDEM2 с тремя главными пунктами: “Цвета”, “Фигуры”, “Выход”. Для первого пункта создадим следующие подпункты: · Цвет фигуры · Цвет окна Для второго: · Прямоугольник Третий пункт меню не будет содержать никаких подпунктов. После создания всех пунктов и подпунктов меню для работы программы SHAPEDEM2 нужно назначить номера для каждого из подпунктов меню, связанных с типом фигуры. Для этого воспользуемся свойством Tag, имеющимся у каждого пункта меню. Свойство Tag (типа Integer) специально введено в каждый компонент Delphi с тем, чтобы программисты могли использовать его по своему усмотрению. Назначим 0 свойству Tag пункта “Прямоугольник”, 1 - пункту “Квадрат”, 2 - пункту “Закругленный прямоугольник” и т.д. Цель такого назначения будет объяснена позднее. Два метода, созданные для подпунктов изменения цвета аналогичны тем, которые были в программе SHAPEDEM: procedure TForm1.ShapeColorClick(Sender: TObject); procedure TForm1.FormColorClick(Sender: TObject); Как Вы видите, ничего не изменилось по сравнению с первой версией программы, хотя данные методы уже вызываются из меню, а не из кнопок. Аналогично, методы, реализующие реакцию на выбор подпунктов меню изменения вида фигуры также очень похожи на методы выбора фигуры через выпадающий список:
Этот код “работает” правильно благодаря тому, что перечислимый тип TShapeType в качестве начального имеет значение 0 и в свойство Tag подпунктов меню мы также записали порядковые номера, начинающиеся с нуля. Отметим, что мы использовали оператор as, который позволяет надежно преобразовывать
типы из одного в другой: в частности, преобразовать параметр Sender (имеющий
общий тип TObject) в тип TMenuItem. Как правило, параметр Sender в Delphi
- это управляющий элемент, посылающий сообщения функции, в которой он
фигурирует. В данном случае, Sender является пунктом меню, и, следовательно,
Вы можете работать с этим параметром как если бы он был декларирован с
типом TMenuItem. Две полосы прокрутки в программе SHAPEDEM2 всегда будут располагаться возле границ окна, независимо от его размеров. Выполнение этих действий требует от Вас написания несколько более сложного программирования, чем было ранее. Как было указано ранее, Delphi, хотя и скрывает от программиста детали Windows-программирования, однако не запрещает обращаться к функциям Windows API (прикладного пользовательского интерфейса). Таким образом, Delphi поддерживает низкоуровневое программирование на уровне Windows API. Короче говоря, если Вам нужно углубиться в дебри низкоуровневого программирования - пожалуйста! procedure TForm1.FormResize(Sender: TObject); Scrollbar1.Width := Width - Scrollbar2.Width - Frame; Код, показанный здесь, является реакцией на событие OnResize. Это событие перечислено среди других на страничке “Events” Инспектора Объектов в состоянии, когда выбрана форма (окно). Как Вы можете ожидать, событие (сообщение) OnResize посылается форме (окну) каждый раз, когда пользователь “захватывает” мышкой за какой-либо край окна и делает размер окна большим или меньшим. Однако, это же сообщение (событие) посылается окну и тогда, когда происходит максимизация окна (но не минимизация). Первое, что делается в данном методе - запрашиваются системные параметры, определяющие размеры заголовка окна, огибающей его рамки и меню. Эта информация “добывается” путем вызова функции GetSystemMetrics, являющейся частью Windows API. Функции GetSystemMetrics передается один аргумент в виде константы, определяющей вид запрашиваемой информации. Например, если Вы передадите функции константу sm_cyCaption, получите в качестве результата высоту заголовка окна (в пикселах). Полный список этих констант имеется в on-line справочнике Delphi (Help|Windows API|Alphabetical functions|User functions|GetSystemMetrics), здесь же мы приведем небольшую выдержку из справочника: SM_CXBORDER Ширина огибающей окно рамки, размер которой не может быть
изменен. SM_CXFULLSCREEN Ширина клиентской части для полноэкранного окна. SM_CXSCREEN Ширина экрана. В методе FormResize программа вычисляет новые размеры полос прокрутки: Вычисления, приведенные здесь, включают простые математические действия. Например, левая сторона вертикальной полосы прокрутки должна быть равна ширине всего окна (формы) за вычетом ширины рамки и ширины самой полосы прокрутки. Это элементарная логика, и реализовав ее в программе, мы получим вертикальную полосу прокрутки, всегда располагающуюся возле правого края окна (формы). В программе SHAPEDEM свойство Max каждой полосы прокрутки оставалось
равным значению по умолчанию - 100; это означало, что после того как бегунок
полосы прокрутки пройдет все доступное расстояние (как для вертикальной,
так и для горизонтальной полосы прокрутки), свойство Position будет установлено
в 100. Если бегунок возвращался к началу, свойство Position устанавливалось
равным свойству Min, которое, по умолчанию, 0. procedure TForm1.FormResize(Sender: TObject); procedure TForm1.Scrollbar2Change (Sender: TObject); Если Вы после этого запустите программу SHAPDEM2 на выполнение, Вы увидите,
что она работает корректно при любом изменении размера формы. Более того,
теперь Вы можете выбирать фигуры и цвета из меню, что придает программе
более строгий вид. Заключение В этом уроке мы рассмотрели, как изменять свойства компонент во время выполнения. В целом, такие действия не намного сложнее, чем изменение свойств в режиме проектирования с помощью Object Inspector. В конце раздела Вы могли увидеть, что язык Object Pascal, лежащий в основе Delphi, дает Вам полное управление над работой приложения, включая прямое обращение к функциям Windows API. |
Сайт основан 20.02.2003
Использование материалов возможно только при ссылке на webbibl.narod.ru
Статьи, программы и изображения принадлежат их авторам.