Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторки 1-6 по Delphi.pdf
Скачиваний:
39
Добавлен:
08.04.2015
Размер:
1.09 Mб
Скачать

Языки программирования

Выбрав пункт меню File | New | VCL Forms Application, создайте новое приложение на основе формы. Подключите к строке uses проекта модуль StdCtrls (в нем расположен код стандартных элементов управления). В перечне событий формы Form1 (на вкладке Events Инспектора объектов) находим событие OnShow. Двойной щелчок левой кнопкой мыши в строке напротив названия события заставит Delphi создать код обработчика события, вызываемого в момент показа формы на экране. Вам осталось лишь повторить несколько строк кода, приведенных в листинге 4.1.

Листинг 4.1. Демонстрация возможностей конструктора

uses ..., StdCtrls;

...

procedure TForm1.FormShow(Sender: TObject);

var Btn:TButton; //переменная класса кнопки TButton begin

Btn:=TButton.Create(Form1); //вызов конструктора класса TButton

Btn.Parent:=Form1; //размещаем кнопку на форме end;

После запуска приложения в левом верхнем углу формы появится кнопка. Она возникла не из воздуха, это следствие вызова конструктора Create() для экземпляра класса TButton.

Класс TPersistent

Одну из наиболее значимых ветвей классов в древе VCL начинает ближайший сподвижник TObject — класс TPersistent. Основное предназначение класса — научить своих потомков работать с памятью, что позволит им загружать данные из области в памяти и выгружать данные в область. Именно благодаря TPersistent компоненты и форма проекта приобрели возможность сохранять свое описание в специальный файл с расширением dfm или xfm.

Как и в случае с TObject, основу рассматриваемого класса составляют только методы. Среди них наибольшего внимания заслуживают виртуальные методы присвоения данных:

procedure Assign(Source: TPersistent); virtual; procedure AssignTo(Dest: TPersistent); virtual;

Перечисленные процедуры позволяют разделить одну и ту же область памяти между несколькими объектами — потомками TPersistent. Метод Assign() позволяет одному объекту подключиться к ресурсу другого (листинг 4.2), метод AssignTo() — передать ресурс от одного компонента к другому.

Листинг 4.2. Разделение ресурса между двумя компонентами

procedure TForm1.Button1Click(Sender: TObject); begin

Image2.Picture.Assign(Image1.Picture); end;

Основа компонента, класс TComponent

Обсудим вклад TComponent в библиотеку VCL. Во-первых, от него берут начало все компоненты VCL, которые вы найдете на палитре компонентов Delphi. Во-вторых, в логику класса заложено понятие "частной собственности". Другими словами, в TComponent предусмотрено право владения, когда один объект выступает владельцем другого объекта. В-третьих, класс расширяет

40

СКФУ Кафедра компьютерной безопасности

Языки программирования

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

Самое главное свойство, подаренное TComponent своим наследникам, — имя. property Name: TComponentName; // type TComponentName: string;

У каждого компонента опубликовано свойство, никогда не используемое системой: property Tag: Longint;

Это свойство часто применяется программистами для дополнительной идентификации объекта или хранения ассоциированных с объектом целочисленных значений.

Владение компонентом

При разработке проекта на основе формы (класс TForm) мы располагаем на поверхности формы кнопки, строки ввода, метки и другие компоненты, необходимые для работы приложения. Форма (являющаяся дальним потомком класса TControl) становится владельцем (owner) этих компонентов. В свою очередь, каждый из компонентов знает, кому он принадлежит, для этого следует опросить свойство

property Owner: TComponent;

Для того чтобы любой компонент прямо в момент своего рождения приобретал владельца на уровне класса TComponent, несколько усовершенствован конструктор

constructor Create(AOwner: TComponent);

В объявлении появился параметр AOwner, благодаря ему устанавливается связь компонента с его владельцем в момент вызова конструктора.

Внимание!

Уничтожение объекта-владельца влечет за собой уничтожение всех принадлежащих ему объектов.

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

property ComponentCount: Integer; //число компонентов

property Components[Index: Integer]: TComponent; //список компонентов

Создаете новый проект и разместите на его форме несколько любых элементов управления, которые вы найдете на палитре компонентов Delphi, в их числе редактор значений — компонент

ValueListEditor1: TValueListEditor (или Memo1 если вы работаете в старых версиях Delphi) и

обычная кнопка Button1:TButton. Листинг 4.3 содержит код обработчика события OnClick() по кнопке Button1.

Листинг 4.3. Получение списка подчиненных компонентов

procedure TForm1.Button1Click(Sender: TObject);

var i:integer; begin

ValueListEditor1.Strings.Clear;

for i:=0 to form1.ComponentCount-1 do ValueListEditor1.Strings.Add(

form1.Components[i].ClassName+'='+form1.Components[i].Name);

//или Memo1.Lines.Add(… end;

В раках цикла осуществляется перебор всех принадлежащих форме Form1 компонентов с выводом их названия класса и имени в редактор значений ValueListEditor1.

41

СКФУ Кафедра компьютерной безопасности