Свойства в Delphi Содержание Îáçîð -error: Reference source not found icon

Свойства в Delphi Содержание Îáçîð -error: Reference source not found



НазваниеСвойства в Delphi Содержание Îáçîð -error: Reference source not found
Дата конвертации17.07.2012
Размер227.98 Kb.
ТипОбзор
1. /Введение в DELPHI/Alexs.rtf
2. /Введение в DELPHI/Les00.rtf
3. /Введение в DELPHI/Les11.rtf
4. /Введение в DELPHI/Les110.rtf
5. /Введение в DELPHI/Les12.rtf
6. /Введение в DELPHI/Les13.rtf
7. /Введение в DELPHI/Les14.rtf
8. /Введение в DELPHI/Les15.rtf
9. /Введение в DELPHI/Les16.rtf
10. /Введение в DELPHI/Les17.rtf
11. /Введение в DELPHI/Les18.rtf
12. /Введение в DELPHI/Les19.rtf
13. /Введение в DELPHI/Les21.rtf
14. /Введение в DELPHI/Les22.rtf
15. /Введение в DELPHI/Les23.rtf
16. /Введение в DELPHI/Les31.rtf
17. /Введение в DELPHI/Les310.rtf
18. /Введение в DELPHI/Les311.rtf
19. /Введение в DELPHI/Les32.rtf
20. /Введение в DELPHI/Les33.rtf
21. /Введение в DELPHI/Les34.rtf
22. /Введение в DELPHI/Les35.rtf
23. /Введение в DELPHI/Les36.rtf
24. /Введение в DELPHI/Les37.rtf
25. /Введение в DELPHI/Les38.rtf
26. /Введение в DELPHI/Les39.rtf
27. /Введение в DELPHI/Les41.rtf
28. /Введение в DELPHI/Les42.rtf
29. /Введение в DELPHI/Les43.rtf
30. /Введение в DELPHI/Les44.rtf
31. /Введение в DELPHI/Les45.rtf
32. /Введение в DELPHI/Menu.doc
HighWay Soft Group
Borland Delphi
Среда программирования Delphi Содержание
Средства создания мультимедийных приложений Содержание
html">Проект Delphi Пункт меню "File"
Обзор Палитры Компонент Содержание
Рисование и закраска Содержание
Печать текстовая и графическая Содержание
Свойства в Delphi Содержание Îáçîð -error: Reference source not found
Обзор
Обработка исключительных ситуаций в Delphi Содержание
События в Delphi Содержание
Dynamic Data Exchange получило свое имя потому, что позволяет двум приложениям обмениваться данными (текстовыми, через глобальную память) динамически во время выполнения. Связь между двумя программа
Ole содержание Обзор Основы ole объект tolecontainer Пример ole приложения Сохранение ole объекта в базе данных Обзор
Использование dll в Delphi Содержание
Обзор
Управление транзакциями Содержание
Local InterBase Содержание
Настройка bde содержание Обзор 2 Обзор
Создание таблиц с помощью Database Desktop Содержание
Создание таблиц с помощью sql-запросов Содержание
Содержание
Компонент ttable. Создание таблиц с помощью компонента ttable Содержание
Содержание
Содержание
Управление соединением с базой данных (класс tdataBase,объект Session) Содержание
Создание собственных компонент Содержание
Редакторы свойств Содержание
Содержание
Урок 30: Основы языка sql содержание урока 30
Обзор Local InterBase 0 les311. rtf Подменю «Сложный материал» Создание собственных компонент les41. rtf Создание редакторов свойств компонент les42. rtf Генератор отчет

32 óðîêà ïî Delphi


Свойства в Delphi


Содержание


- Îáçîð -Error: Reference source not found

Óïðàâëåíèå ñâîéñòâàìè âèçóàëüíûõ êîìïîíåíò â ðåæèìå âûïîëíåíèÿ -Error: Reference source not found

Ïðîãðàììà SHAPEDEM2 -Error: Reference source not found

Çàêëþ÷åíèå Error: Reference source not found

Обзор


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

изменения значения свойств этих компонент

написания адекватных реакций на события.


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

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

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

Ïðîñòûå свойства - это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы.

Ïåðå÷èñëèìûå свойства - это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример - это свойство типа Boolean, которое может принимать значения True или False.

Âëîæåííûå свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “+” слева от названия таких свойств. Имеется два вида таких свойств: множества и комбинированные значения. Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как []. Установки для вложенных свойств вида “множество” обычно имеют значения типа Boolean. Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных (рис 1). Некоторые свойства, например, Font, для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство.




Ðèñ. 1: Îòîáðàæåíèå êîìáèíèðîâàííûõ çíà÷åíèé âëîæåííûõ ñâîéñòâ



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




Ðèñ. 2: Èçìåíåíèå ðàçìåðîâ ñ ïîìîùüþ Äèçàéíåðà Ôîðì
В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или, как Вы уже видели, на страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector.



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

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

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

Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать 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.



Ðèñ. 5: Âû ìîæåòå èñïîëüçîâàòü ïîëîñû ïðîêðóòêè, êíîïêè è ñïèñîê äëÿ èçìåíåíèÿ âíåøíåãî âèäà ïðèëîæåíèÿ
В нашем примере полосы прокрутки (ScrollBars) используются для изменения размера фигуры, изображенной в средней части экрана, как показано на рис.5. Для выбора нового вида фигуры используйте выпадающий список (ComboBox), а для изменения цвета фигуры или окна (формы) используйте стандартное диалоговое окно выбора цвета, вызываемое кнопками “Öâåò ôèãóðû” и “Öâåò ôîðìû”.

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


procedure TForm1.FormColorClick(Sender: TObject);

begin


end;


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


procedure TForm1.FormColorClick(Sender: TObject);

begin

if ColorDialog1.Execute then

Form1.Color := ColorDialog1.Color;

end;




Ðèñ. 6: Äèàëîãîâîå îêíî “Color” äàåò âîçìîæíîñòü èçìåíèòü öâåò “âî âðåìÿ âûïîëíåíèÿ”
Данный код во время выполнения при нажатии кнопки “Цвет формы” вызывает стандартное диалоговое окно выбора цвета, как показано на рис.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).




Ðèñ. 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 TForm1.ComboBox1Click(Sender: TObject);

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 является очень гибким и мощным программным средством, которое позволяет Вам быстро реализовать логику Вашей программы и предоставляет полное управление приложением.

Программа SHAPEDEM2

Программа 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 TForm1.NewShapeClick(Sender: TObject);

begin

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

end;


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.ScrollBar2Change(Sender: TObject);

begin

Shape1.Height := ScrollBar2.Position;

end;


procedure TForm1.ScrollBar1Change(Sender: TObject);

begin

Shape1.Width := ScrollBar1.Position;

end;


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 := Height - ScrollBar2.Width - Frame - Caption - Menu;

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

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;

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

Scrollbar1.Top :=

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

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.


Epsylon Technologies

Óðîê 7: Ñâîéñòâà â Delphi






Похожие:

Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconФормирование цены
Следовательно, обмену, как уже было отмечено в пре­дыдущей главе (с. Error: Reference source not found), подвергаются не жизненные...
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconДокументы
1. /Found/FOUND.DOC
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconДокументы
1. /Found/FOUND.DOC
Свойства в Delphi Содержание Îáçîð -error: Reference source not found icon2 Основное содержание отдельных учебных предметов, курсов Математика Алгебра Корни и степени
Степень с рациональным показателем и ее свойства. Понятие о степени с действительным показателе Свойства степени с действительным...
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconЭлементы логики Объем и содержание понятия
Назовите несущественные свойства.(отсутствие которых не влияет на существование объекта)
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconДокументы
1. /Доступ к COM серверам Microsoft Office из Delphi 5/Доступ к COM серверам Microsoft Office...
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconWater-source

Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconЛекции на фвс, 520-1, 520-2, 530. Краткий электронный конспект по датам. Лекция 1: 10 февраля Глава Неопределённый интеграл опр и свойства
Определение первообразной, Свойства: что F+C тоже перв. (Док-ть), что разность двух первообр = C. Определение неопр интеграла. Свойства...
Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconСвободное по с открытым исходным кодом (Open Source): можно бесплатно Свободное по с открытым исходным кодом (Open Source): можно бесплатно

Свойства в Delphi Содержание Îáçîð -error: Reference source not found iconУрока: «свойства и применение предельных одноосновных карбоновых кислот» История открытия и физические свойства муравьиной кислоты

Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©podelise.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы

Разработка сайта — Веб студия Адаманов