...
...

От Delphi 4 к Delphi 5 часть 17

От Delphi 4 к Delphi 5 Палитра компонентов.
Страница SAMPLES.
Эта страница в Delphi 4 и Delphi 5 одинакова, она содержит компоненты различного назначения (рисунок 1).
Компонент Gauge (индикатор состояния) подобен ProgressBar (страница Win32), но отличается большим разнообразием форм.
Компонент ColorGrid (таблица цветов) предназначен для выбора основного и фонового цветов из 16-цветной палитры.
Компонент SpinButton (двойная кнопка) дает удобное средство управления некоторой числовой величиной.
Компонент SpinEdit (редактор числа) обеспечивает отображение целого числа, его изменение возможно с помощью двойной кнопки.
Компонент DirectoryOutLine (список каталогов) отображает в иерархическом виде структуру каталогов, имеющихся на диске.
Компонент Calendar (календарь) предназначен для выбора и отображения даты.
Компонент IBEventAlerter (сторож событий) осуществляет асинхронную связь с сервером базы данных InterBase. Когда возникает в сервере нужное событие, компонент активизирует свой обработчик OnEventAlert и, таким образом, извещает программу о новом состоянии базы данных.

Поля объектов.
Как минимум, в одном отношении объект (тип class) подобен записи на языке Паскаль, он может считаться набором полей данных, или атрибутов, сгруппированных вместе под одним именем. Наибольшее отличие между записями и классами состоит в том, что записи не могут наследоваться одна от другой и не могут иметь присоединенных процедур. Только классы могут входить в схемы наследования. Они определяют поля и связанные с ними подпрограммы (методы). Атрибуты или поля объекта подобны переменным, за исключением того, что они тесно связаны с другими атрибутами, образуя конкретный экземпляр.
Синтаксис описания полей объекта следующий:

type имяКласса = class (РодительскийКласс) Поле11, Поле12, … Поле1N: Тип1; … Поле2М: Тип2; … П
олеYP: Тип Y; end;
Можно перечислить одно или более имен полей одинакового типа, разделенных запятыми, и затем указать название типа, отделив его от списка двоеточием. Заканчивается структура точкой с запятой после названия типа.
Все описания полей определяют формат экземпляра, т.е. картину размещения объекта в памяти, указывая относительные размеры полей в порядке их объявления.
Рассмотрим пример создания объекта вручную.
Поместите на форму три компонента Edit, три компонента Label, кнопки Button1, Button2, Button3. Этот пример позволит определить, является ли введенный в окно редактора год високосным. Результат работы программы YearLep показан на рисунке 2.

Программный код в полном объеме приведен ниже по тексту.
Объявите новый тип данных:

type Date = class end;
Пока класс не содержит никаких данных или операций. Добавьте в него некоторые данные следующим образом: Month, Day, Year:Integer;, строка 28. Таким образом, объект будет содержать три поля целого типа.
Подключите некоторые методы — функции или процедуры, добавляя в класс операции, строки 30, 31.
В коде функции и процедуры должно быть указано, что они являются частью класса Date. Для этого Object Pascal опять использует нотацию с точкой, но немного другим способом. Синтаксис имеет следующий вид: Имя_Класса.Метод, строки 44–62.

1. unit YearLep_; 2. interface 3. uses 4. Windows, Messages, SysUtils, Classes, Graphics, Cont
rols, Forms, Dialogs, 5. StdCtrls; 6. type 7. TForm1 = class(TForm) 8. Button1: TButton; 9. Edit1: T
Edit; 10. Edit2: TEdit; 11. Edit3: TEdit; 12. Label1: TLabel; 13. Label2: TLabel; 14. Label3: TLabel
; 15. Button2: TButton; 16. Button3: TButton; 17. procedure Button1Click (Sender: TObject); 18. proc
edure FormCreate (Sender: TObject); 19. procedure FormDestroy (Sender: TObject); 20. procedure Butto
n2Click (Sender: TObject); 21. procedure Button3Click (Sender: TObject); 22. private 23. { Private d
eclarations } 24. public 25. { Public declarations } 26. end; 27. Date = class 28. Month, Day, Year:
 Integer; 29. constructor Create (m, d, y: Integer); 30. procedure SetValue(m, d, y: Integer); 31. f
unction LeapYear: Boolean; 32. end; 33. var 34. Form1: TForm1; 35. ADay: Date; 36. implementation 37
. {$R *.DFM} 38. constructor Date.Create (m, d, y: Integer); 39. begin 40. Month := m; 41. Day := d;
 42. Year := y; 43. end; 44. procedure Date.SetValue(m, d, y: Integer); 45. begin 46. Month := m; 47
. Day := d; 48. Year := y; 49. end; 50. function Date.LeapYear: Boolean; 51. begin 52. if (Year mod 
4 <>
0) then 53. LeapYear := False 54. else 55. if (Year mod 100 <>
0) then 56. Leap
Year := True 57. else 58. if (Year mod 400 <>
0) then 59. LeapYear := False 60. else 61. Lea
pYear := True; 62. end; 63. procedure TForm1.FormCreate(Sender: TObject); 64. begin 65. ADay := Date
.Create (1, 1, 1900); 66. end; 67. procedure TForm1.FormDestroy(Sender: TObject); 68. begin 69. ADay
.Free; 70. end; 71. procedure TForm1.Button1 Click(Sender: TObject); 72. var 73. X, Y,Z:Integer; 74.
 begin 75. X:=StrToInt(Edit1.Text); 76. Y:=StrToInt(Edit2.Text); 77. Z:=StrToInt(Edit3.Text); 78. AD
ay.SetValue (X, Y, Z); 79. if ADay.LeapYear then 1. ShowMessage ('Високосный год') 81. else 82. Show
Message ('Этот год не високосный') 83. end; 84. procedure TForm1.Button2 Click(Sender: TObject); 85.
 var 86. Y:Integer; 87. begin 88. Y:=StrToInt(Edit2.Text); 89. if Y in [1..12] then 90. ShowMessage 
(' Правильно, продолжайте ') 91. else 92. ShowMessage ('Месяц введен не правильно') 93. end; 94. pro
cedure TForm1.Button3 Click(Sender: TObject); 95. var 96. X,Y:Integer; 97. begin 98. X:=StrToInt(Edi
t1.Text); 99. Y:=StrToInt(Edit2.Text); 100. if X>
30 then 101. case Y of 102. 4,6,9,11:ShowMess
age ('День введен не правильно'); 103. end 104. else 105. begin 106. ShowMessage ('День введен прави
льно'); 107. end; 108. end; 109. end.
В программном коде используется вполне обычная, но очень мощная нотация. Вы можете написать сложные функции (такие, как LeapYear), а затем обратиться к их значениям для каждого объекта типа Date так, как будто они являются примитивным типом данных.
Чтобы использовать новую объектную модель Object Pascal, необходимо сначала создать экземпляр объекта. Этот процесс описан дальше.
Почему фирма Borland ввела новое ключевое слово class? Потому что оно подразумевает новую объектную модель, которую можно назвать ссылочной моделью.
Основная идея состоит в том, что каждая переменная типа класса (такая, как ADay в приведенном выше фрагменте кода) не хранит значение объекта. Вместо этого она содержит указатель или ссылку, указывающую на то место памяти, где хранится объект. Ссылочная модель объекта не только мощна, но даже проще в использовании, чем другие модели.
Единственная проблема данного подхода состоит в том, что когда вы объявляете переменную, например, так:
var ADay: Date;
вы создаете не объект, а только место для хранения ссылки на объект — своего рода указатель. Экземпляры объектов необходимо создавать вручную, по крайней мере, для объектов определяемых вами классов. Экземпляры компонентов строятся автоматически.
Для создания экземпляра объекта вы можете вызвать его метод Create, который является конструктором (специальной процедурой, используемой для распределения памяти под новые объекты и их инициализации):
Откуда появился Create? Это конструктор класса TObject, от которого наследуются все остальные классы. Такие варианты как

type Date = class
и:

type Date = class (TObject)
аналогичны.
Данный объект должен создаваться до нажатия кнопки. Чаще всего для создания экземпляра объекта используют событие OnCreate формы (строки 63 — 66). Этот метод выполнится прежде, чем пользователь сможет нажать на кнопку, и даже прежде, чем отобразятся на экране форма и ее компоненты.
Противоположным OnCreate является метод для события OnDestroy, который выполняется после удаления формы с экрана. Вы можете воспользоваться этим методом, чтобы освободить используемую объектом память.
Конечно, после того как объект создан, его необходимо удалить. Выполнить это можно, вызвав метод Free (строки 67 — 70). Пока вы не забываете распределять память для объекта (и освобождать ее по окончании), ссылочная модель работает без сбоев. Вы можете присвоить один объект другому, передать объект в виде параметра функции, а также выполнить любые другие операции.
Во время исследования кода выполните следующий тест. Закомментируйте код, используемый для создания экземпляра объекта:

procedure TForml.FormCreate (Sender: TObject); begin //ADay := Date.Create (1, 1, 2000); end;
Если теперь перекомпилируете проект, то ошибки не будет. Однако когда вы нажмете одну из кнопок при исполнении программы, система породит исключение (указывающее, что вы получили доступ по недопустимому указателю (рисунок 3)).
Чтобы распределить память для объекта, вы вызвали метод Create. Однако на практике перед использованием объекта нередко приходится его инициализировать. Для этого в класс можно добавить конструктор. Можно создать собственную версию метода Create или определить конструктор с любым другим именем.
Конструктор является особой процедурой, так как для объекта, к которому он применен, Delphi распределяет память автоматически. Добавление конструктора в класс устраняет любые ошибки времени выполнения программы, обусловленные неправильной инициализацией или ее отсутствием. Находить такие ошибки нередко очень трудно, поэтому для их предотвращения вы должны прежде всего применять профилактические методы. Один из них — использование конструкторов.
Кроме собственного конструктора класс может иметь и собственный деструктор — процедуру, объявленную с ключевым словом destructor, которая перед уничтожением объекта может выполнить некоторую очистку ресурсов. Подобно тому, как вызов конструктора выделяет память, вызов деструктора ее освобождает. Деструкторы переопределяются редко. Чаще всего бывает достаточно стандартного деструктора Destroy, унаследованного из класса TObject. Однако запомните: вместо прямого вызова деструктора Destroy, программа должна вызвать процедуру Free, которая вызывает Destroy, если только объект существует, т.е. не равен nil. Для того чтобы добавить конструктор в класс Date, напишите следующее (строка 29):
constructor Create(m, d, y: Integer);
Конструктор назван Create, но можно выбрать и любое другое имя. Важно, чтобы, вместо ключевого слова procedure, стояло ключевое слово constructor. Теперь напишите код конструктора, строки (38–43).
После этого вы можете изменить код инициализации примера так, чтобы одновременно распределить память для объекта ADay и установить его начальное значение:

procedure TForml. FormCreate(Sender: TObject); begin ADay := Date.Create (1, 1, 2000); end;
Компонент ComboBox.
Комбинированное окно получило свое название от того, что оно является комбинацией окна редактирования и окна списка.
Имеется три типа комбинированных окон:
— стандартное (Standard);
— выпадающее (Drop-down);
— выпадающий список (Drop-down list).

Выпадающие комбинированные окна.
После того, как вы поместите компонент ComboBox на форму со страницы Standard палитры компонентов, он появляется по умолчанию как выпадающее комбинированное окно. Его свойство Style имеет значение csDropDown (комбинированный стиль, выпадающее).
Выпадающие комбинированные окна включают в себя и текстовое окно, и выпадающий список. Выпадающий список обычно закрыт. Справа от окна редактирования имеется кнопка, которую можно выбирать, чтобы отобразить выпадающую часть списка. Имеется характерный промежуток между окном редактирования и кнопкой списка, которым выпадающее комбинированное окно визуально отличается от другой его разновидности — выпадающего списка.
Идея выпадающего комбинированного окна состоит в том, что оно позволяет пользователю легко находить и выбирать существующий элемент из списка, а также допускает ввод текста в произвольной форме внутри окна редактирования. Кроме того, данный компонент экономит место на форме.
Рассмотрим пример использования комбинированного окна. Для этого поместите на форму компонент ComboBox и компонент RichEdit. Приведенный пример позволяет выбирать шрифты различного типа в компоненте ComboBox1 и применять их к тексту, введенному в компонент

RichEdit1. procedure TForm1.FormCreate (Sender: TObject); begin ComboBox1.Items := Screen.Font
s; end; procedure TForm1.ComboBox 1Click(Sender: TObject); begin RichEdit1.Font.Name := ComboBox1.It
ems[ComboBox1.ItemIndex]; end; end.
На рисунке 4 показан результат работы программы.

Стандартные комбинированные окна.
Чтобы создать стандартное комбинированное окно, необходимо для компонента ComboBox изменить свойство Style на csSimple. Во время разработки часть комбинированного окна — окно списка — не сразу видна. Чтобы сделать его видимым, необходимо изменить размер компонента в форме, потянув край основания вниз, до появления окна списка.
Таким образом, стандартные комбинированные окна содержат окно списка и окно редактирования. Окно редактирования помещено непосредственно над списком. Левая граница окна списка характерно смещена вправо от окна редактирования.
Функции стандартного комбинированного окна те же, что и для выпадающего окна, с тем отличием, что оно может использоваться, когда занимаемое им место не критично.

Выпадающие списки.
Чтобы создать выпадающий список, необходимо установить свойство Style в csDropDownList для компонента ComboBox. В противоположность другим разновидностям семейства комбинированных окон, выпадающий список не позволяет вам вводить значения в свободной форме, а допускает лишь выбор из него, так же, как это делается в обычном окне списка. Ключевым моментом здесь является то, что нет никакого способа выбрать значение, отличное от тех, что уже находятся в списке.
В отличие от обычного списка, в каждый момент времени можно видеть только один элемент, если выпадающая часть компонента закрыта. Чтобы увидеть остальную часть списка и иметь возможность по нему перемещаться, необходимо открыть выпадающую часть окна, щелкнув левой кнопкой мыши по кнопке списка, находящейся справа от этого элемента.
На рисунке 5 показано стандартное комбинированное окно и выпадающий список.
Свойства csOwnerDrawFixed и csOwnerDraw аналогичны свойствам компонента ListBox.

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г.

Владимир Скуратов


(c) компьютерная газета




© Компьютерная газета

полезные ссылки
Корпусные камеры видеонаблюдения