Лекция

Лекция 5

Тема: Объектная модель Delphi Pascal. Механизм определения типов на этапе выполнения программы. Делегирование методов. Библиотека стандартных классов Delphi. Отношения «основной - вспомогательный» и «старший - младший».

Цель: познакомить с библиотекой стандартных классов Delphi

Помимо наследования и перекрытия методов родителя Delphi дает еще одну возможность модифицировать поведение того или иного объекта. Речь идет о делегировании метода одного объекта другому.

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

type

TNotifyEvent = procedure(Sender: TObject); TMyClass = class

FaEvent: TNotifyEvent of object;

end;

TAnotherClass - class

procedure MyEvent(Sender: TObject);

end;

Теперь экземпляр класса TAnotherClass может делегировать свою процедуру MyEvent объекту класса TMyClass:

var

FMyClass: TMyClass; FAnotherClass: TAnotherClass; begin

FMyClass TMyClass.Create; FAnotherClass := TAnotherClass.Create; FMyClass.FaEvent := FAnotherClass.MyEvent;

end;

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

Библиотека стандартных классов Delphi VCL содержит сотни классов, на базе которых разработчик может создавать собственные приложения Windows.

На рисунке ниже показана иерархия основных базовых классов библиотеки VCL, на базе которых созданы все остальные классы Delphi.


7193_html_4f4e4d39

Рис. Иерархия классов основных компонент библиотеки VCL

Как уже упоминалось ранее, все компоненты библиотеки наследуются от класса TObject, который содержит целый ряд специальных методов существенно снижающих сложность программирования в Delphi:

type TObject = class
constructor Create; {конструктор}
destructor Destroy; virtual; {деструктор}
procedure Free; {уничтожить, если элемент был создан}
class Function InitInstance(Instance: Pointer): TObject; {инициализирует память при создании объекта}
class Function NewInstance: TObject; virtual; {выделяет пямять для размещения объекта}
 Procedure CleanupInstance; {осуществляет корректное завершение работы со строками и другими сложными структурами при уничтожении объекта}
Procedure FreeInstance; virtual; {освобождает память, выделенную под размещение объекта}
 Function ClassType: TClass;{возвращает класс объекта}
class Function ClassName: ShortString; {возвращает имя класса}
class Function ClassNameIs(const Name: string): Boolean; {проверяет принадлежность объекта указанному классу}
class Function ClassParent: TClass;{возвращает тип предка}
class Function ClassInfo: Pointer;{возвращает указатель на таблицу RTTI}
class Function InstanceSize: Longint;{возвращает размер объекта в байтах}
class Function InheritsFrom(AClass: TClass): Boolean;{проверяет принадлежность класса или объекта семейству указанного класса}
 Procedure Dispatch(var Message);{посылает сообщение объекту}
class Function MethodAddress(const Name: ShortString): Pointer; {возвращает адрес опубликованного метода по имени}
class Function MethodName(Address: Pointer): ShortString;
{возвращает имя опубликованного метода по его адресу}
 Function FieldAddress(const Name: ShortString): Pointer;
{возвращает адрес опубликованного поля по его имени}
Function GetInterface(const IID: TGUID; out Obj): Boolean; {проверяет соответствие указанного интерфейса класс}
class Function GetInterfaceEntry(const IID: TGUID):
PInterfaceEntry; {возвращает указатель на структуру, содержащую описание специального интерфейса класса}
class Function GetInterfaceTable: PInterfaceTable; {возвращает указатель на структуру, содержащую описание интерфейса для класса}
 Function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): Integer; virtual; {метод поддержки исключение OLE}
Procedure DefaultHandler(var Message); virtual;{выполняет обработку сообщения по умолчанию}
end;

От класса TObject наследуется родоначальник всех классов, которые могут иметь секцию published - класс TPersistent. Этот класс обеспечивает корректную работу Инспектора Объектов с опубликованными свойствами (сохранение их в файлах формы, инициализацию опубликованных свойств при компиляции программы и копирование полей одного объекта в другой).

От класса TPersistent наследуются классы TComponent (компоненты) - родоначальник всех классов-компонент и некоторые другие вспомогательные классы, например: TStrings (строки), TCollection (коллекции), TCanvas («холсты» - поля, на которых можно «рисовать»), TGraphicObject (графические объекты), TGraphic (графические элементы), TPicture (изображения).

От класса TComponent наследуются все компоненты приложения, в том числе и само приложение (класс TApplication). Особенность потомков класса TComponent заключается в том, что объекты-компоненты могут находиться между собой в отношении «основной – вспомогательный».

Основной компонент отвечает за управление памятью при размещении вспомогательных компонентов: выделение памяти при создании компонента и освобождение памяти при его уничтожении. Для всех компонент, размещенных в форме (TForm) основным компонентом является форма, а для самой формы основным компонентом является приложение (TApplication).

Реализация отношения «основной – вспомогательный» в класса TComponent осуществляется с использованием следующих свойств:

1.                  свойство Owner, которое должно содержать указатель на основной компонент для текущего компонента (оно инициализируется автоматически при помещении компонента в форму);

2.                  свойство ComponentIndex - содержит номер текущего компонента в массиве Components (начиная с 0) основного компонента; определяет порядок создания и изображения вспомогательных компонентов;

3.                  свойство Components[Index] - свойство-массив типа TComponent, содержит указатели на все вспомогательные компоненты текущего компонента;

4.                  свойство ComponentCount - содержит количество вспомогательных компонент текущего компонента.

Таким образом, при необходимости можно просмотреть свойство-массив Components размером ComponentCount и найти нужные вспомогательные компоненты.

Особое место среди потомков TComponent занимает класс TControl, от которого наследуются все элементы управления, размещаемые в окне формы. Соответственно, этот класс содержит свойства, определяющие расположение элементов управления относительно формы на экране.

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

Класс TControl определяет методы, обрабатывающие сообщения мыши и обеспечивающие генерацию соответствующих событий (обычное, двойное нажатие, движение с нажатыми клавишами и т.п.).

От класса TControl наследуются классы TWinControl - оконные элементы управления и TGraphicControl - графические элементы управления.

 Оконные элементы управления имеют собственную функцию окна и, соответственно, могут получать сообщения Windows (TEdit, TMemo, TListBox), в том числе сообщения от клавиатуры, т.е. могут получать фокус ввода. Соответственно, класс TWinControl включает методы обработки сообщений клавиатуры, которые формируют события клавиатуры.

Графические элементы управления порождаются от TGraphicControl и не могут обрабатывать ввод с клавиатуры (TLabel, TImage, TBevel). Они в основном используются для отображения информации.

Класс TWinControl устанавливает между оконными элементами управления отношение «старший – младший». Это отношение определяет подчиненность изображений оконных элементов управления на экране. Например, если форма становится невидимой, то невидимыми становятся все ее младшие элементы управления (метки, кнопки и т.д.).

Контрольные вопросы

1.      Что представляет собой делегирование

2.      Для чего  используется делегирование

3.      Что содержится библиотека стандартных классов Delphi VCL

 


Ұқсас жұмыстар

Жоғарғы оқу орнындағы лекция және оқу жұмысын ұйымдастырудың басқа формалары мен әдістері
Жоғарғы оқу орнындағы лекция. Ағымдағы лекция
Сабақ кестесі
Жоо-дағы оқу процесін ұйымдастыру формалары
Тіл білімінің өзекті мәселелері пәнінің оқу -әдістемелік кешені
Информатика пәні бойынша сыртқы бөлімге арналған тапсырмалар жинағы
Тіл философиясы – тілдің философиялық қызметі жөніндегі ғылым
Семинар сабақтарда пәннің мазмұны бойынша проблемалық оқыту принципін іске асыру
Жоғары оқу орындағы тәрбие мен оқытудың теориясы
Бастауыш сыныпта дүниетануды оқыту әдістемесі