Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технология программирования / ИТ / Лекции_Технология_прогр.doc
Скачиваний:
112
Добавлен:
17.05.2015
Размер:
848.38 Кб
Скачать

§15. Динамическое создание компонентов. Конструкторы и деструкторы

В § 2 при рассмотрении принципов объектно-ориентированного подхода к программированию говорилось о том, что каждому классу объектов присущи методы создания объекта (конструктор) и уничтожения его для освобождения занимаемой памяти (деструктор). До сих пор мы не сталкивались с этими методами явно, потому что для любого компонента, попавшего при визуальном проектировании в приложение из Палитры компонентов, конструктор и деструктор вызываются автоматически, незримо для программиста. Если же объекты необходимо создавать динамически (во время выполнения приложения), то здесь нужен явный вызов конструктора (Create) и деструктора (Destroy).

Не вдаваясь в общие рассуждения, проиллюстрируем на примерах часто встречающиеся задачи такого типа. Например, нам нужна не одна кнопка (или картинка), а массив однотипных компонентов, число которых задается во время работы приложения.

Фрагмент программы, создающий массив из n кнопок, может выглядеть примерно так:

for i:=1 to n do begin

m_but[i]:=TButton.Create(self);

{создается очередной элемент массива кнопок m_but}

m_but[i].parent:=self;

{он появляется на форме}

m_but[i].Top:=i*25;

m_but[i].Left:=30;

{кнопки размещаются одна под другой с интервалом

25 пикселей между верхними границами}

m_but[i].Caption:=IntToStr(i);

{надпись на каждой кнопке соответствует ее номеру}

end;

Разумеется, прежде чем этот фрагмент заработает, массив должен быть объявлен в блоке var следующим образом (количество элементов должно быть таким, чтобы их заведомо хватило для конкретной задачи):

m_but : array[1..100] of TButton;

Уничтожение массива и освобождение занимаемой памяти выполняется так:

for i:=1 to n do

m_but[i].Destroy;

Обратите внимание, что конструктор вызывается применительно к классу TButton, а деструктор – к отдельному объекту. Изменение свойств тоже относится к отдельному объекту.

Такой способ задания массивов компонентов удобен, если нас интересуют их свойства, но не методы или события, т. е. нельзя обработать событие onClick для каждой кнопки из массива, созданного таким образом. Если же нужно, чтобы динамически созданные кнопки реагировали на нажатие, то необходимо создать новый класс – наследник TButton, для которого затем перекрыть обработку соответствующего события. Это делается, например, так.

Перед блоком var описывается новый класс:

TMy_button = class(TButton)

public

constructor Create(AOwner:Tcomponent); override;

procedure Click; override;

{метод Click будет перекрыт}

end;

Затем после строки {$R *.dfm} описывается метод-конструктор Create для этого класса:

constructor TMy_button.Create(AOwner:Tcomponent);

begin

inherited create(AOwner);

left:=0; width:=50; height:=20;

{можно задать свойства, одинаковые для всех экземпляров}

end;

Затем описывается процедура обработки события onClick для всех кнопок. Заголовок процедуры здесь следует написать самим, система его не сформирует. В данном примере при нажатии какой-либо кнопки из массива на объекте Label1 появится та же надпись, что и на нажатой кнопке:

procedure TMy_button.Click;

begin

Form1.Label1.Caption:=Caption;

end;

Обратите внимание на необходимость указывать имя формы перед именем объекта.

Для динамического создания компонентов других встроенных классов Delphi может потребоваться подключение дополнительных библиотек в список uses, находящийся в разделе interface (в начале модуля unit). Например, для классов TShape и TImage потребуется добавить в список uses элемент ExtCtrls.

Более подробные сведения о создании компонентов можно найти в [5].

Соседние файлы в папке ИТ