
- •Технология программирования
- •Технология программирования
- •Оглавление
- •§1. Классификация и эволюция программного обеспечения
- •§2. Модульное и объектно-ориентированное программирование
- •Основные понятия ооп
- •Составные части объектного подхода
- •Инкапсуляция. Свойства
- •Наследование. Методы
- •Полиморфизм
- •§3. Визуальная среда программирования Структура проекта Delphi
- •Библиотека компонентов Delphi
- •Класс tButton (кнопки)
- •Класс tShape (фигуры)
- •§4. Основные типы данных в языке Паскаль
- •Класс tLabel (надписи)
- •Класс tEdit
- •Класс tMemo
- •Класс tMainMenu
- •Стандартные диалоги
- •Классы tOpenDialog и tSaveDialog
- •Класс tFontDialog
- •Инструкция case
- •§6. Программирование циклических алгоритмов
- •Цикл с параметром. Инструкция for
- •Цикл с предусловием. Инструкция while
- •Цикл с постусловием. Инструкция repeat … until
- •§7. Простейшие вычислительные методы
- •Метод прямоугольников
- •Метод Монте-Карло
- •Метод деления пополам
- •§8. Процедуры и функции
- •§9. Одномерные массивы
- •Класс tListBox
- •Класс tComboBox
- •§10. Двумерные и многомерные массивы
- •Класс tStringGrid
- •Алгоритмы поиска наименьшего и наибольшего элемента
- •§11. Алгоритмы поиска и сортировки. Понятие вычислительной сложности алгоритма
- •Алгоритм простого перебора
- •Алгоритм бинарного поиска
- •Алгоритм сортировки методом «пузырька»
- •Алгоритм сортировки включением
- •Понятие вычислительной сложности алгоритма
- •§12. Обработка исключительных ситуаций
- •§13. Программирование процессов реального времени
- •Класс tTimer
- •§14. Графическая подсистема Delphi Класс tImage
- •Класс tCanvas
- •§15. Динамическое создание компонентов. Конструкторы и деструкторы
- •§16. Тестирование и отладка программ
- •Методы тестирования программ
- •Средства отладки программ в Delphi
- •Трассировка программы
- •Точки останова программы
- •Наблюдение значений переменных
- •§17. Жизненный цикл программного обеспечения
- •Последовательный (каскадный) тип
- •Эволюционный (спиральный) тип
- •Библиографический список
- •Технология программирования
- •Редактор с.В.Пилюгина
- •620034, Екатеринбург, ул. Колмогорова, 66, УрГупс Редакционно-издательский отдел
§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].