В этой статье:

Общие сведения

Описание

Динамическое создание и использование компонентов

Номер статьи: KB000028

Общие сведения

Связанные блоки:

Описание

Разработка прикладных форм заключается в наполнении формы компонентами, в настройке их свойств и событий. Большое количество компонентов, добавленных в режиме дизайна формы, увеличивают время загрузки формы и объем используемой оперативной памяти. Если часть компонентов отображается на форме только при определенных условиях, то их можно не добавлять на форму, а создавать динамически во время работы. В коде должна быть объявлена переменная, имеющая соответствующий тип:

Class TESTForm: Form
    btnRun: Button;
    t: Timer;
    //...

Для создания компонента необходимо в коде с помощью ключевого слова New инициализировать экземпляр соответствующего класса и присвоить значение объявленной переменной. Если создается визуальный компонент (компонент, наследуемый от интерфейса IControl), то необходимо в свойстве Parent указать родительский компонент, в области которого будет отрисован создаваемый компонент. Если в роли родительского компонента выступает сама форма, то в качестве значения свойства Parent можно указать зарезервированный идентификатор Self. Указание родительского компонента позволяет корректно уничтожать созданные компоненты при завершении работы формы:

    //...
    btnRun := New Button.Create;
    btnRun.Parent := Self;
    //...

Для невизуальных компонентов (компонентов, наследуемых от интерфейса IComponent) родительский компонент не указывается. Невизуальные компоненты доступны для использования сразу после инициализации переменной соответствующего класса.

    //...
    t := New Timer.Create;
    t.Enabled := False;
    //...

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

    //...
    //Обработчик события OnClick
    Sub btnOnClick(Sender: Object; Args: IMouseEventArgs);
    Begin
        t.Enabled := 
True;
    
End Sub btnOnClick;
    
//Обработчик события таймера
    Sub OnTimer(Sender: Object; Args: IEventArgs);
    
Begin
    
    
End Sub OnTimer;
    
//...

    //...
    //Подпись компонентов на события
    btnRun.OnClick := btnOnClick;
    t.OnTimer := OnTimer;
    //...

При подписании компонента на событие создаются дополнительные ссылки на это событие. Если компонент не визуальный либо не указан родительский компонент, то данные ссылки не позволят сборщику мусора при завершении работы формы корректно очистить память, выделенную под компонент. В результате этого в памяти останутся объекты. Для избежания утечек памяти в таких случаях используйте оператор Dispose для уничтожения компонентов:

    Sub TESTFormOnClose(Sender: Object; Args: IEventArgs);
    Begin
        Dispose t;
    End Sub TESTFormOnClose;

Если во время работы формы необходимо уничтожить какой-либо визуальный компонент, то используйте метод FreeComponent в сочетании с оператором Dispose. FreeComponent удалит визуальную составляющую компонента, Dispose - уничтожит сам экземпляр компонента и освободит память:

    //...
    FreeComponent(btnRun);
    Dispose btnRun;
    //...

См. также:

База знаний разработчиков