- •ЛР 1. Операторы и выражения Delphi
- •Оператор присваивания
- •Арифметические операторы
- •Оператор конкатенации строк
- •Логические операторы
- •Операторы поразрядного сдвига
- •Операторы отношения
- •Операторы множеств
- •Составной оператор begin..end
- •Условный оператор if..then..else
- •Оператор-селектор case
- •Оператор перехода goto
- •Оператор with..do
- •Организация циклов
- •Цикл с параметром for..do
- •Инструкция in в цикле for..do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Вложенные циклы
- •Операторы break и continue
- •ЗАДАНИЕ
- •Вариант 1.
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 2. Структурные типы
- •Множества
- •Записи
- •Вариантные поля
- •Усовершенствованная запись
- •Массивы
- •Объявление массива
- •Обращение к ячейкам массива
- •Динамический массив
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 3. Объекты и классы
- •Проектирование класса
- •Управление жизненным циклом объекта
- •Опережающее объявление класса
- •Ограничение видимости членов класса
- •Свойства объекта
- •Особенности объявления методов
- •Поля класса и методы класса
- •Иерархия наследования
- •Полиморфизм
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •ЛР4. Опорные классы VCL
- •Класс TObject
- •Класс TPersistent
- •Основа компонента, класс TComponent
- •Владение компонентом
- •Класс TControl
- •Принадлежность к родительскому контейнеру
- •Размещение и размеры элемента управления
- •События, связанные с изменением размеров
- •Выравнивание элемента управления в контейнере
- •Видимость и активность элемента управления
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант5
- •Совет
- •ЛР5. Обработка клавиатурных событий и событий мышки
- •Щелчки кнопками мыши
- •Перемещение указателя мыши
- •Вращение колесика мыши
- •Операция перетаскивания drag and drop
- •Обработка событий клавиатуры
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •ЛР 6. Классы потоков данных
- •Прототип потоков данных, класс TStream
- •Потоки с дескриптором, класс THandleStream
- •Файловый поток данных, класс TFileStream
- •Пример работы с файловым потоком данных
- •Задание
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
Языки программирования
Выбрав пункт меню 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
СКФУ Кафедра компьютерной безопасности