Справочник по компонентам Delphi. Часть 1 - Функции для работы с памятью

ОГЛАВЛЕНИЕ

 

Функции для работы с памятью

Для работы с памятью Delphi предоставляет следующие функции:

function AllocMemfSize: Cardinal): Pointer;SYSUTILS Выделяет блок памяти размером Size и возвращает указатель на него. Выделенная память обнуляется.
function ReAllocMem(P: Pointer; CurSize, NewSize: Cardinal): Pointer;SYSUTILS Изменяет размер блока памяти разме­ром CurSize, на который указывает Р. Если удается выделить блок размером NewSize, функция возвращает указатель на него. Содержимое старого блока переносится в новый. При этом, если CurSize>NewSize, часть содержимого отбрасывается, а если CurSizeто остаток свободного места заполняет­ся нулями.
function MemAlloc(Size: Longint): Pointer;GRAPHICS Выделяет блок размером Size. Если он меньше 64К, память выделяется в куче памяти Delphi, в противном случае — глобальная.

Память, выделенная при помощи этих функций, может быть освобождена при помощи функции FreeMem.

У компонента же определение конструктора на удивление лаконично, но в нем присутствует указатель на Owner:

 constructor Create(AOwner: TComponent); 

Ответ прост: Owner — тот объект, который при создании вызывает конструк­торы всех объектов, владельцем которых он является, а при уничтожении — их деструкторы. Таким образом, поместив при разработке компонент на форму, вы можете не заботиться о его создании и уничтожении в программе. Все свойства таких компонентов и все связи между ними запоминаются в файле формы .DFM и при запуске приложения создаются вновь автоматически.

 Деструктор компонента destructor Destroy; 

уничтожает все дочерние компоненты (вызывая их деструкторы) и вычеркивает себя из списка компонента-владельца.

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

Принадлежащие компоненты оформлены в виде списка, доступного через свой­ство Components. В классе TComponent предусмотрен набор методов и свойств для управления этим списком:

property Components[Index: Integer]: TComponent;Возвращает указатель на компонент с индексом в списке Index.

property ComponentCount: Integer;

function FindComponent(const AName: string): TComponent;

Возвращает число компонентов в списке.

Возвращает ссылку на компонент-потомок с заданным именем.
procedure InsertComponent(AComponent: TComponent) ;

procedure Rerr.oveCornponent (AComponent: TComponent) ;

Вставляет компонент в конец списка.
Удаляет компонент из списка.
procedure DestroyComponents; Удаляет все компоненты из списка.

Изменять владельца компонента во время исполнения можно, но без особой необходимости не нужно. Дело в том, что используемый для этого метод RemoveComponent не только вычеркивает компонент из списка, но и обнуляет указатель на него в соответствующем поле владельца. Например, если во время визуального проектирования вы поместили на форму кнопку Buttoni, а затем во время выполнения изменили ее владельца, то все обращения к ней в прог­рамме как к Buttoni стали недействительны.

Рассмотрим другие свойства компонента. Он может находиться в одном из множества следующих состояний:

 property ComponentState: TCornponentState; 
TComponentState= set of (csLoading, csReading, csWriting, csDestroying, csDesigning) ;

Эти состояния используются средой во время визуального проектирования, при загрузке/выгрузке компонентов из файлов ресурсов. Во время исполнения приложения множество состояний пусто. Лишь метод

 procedure Destroying; 

устанавливает в состоянии компонента флаг csDestroying и вызывает ана­логичный метод у всех потомков из списка. Он также используется в дест­рукторе компонента.

Свойство Designlnfo относится к стадии разработки (конструирования) приложения:

 property Designlnfo: Longint; 

В нем хранятся координаты верхнего левого угла компонента во время раз­работки.