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