
- •Пустая форма и ее модификация
- •Настройка Delphi
- •Имена в Delphi
- •Изменение свойств формы
- •Размещение нового компонента
- •Реакция на события
- •Модификация формы
- •Обработчик события OnClick
- •Динамическое изменение свойств компонента
- •Некоторые итоги
- •Событие OnActivate
- •Событие OnClose
- •Событие OnCloseQuery
- •Событие OnCreate
- •Событие OnDestroy
- •Событие OnHide
- •Событие OnPaint
- •Событие OnResize
- •Событие OnShow
- •Свойства класса tComponent
- •Методы класса tComponent
- •Свойства класса tControl
- •Методы класса tControl
- •События класса tControl
- •Свойства класса tWinControl
- •Методы класса tWinControl
- •События класса tWinControl
- •Свойства класса tApplication
- •Методы класса tApplication
- •События класса tApplication и их обработка
- •Свойства класса tStrings
- •Методы класса tStrings
- •Размещение фрейма на палитре компонентов
Событие OnDestroy
Событие OnDestroy возникает на финальной стадии закрытия формы и может быть вызвано с помощью методовDestroy или Free либо закрытием главной формы приложения. Это событие имеет тип TNotifyEvent.
К началу
Событие OnHide
Событие OnHide возникает при "скрытии" формы, то есть когда ее свойство Visible принимает значение False. Это событие имеет тип TNotifyEvent.
К началу
Событие OnPaint
Событие OnPaint возникает при необходимости перерисовки содержимого формы. Например, оно может возникнуть при получении формой фокуса. Обработчик этого события может отображать информацию в рабочей области формы. Сообщение OnPaint имеет тип TNotifyEvent.
В следующем примере показано, как загружать графическое изображение в обработчике события OnPaint:
unit Un_4_4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
TheBMP: TBitmap;//Создание ссылки на изображение.
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//Обработчик события OnPaint.
procedure TForm1.FormPaint(Sender: TObject);
begin
Form1.Canvas.Draw(0,0,TheBMP);//Вывод изображения.
end;
//Обработчик события OnCreate.
procedure TForm1.FormCreate(Sender: TObject);
begin
TheBMP:=TBitmap.Create;//Создание нового объекта.
//Загрузка изображения.
TheBMP.LoadFromFile('C:\Windows\SYSTEM\pdbrowse.bmp');
end;
end.
Текст этого примера можно взять здесь.
К началу
Событие OnResize
Событие OnResize возникает при изменении размеров формы во время работы приложения. Обработчик этого события необходим только в том случае, если вы планируете выполнять какие-либо действия при изменении размеров формы. Например, это может быть перемещение интерфейсных элементов или другие действия. Сообщение OnResizeимеет тип TNotilyEvent.
К началу
Событие OnShow
Событие OnShow возникает, когда форма отображается (то есть когда ее свойство Visible принимает значениеTrue). Это событие имеет тип TNotifyEvent.
На этом шаге мы перечислим основные свойства визуальных компонентов.
Напомним, что компонент - это разновидность объекта, который можно перенести на форму из специальной палитры компонентов. Также можно изменять его свойства, не меняя кода программы.
Существуют визуальные и невизуальные компоненты.
Визуальные компоненты видимы при работе программы; они используются непосредственно пользователем.Невизуальные компоненты не отображаются на форме в процессе работы приложения, поэтому они недоступны пользователю. К визуальным компонентам относятся кнопки, строка редактирования и т.д. Примеры невизуальных компонентов: таблицы, SQL-запросы и т.д.
В таблице 1 перечислены основные свойства визуальных компонентов. В дальнейшем при рассмотрении конкретных компонентов мы будем указывать только их специфические свойства.
Таблица 1. Основные свойства визуальных компонентов |
|
Свойство |
Описание |
property Align: TAlign; type TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient, alCustom); |
Задает тип выравнивания компонента внутри формы. Использовать это свойство рекомендуется тогда, когда требуется, чтобы данный компонент располагался в определенной части формы вне зависимости от ее размеров. Возможные значения:
Свойство удобно использовать для создания, например, панели инструментов. У компонента TPanel, который может использоваться для размещения кнопок, это свойство можно установить в alTop. Это приведет к автоматическому изменению ширины этого компонента при изменении ширины формы. |
property Color:TColor; |
Задает цвет фона формы или цвет компонента. |
property Ctl3D: Boolean; |
Задает вид компонента: False - двухмерный вид; True - трехмерный вид. |
property Cursor:TCursor; |
Определяет вид курсора мыши, который будет отображаться при нахождении курсора в рабочей области компонента. |
propertyDragCursor:TCursor; |
Определяет вид курсора мыши, который будет отображаться при перетаскивании объекта. |
property Enabled: Boolean; |
Если True, то компонент реагирует на сообщения от клавиатуры, мыши и таймера. В противном случае они игнорируются. Другими словами, в этом случае компонент является недоступным. |
property Font:TFont; |
Определяет шрифт и его характеристики. |
property Height: Integer; |
Задает высоту компонента или формы. |
property Hint: string; |
Задает текст, который будет отображаться, если курсор находится в области компонента. Работает в паре со свойством ShowHint. |
property Left: Integer; |
Определяет горизонтальную координату левого верхнего угла компонента (в пикселях). |
propertyParentColor: Boolean; |
Задает цвет отображения компонента на экране. Если значение равно True, то компонент использует цвет родительского компонента, иначе используется значение собственного свойства Color. Если значение свойства Color изменено, то значение свойства ParentColor автоматически изменяется на False. |
propertyParentCtl3D: Boolean; |
Позволяет указать, будет ли компонент трехмерным, или нет. Если оно имеет значениеTrue, то вид компонента задается свойством Ctl3D его владельца. В противном случае - собственным значением свойства Ctl3D. |
property ParentFont: Boolean; |
Если значение этого свойства True, то используется шрифт, заданный у владельца компонента. В противном случае используется шрифт, заданный собственным свойством Font. |
propertyParentShowHint: Boolean; |
Определяет, какую подсказку использовать: содержащуюся у этого компонента или у родителя. Если True, то контроль передается совйству ShowHint предка. В противном случае - собственному свойству ShowHint. |
propertyPopupMenu: TPopupMenu; |
Задает название локального меню, которое отображается при нажатии правой кнопки мыши на компоненте. Это меню отображается только в том случае, если свойствоAutoPopup самого локального меню имеет значение True. |
property ShowHint: Boolean; |
Определяет, будет ли отображаться текст, находящийся в свойстве Hint (True - будет отображаться). При изменении значения этого свойства на True, значение свойстваParentShowHint автоматически меняется на False. |
property TabOrder: TTabOrder; type TTabOrder = -1..32767; |
Изменяет порядок получения компонентами фокуса при нажатии клавиши TAB. |
property TabStop: Boolean; |
Позволяет определить, может ли компонент получать фокус (True - может получать). |
property Tag: Longint; |
Позволяет "привязать" к компоненту числовое значение. Изменение этого свойства никак не отображается на компоненте. |
property Top: Integer; |
Задает вертикальную координату левого верхнего угла компонента (для формы - относительно экрана). |
property Visible: Boolean; |
Определяет видимость компонента на экране (True - компонент видим). |
property Width: Integer; |
Задает ширину компонента в пикселях. |
На этом шаге мы перечислим основные свойства формы. Некоторые свойства рассмотрены более подробно на шаге 34.
Основным элементом любого приложения является форма - контейнер, в котором размещаются другие визуальные и невизуальные компоненты. С точки зрения пользователя форма - это окно, в котором он работает с приложением. Каждой новой форме, вводимой в приложение, соответствует свой модуль (Unit), описывающий эту форму как класс и включающий, если необходимо, какие-то дополнительные константы, функции и процедуры.
В таблице 1 перечислены основные свойства формы.
Таблица 1. Основные свойства формы |
|
Свойство |
Описание |
propertyActiveControl: TWidgetControl; |
Задает компонент, который получает фокус при активизации формы. |
propertyAutoScroll: Boolean; |
Задает наличие полос прокрутки, если все компоненты не помещаются в текущий размер формы. Если значение этого свойства True, то полосы прокрутки включаются автоматически. В противном случае при уменьшении размера окна пользователь теряет доступ к компонентам, не поместившемся на его поле. |
propertyBorderStyle: TFormBorderStyle; |
Определяет общий вид окна и операции с ним, которые разрешено выполнять пользователю. Это свойство может принимать следующие значения:
|
propertyBorderIcons: TBorderIcons; |
Определяет набор кнопок, которые имеются в полосе заголовка. Множество кнопок задается элементами:
Следует отметить, что не все кнопки могут появляться при любых значениях BorderStyle. Некоторую дополнительную информацию по использованию перечисленных значений можно посмотреть здесь. |
property Caption: TCaption; |
Определяет текст заголовка формы. По умолчанию значение этого свойства эквивалентно значению свойства Name. |
propertyClientHeight: Integer; |
Задает высоту рабочей области формы. |
propertyClientWidth: Integer; |
Задает ширину рабочей области формы. |
propertyFormStyle: TFormStyle; |
Задает тип формы. Возможные значения:
Значение fsStayOnTop делает окно всегда остающимся на экране поверх остальных окон не только данного приложения, но и всех других приложений, в которые может перейти пользователь. Это значение лучше задавать для отображения окон сообщений пользователю о каких-то аварийных ситуациях. Некоторую дополнительную информацию по использованию перечисленных значений можно посмотреть здесь. |
propertyHorzScrollBar:TControlScrollBar; |
Определяет параметры горизонтальной полосы прокрутки. |
property Icon: TIcon; |
Задает иконку для данной формы. Дополнительную информацию по этому свойству можно посмотреть здесь. |
propertyKeyPreview: Boolean; |
Позволяет передать событие, возникающее сразу же после нажатия клавиши на клавиатуре в форму, не обращая внимания на то, какой компонент в данный момент был активным. |
property Menu: TMainMenu; |
Содержит имя меню, соответствующее данной форме. |
property Name: TComponentName; |
Имя формы. |
propertyPixelsPerInch: Integer; |
Задает количество пикселей в одном дюйме в системе. Используется со свойством Scaled. Дополнительную информацию можно посмотреть здесь. |
property Position: TPosition; |
Определяет положение формы на экране. Возможные значения:
Рассмотренные свойства работают тогда, когда WindowState=wsNormal. Дополнительную информацию можно получить здесь. |
property Scaled: Boolean; |
Определяет, масштабировать форму или нет. Если значение этого свойства равно True, то масштабирование осуществляется в соответствии со значением свойства PixelPerInch. Дополнительную информацию можно посмотреть здесь. |
propertyVertScrollBar:TControlScrollBar; |
Определяет параметры вертикальной полосы прокрутки. |
propertyWindowState: TWindowState; |
Определяет вид, в котором окно первоначально предъявляется пользователю при выполнении приложения. Имеет следующие значения:
|
общие понятия о классах и рассмотрим описание классов в Delphi.
Класс - это определенный пользователем тип данных, который обладает внутренними данными и методами в форме процедур или функций и обычно описывает родовые признаки и способы поведения рада похожих объектов.
Экземпляр типа класс принято называть объектом. Объекты класса всегда распределяются в куче в отличие от экземпляров объектового типа. Итак, класс - это описание, объект - то, что создано в соответствии с этим описанием.
Тип класс - это структура данных, состоящая из полей, методов, свойств. Поля содержат данные определенного типа. Методы - это функции и процедуры, описанные внутри класса и предназначенные для операций над его полями. Свойства - это специальный механизм классов, регулирующий доступ к полям. Свойство описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойство. Например, обычная кнопка в окне приложения обладает такими свойствами, как цвет, размеры, положение. Для экземпляра класса "кнопка" значения этих свойств представлены специальными переменными, определяемыми ключевым словом Property. Цвет может задаваться свойством Color, размеры - свойствами Width и Height и т.д.
Так как свойство обеспечивает обмен данными с внешней средой, то для доступа к его значению используются специальные методы класса. Например:
Туре
TMyObject = class(TObject)
Function GetColor : ТSomeType;
Procedure SetColor (ANewValue: TSomeType);
Property MyColor : TSomeType Read GetColor Write SetColor;
end;
Для того чтобы использовать новый тип в программе, нужно объявить переменную этого типа:
Var
MyObjесt: TMyObjесt;
В данном примере доступ к значению свойства MyColor осуществляется через вызовы методов GetColor иSetColor. К методам в явном виде не обращаются, достаточно записать:
MyObject.MyColor := <значение>;
или
<переменная>:= MyObject.MyColor;
и компилятор оттранслирует эти операторы в вызовы соответствующих методов: записи (SetColor) и чтения (GetColor).
Особым видом свойств являются события. В Object Pascal событие - свойство процедурного типа, предназначенное для создания пользовательской реакции на то или иное входное воздействие:
Property OnMyEvent: TMyEvent Read FOnMyEvent1 Write FOnMyEvent2 default asValue;
Здесь:
OnMyEvent - имя свойства;
TMyEvent - тип свойства;
FOnMyEvent1 - поле процедурного типа. Вызывается при чтении значения свойства;
FOnMyEvent2 - поле процедурного типа. Вызывается при записи нового значения свойства;
asValue - значение свойства по умолчанию (может отсутствовать).
FOnMyEvent1, FOnMyEvent2 - поля, содержащие адреса некоторых методов. Присвоить такому свойству значение - значит, указать объекту адрес метода, который будет вызываться в момент наступления события. Такие методы называют обработчиками событий. Таким образом, обработчик события - фрагмент программы, который выполняется в ответ на определенное изменение в программе или в Windows.
Каждый новый класс в Delphi должен быть объявлен глобально. Для этого используется зарезервированное словоClass. Объявление определяет функциональные возможности класса. Объявление классов в модуле производится в разделе объявления типов. Пример объявления класса и объекта в Delphi:
Туре
TForm1 = class (TForm)
Label1: TLabel;
Edit1: TEdit;
CloseBtn: TBitBtn;
OkBtn: TBitBtn;
end;
Var
Form1 : TForm1;
В объявлении типа определен новый класс - TForm1, наследуемый от класса TForm, содержащегося в библиотеке визуальных компонентов. На это указывает зарезервированное слово Class. Данный тип содержит указатели на компоненты, которые были помещены на форму:
один компонент Label1 - объект типа TLabel (иначе говоря, экземпляр класса TLabel),
один компонент Edit1 - объект типа TEdit (экземпляр класса TEdit) и
два экземпляра класса TBitBtn.
Область видимости идентификатора компонента, объявленного в описании класса, простирается от его объявления до конца определения класса, а также распространяется на все потомки этого класса и на все блоки реализации методов класса. Область видимости идентификатора компонента зависит от раздела, в котором объявлен этот идентификатор.
В объявлениях типов класса имеются разделы частных (private), общих (public), защищенных (protected) и опубликованных (published) объявлений.
В разделе частных объявлений размешаются поля данных и методы, недоступные за пределами данного класса. Данные, описанные в этом разделе, могут обрабатываться только путем вызова методов класса.
Поля данных и методы, объявленные в разделе общих объявлений, доступны для всех процедур, программный код которых расположен в области видимости данного объекта. В разделе общих объявлений должны быть объявлены поля данных и методы, к которым будут иметь доступ методы других классов.
Поля, свойства и методы, объявленные в разделе защищенных объявлений доступны только внутри модуля с описываемым классом, но также они доступны и в классах-потомках, в том числе и в других модулях.
Свойства, расположенные в разделе опубликованных объявлений, отображаются в Инспекторе объектов (Object Inspector).
иерархии классов в Delphi.
Все классы Object Pascal порождены от единственного родителя - класса TObject. Этот класс не имеет полей и свойств, но включает в себе методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов - от их создания до уничтожения. Новый класс можно создать на основе этого базового класса.
Принцип наследования приводит к созданию дерева классов, постепенно разрастающегося при перемещении отTObject к его потомкам. Каждый потомок дополняет возможности своего родителя новыми свойствами и передает их своим потомкам. В состав Delphi входят более 300 различных классов. Для примера приведем небольшой фрагмент дерева классов Delphi:
Рис.1.
Фрагмент дерева классов Delphi
Класс TPersistent обогащает возможности своего родителя TObject; он умеет сохранять данные в файле и получать данные из него. Класс TComponent умеет взаимодействовать со средой разработчика и передает это умение своим потомкам. Класс TComponent является базовым для создания не визуальных компонентов. TControl не только способен работать с файлами и средой разработчика, но он уже умеет создавать и обслуживать видимые на экране изображения. Класс TControl является базовым для создания визуальных компонентов. Потомок этого классаTWinControl может создавать Windows-окна т.д.
Класс TObject инкапсулирует основные функции, свойственные всем объектам Delphi. Интерфейс TObjectобеспечивает:
возможность создания, управления и разрушения экземпляров объектов, включая выделение под них памяти, инициализацию и освобождение памяти после их уничтожения;
поддержку информации об объектах и типах;
поддержку обработки сообщений.
Все классы в Delphi являются прямыми или косвенными наследниками TObject. Прямое наследование используется только при объявлении простых классов, объекты которых не являются компонентами, не могут присваиваться друг другу и не участвуют в операциях обмена с потоками. Подавляющее большинство классов являются косвенными наследниками TObject и образуются от производных классов. Если при объявлении нового типа объектов не указывается класс-предок, то Delphi считает TObject предком нового класса.
Во всех объектах, которые используются в программах, допустимо применять методы, определенные в классеTObject. Перечислим основные из них (таблица 1):
Таблица 1. Основные методы TObject |
|
Метод |
Описание |
constructor Create; |
Конструктор. Создает новый экземпляр объекта и инициирует обработчик исключительных ситуаций. Не осуществляет инициализацию каких-либо данных, поэтому перегружается в классах-наследниках. |
destructor Destroy;virtual; |
Деструктор. Производит действия по уничтожению экземпляра объекта. Рекомендуется вызывать не Destroy, а Free. |
procedure Free; |
Уничтожает объект и освобождает выделенную под него память. Автоматически вызывает Destroy, если объект существует. |
class functionNewInstance: TObject;virtual; |
Выделяет область памяти под объект и возвращает указатель на нее. Автоматически вызывается всеми конструкторами. Использует InstanceSize. Может перегружаться в классах-наследниках. |
class procedureInitInstance (Instance: Pointer) : TObject; |
Инициализирует экземпляр объекта и указатель на его таблицу виртуальных методов. Вызывается автоматически методом NewInstance. Не может быть перегружен. |
procedureFreeInstance; virtual; |
Освобождает память, выделенную ранее методом NewInstance. Автоматически вызывается деструктором Destroy. Непосредственный вызов пользователем не требуется. Должен быть перегружен, если перегружен метод NewInstance. ИспользуетInstanceSize для определения размера выделенной области памяти. |
function ClassType: TClass; |
Возвращает указатель на класс вызвавшего объекта. |
class functionClassName: string; |
Возвращает строку с именем класса. |
class functionClassParent: TClass; |
Возвращает указатель на класс-предок. |
class functionClassInfo: Pointer; |
Возвращает указатель на структуру, содержащую информацию о классе. |
class functionInstanceSize: LongInt; |
Возвращает размер экземпляра объекта. |
class functionInheritsFrom(AClass: TClass): Boolean; |
Проверяет, является ли данный класс порожденным от класса AClass и возвращает соответствующее логическое значение. |
class functionClassNameIs(constName: string): Boolean; |
Возвращает True, если передаваемое в функцию имя совпадает с именем данного класса. |
class functionMethodAddress (constName: string): Pointer; |
Возвращает адрес метода вызвавшего объекта с заданным именем. |
class functionMethodName(Address: Pointer): string; |
Возвращает имя метода с заданным адресом. |
function FieldAddress (const Name: string): Pointer; |
Возвращает адрес поля вызвавшего объекта с заданным именем. |
свойства и методы класса TComponent.
Предком для всех компонентов библиотеки является класс TComponent. Он инкапсулирует наиболее общие свойства и методы компонентов, включая:
возможность включать компонент в палитру компонентов и работать с ним при визуальном проектировании;
способность быть владельцем других компонентов или управляться другими компонентами;
возможность обмена с потоками и файлами;
возможность служить оболочкой элементов ActiveX и других объектов.
Объекты типа TComponent не создаются. Этот класс используется как базовый при объявлении класса невизуального компонента, который может присутствовать в палитре компонентов и применяться в процессе проектирования.