Delphi создание компонента runtime
Итак, рассмотрим на первый взгляд сложный вопрос о создании компонентов в Run_time (то есть во время работы программы). Но на самом деле этот вопрос довольно просто решается.
Давайте вместе попробуем написать код, чтобы при нажатии на кнопку на форме появлялось текстовое поле с каким-нибудь текстом. Для этого надо проделать следующие действия: объявить переменную необходимого вам типа компонента, в нашем случае TEdit, затем необходимо описать процедуру Create для нашей переменной, задать обязательное свойство Parent (то есть где появится наш компонент), ну и установить необязательные параметры типа высоты, ширины и т.д. Лучше разбираться на конкретном примере, так что смотрите какой у меня получился код:
Как вы видите все очень просто. Поупражняйтесь с различными параметрами.
Процессы создания визуальных и невизуальных компонентов несколько отличаются (последний попроще будет). Поскольку Edit мы уже создали (а это как раз визуальный компонент), теперь будем создавать невизуальный компонент, например FontDialog. Поставьте на форму еще кнопку. Обработчик события OnClick может выглядеть так:
Вы свободно можете изменять любые свойства компонента, созданного во время работы приложения.
Теперь мы попробуем вместе проделать такую вещь: мы отсортируем находящиеся в Memo данные. Для этого поставьте на форму Memo и напишите в ней 4 строки, например:
Теперь рассмотрим еще один вопрос, касающийся создания компонентов в Run-time. Допустим вам надо создать 20 полей для ввода текста (Edit) и еще десять меток (Label), не будете же вы 20 раз писать одно и тоже для каждого edit'a. В этой ситуации есть очень элегантный выход: воспользоваться массивом компонентов. В общем виде объявление массива компонентов может выглядеть так: имя_переменной:array[нижний_индекс..верхний_индекс] of тип_компонента. Теперь поупражняемся в этом. Создайте новое приложение. На форму поместите только кнопку. Обработчик события OnClick которой у меня получился таким:
Ну как?! Иногда воспользоваться массивом компонентов очень даже удобно, потому что в массиве обращение к его элементам происходит по индексу, а в обычной ситуации обращение происходит по имени компонента, что не всегда удобно.
Итак, рассмотрим на первый взгляд сложный вопрос о создании компонентов в runtime (то есть во время работы программы). Но на самом деле этот вопрос довольно просто решается.
Давайте вместе попробуем написать код, чтобы при нажатии на кнопку на форме появлялось текстовое поле с каким-нибудь текстом. Для этого надо проделать следующие действия: объявить переменную необходимого вам типа компонента, в нашем случае TEdit, затем необходимо описать процедуру Create для нашей переменной, задать обязательное свойство Parent (то есть где появится наш компонент), ну и установить необязательные параметры типа высоты, ширины и т.д. Лучше разбираться на конкретном примере, так что смотрите какой у меня получился код: Как вы видите все очень просто. Поупражняйтесь с различными параметрами.
Процессы создания визуальных и невизуальных компонентов несколько отличаются (последний попроще будет). Поскольку Edit мы уже создали (а это как раз визуальный компонент), теперь будем создавать невизуальный компонент, например FontDialog. Поставьте на форму еще кнопку. Обработчик события OnClick может выглядеть так: Вы свободно можете изменять любые свойства компонента, созданного во время работы приложения.
Теперь мы попробуем вместе проделать такую вещь: мы отсортируем находящиеся в Memo данные. Для этого поставьте на форму Memo и напишите в ней 4 строки, например:
Memo4
Memo1
Memo3
Memo2
Поскольку само Memo сортировать данные не умеет, то нам придется во время работы программы создать какую-нибудь переменную абстрактного класса TStringList (этот класс сортировать умеет), затем присвоить этому классу строки из Memo, отсортировать их и присвоить их обратно Memo. Поставим еще одну кнопку на форму, которая будет запускать процесс. Код получится примерно таким: Теперь рассмотрим еще один вопрос, касающийся создания компонентов в Run-time. Допустим вам надо создать 20 полей для ввода текста (Edit) и еще десять меток (Label), не будете же вы 20 раз писать одно и тоже для каждого edit'a. В этой ситуации есть очень элегантный выход: воспользоваться массивом компонентов. В общем виде объявление массива компонентов может выглядеть так: имя_переменной:array[нижний_индекс..верхний_индекс] of тип_компонента. Теперь поупражняемся в этом. Создайте новое приложение. На форму поместите только кнопку. Обработчик события OnClick которой у меня получился таким: Ну как?! Иногда воспользоваться массивом компонентов очень даже удобно, потому что в массиве обращение к его элементам происходит по индексу, а в обычной ситуации обращение происходит по имени компонента, что не всегда удобно.
Для создания формы нам понадобится переменная MyForm: TForm. Создадим форму: MyForm := TForm.Create( Self ). Теперь MyForm это форма, с которой можно делать все, что душе угодно. А нашей душе угодно получше эту форму оформить. Для этого проинициализируем некоторые ее свойства (MyForm.Width, MyForm.Height, MyForm.Caption и т.д.). После инициализации показываем форму: MyForm.ShowModal. На практике это будет выглядеть примерно так.
В этом примере мы создали обработчик события OnClose. Это сделано для того, чтобы после закрытия нашей формы список TList освобождался. Проще всего этот (и все другие) обработчик сделать следующим образом: создать обработчик OnClose для главной формы Form1, а затем просто переименовать его.
Теперь о списке TList, зачем он нужен? TList - это "объект-контейнер", который может хранить в себе кучу других объектов. Точнее сказать, он хранит только ссылки на эти объекты, но это не главное. Главное - TList позволяет хорошо управлять хранящимися в нём объектами. На форме мы будем создавать кнопки, для каждой из которых будем создавать обработчик события OnClick. Вернее сказать, обработчик будет один для всех созданных кнопок. При создании кнопки, мы поместим указатель на нее в список TList, а свойству Tag созданной кнопки присвоим ее индекс в списке TList. Что это за свойство Tag? Это просто целое значение, которое можно использовать по своему усмотрению. Это абсолютно не влияет на сам компонент, а этот индекс нам пригодится.
Обработчик OnClick для кнопки выглядит следующим образом.
Здесь мы выводим Caption кнопки, по которой кликнули. Но как узнать, какая кнопка была нажата? Для этого воспользуемся TButton( Sender ).Tag (помните, в свойстве Tag мы сохраняли индекс кнопки в TList). Мы обращаемся к ячейке TList, индекс которой хранится в свойстве Tag, и получаем из этой ячейки указатель на кнопку, по которой щелкнули.
Иногда может понадобиться удалить один или несколько динамически созданных компонентов. Допустим мы создали на форме кнопку с заголовком "Del my".
Для ее удаления напишем следующий код:
Здесь мы в цикле перебираем все компоненты на форме, проверяя каждый найденный на принадлежность к классу TButton (if Components[i] is TButton). Если принадлежит, проверяем заголовок, и в случае совпадения удаляем кнопку.
Вот в принципе и все. Полностью код данного примера вы можете посмотреть в исходниках, прилагающихся к данной статье (исходники прокомментированы, так что разберетесь без проблем). Удачи в программировании!
Давайте вместе попробуем написать код, чтобы при нажатии на кнопку на форме появлялось текстовое поле с каким-нибудь текстом. Для этого надо проделать следующие действия: объявить переменную необходимого вам типа компонента, в нашем случае tedit, затем необходимо описать процедуру create для нашей переменной, задать обязательное свойство parent (то есть где появится наш компонент), ну и установить необязательные параметры типа высоты, ширины и т.д. Лучше разбираться на конкретном примере, так что смотрите какой у меня получился код:
procedure tform1.button1click(sender: tobject);
var
x: tedit; // объявляем переменную типа tedit
begin
x:=tedit.create(self);// создаем экземпляр компонента
x.parent:=form1;// текстовое поле появится на форме
x.left:=10;
x.top:=10;
x.width:=250;
x.text:='delphi world is (:-0) . ';
end;
Как вы видите все очень просто. Поупражняйтесь с различными параметрами.
Процессы создания визуальных и невизуальных компонентов несколько отличаются (последний попроще будет). Поскольку edit мы уже создали (а это как раз визуальный компонент), теперь будем создавать невизуальный компонент, например fontdialog. Поставьте на форму еще кнопку. Обработчик события onclick может выглядеть так:
procedure tform1.button2click(sender: tobject);
var
y: tfontdialog; // объявляем переменную типа tfontdialog
begin
y:=tfontdialog.create(self);
y.execute; //только для демонстрации. Показать что работает.
end;
Вы свободно можете изменять любые свойства компонента, созданного во время работы приложения.
Теперь мы попробуем вместе проделать такую вещь: мы отсортируем находящиеся в memo данные. Для этого поставьте на форму memo и напишите в ней 4 строки, например:
memo4
memo1
memo3
memo2
Поскольку само memo сортировать данные не умеет, то нам придется во время работы программы создать какую-нибудь переменную абстрактного класса tstringlist (этот класс сортировать умеет), затем присвоить этому классу строки из memo, отсортировать их и присвоить их обратно memo. Поставим еще одну кнопку на форму, которая будет запускать процесс. Код получится примерно таким:
procedure tform1.button3click(sender: tobject);
var
t: tstringlist;
begin
t:=tstringlist.create; //создаем
t.addstrings(memo1.lines); //присваиваем переменной t строки из memo
t.sort; // сортируем
memo1.clear;
memo1.lines.addstrings(t); // присваиваем memo уже отсортированные строки
end;
Итак, рассмотрим на первый взгляд сложный вопрос о создании компонентов в Run_time (то есть во время работы программы). Но на самом деле этот вопрос довольно просто решается.
Давайте вместе попробуем написать код, чтобы при нажатии на кнопку на форме появлялось текстовое поле с каким-нибудь текстом. Для этого надо проделать следующие действия: объявить переменную необходимого вам типа компонента, в нашем случае TEdit, затем необходимо описать процедуру Create для нашей переменной, задать обязательное свойство Parent (то есть где появится наш компонент), ну и установить необязательные параметры типа высоты, ширины и т.д. Лучше разбираться на конкретном примере, так что смотрите какой у меня получился код:
Как вы видите все очень просто. Поупражняйтесь с различными параметрами.
Процессы создания визуальных и невизуальных компонентов несколько отличаются (последний попроще будет). Поскольку Edit мы уже создали (а это как раз визуальный компонент), теперь будем создавать невизуальный компонент, например FontDialog. Поставьте на форму еще кнопку. Обработчик события OnClick может выглядеть так:
Вы свободно можете изменять любые свойства компонента, созданного во время работы приложения.
Теперь мы попробуем вместе проделать такую вещь: мы отсортируем находящиеся в Memo данные. Для этого поставьте на форму Memo и напишите в ней 4 строки, например:
Поскольку само Memo сортировать данные не умеет, то нам придется во время работы программы создать какую-нибудь переменную абстрактного класса TStringList (этот класс сортировать умеет), затем присвоить этому классу строки из Memo, отсортировать их и присвоить их обратно Memo. Поставим еще одну кнопку на форму, которая будет запускать процесс. Код получится примерно таким:
Теперь рассмотрим еще один вопрос, касающийся создания компонентов в Run-time. Допустим вам надо создать 20 полей для ввода текста (Edit) и еще десять меток (Label), не будете же вы 20 раз писать одно и тоже для каждого edit'a. В этой ситуации есть очень элегантный выход: воспользоваться массивом компонентов. В общем виде объявление массива компонентов может выглядеть так: имя_переменной:array[нижний_индекс..верхний_индекс] of тип_компонента. Теперь поупражняемся в этом. Создайте новое приложение. На форму поместите только кнопку. Обработчик события OnClick которой у меня получился таким:
Ну как?! Иногда воспользоваться массивом компонентов очень даже удобно, потому что в массиве обращение к его элементам происходит по индексу, а в обычной ситуации обращение происходит по имени компонента, что не всегда удобно.
Читайте также: