Файл: Лр операторы и выражения Delphi.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 278

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ЛР 1. Операторы и выражения Delphi

Оператор присваивания

Арифметические операторы

Оператор конкатенации строк

Логические операторы

Операторы поразрядного сдвига

Операторы отношения

Операторы множеств

Оператор-селектор case

Оператор перехода goto

Организация циклов

ЛР 2. Структурные типы

Множества

Записи

Массивы

ЛР 3. Объекты и классы

Проектирование класса

Управление жизненным циклом объекта

Опережающее объявление класса

Ограничение видимости членов класса

Свойства объекта

Особенности объявления методов

Поля класса и методы класса

Иерархия наследования

Полиморфизм

ЗАДАНИЕ

ЛР4. Опорные классы VCL

Класс TControl

Принадлежность к родительскому контейнеру

Размещение и размеры элемента управления

Видимость и активность элемента управления

Задание

ЛР5. Обработка клавиатурных событий и событий мышки

Щелчки кнопками мыши

Перемещение указателя мыши

Вращение колесика мыши

Операция перетаскивания drag and drop

Задание

ЛР 6. Классы потоков данных

Прототип потоков данных, класс TStream

ЛР4. Опорные классы VCL


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

На рис. 4.1 представлен фрагмент иерархии наследования классов Delphi. Здесь вы обнаружите наиболее важные классы VCL. Почему поставлен акцент на слово "важные"? Потому, что именно эти классы определяют основные родовые черты своих многочисленных потомков. Изучив опорные классы VCL, мы получим представление о ключевых особенностях всех классов библиотеки.
Класс TObject

К задачам, решаемым классом TObject, в первую очередь стоит отнести:

  • создание, поддержку и уничтожение объекта; распределение, инициализацию и освобождение памяти, необходимой для этого объекта;

  • возврат всей информации об экземпляре класса, в том числе данных RTTI об опубликованных свойствах и методах объекта;

  • поддержку взаимодействия объекта с внешней средой с помощью сообщений и интерфейсов.

Наиболее важными методами для любого из классов VCL считаются конструктор и деструктор — они управляют существованием объекта.

constructor Create; //создание объекта

destructor Destroy; //разрушение объекта

Пока мы видим наиболее простое объявление конструктора и деструктора, в ряде более поздних классов методы усложнятся и дополнятся параметрами.

В составе класса TObject имеется ряд полнофункциональных обычных методов и методовкласса (class function), позволяющих получить подробную метаинформацию о классе. Ключевые методы TObject представлены в табл. 4.1.

Таблица
4.1.Получениесведенийоклассе


Метод

Описание

class function ClassName: string;

Функции возвратят текстовую строку с названием класса

class function UnitName: string;

Имя модуля, в котором описан класс

function ClassType: TClass; inline;

Возвратит описание класса

class function ClassNameIs(const Name:

string): Boolean;

Проверка, является ли объект экземпляром класса

Name

class function InheritsFrom(AClass: TClass): Boolean;

Проверка, является ли объект потомком класса AClass

class function ClassParent: TClass;

Возвратит непосредственного предка объекта

class function MethodName(Address: Pointer): string;

Возвращает имя метода по указателю. Метод должен быть опубликован в секции published


...

...

...

...

...



Выбрав пункт меню 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 предусмотрено право владения, когда один объект выступает владельцем другого объекта. В-третьих, класс расширяет

возможности по хранению и обслуживанию данных. В-четвертых, в отличие от своих предков (оперирующих только методами) класс 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;
В раках цикла осуществляется перебор всех принадлежащих