Справочник по компонентам 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;
В нем хранятся координаты верхнего левого угла компонента во время разработки.