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

Довольно часто возникает необходимость создания динамически изменяющихся интерфейсов, путем добавления и удаления определенных компонентов.

Дата: 13.08.2009 г.

Рейтинг: 0

Метки: Delphi

Пошаговая инструкция:
Работа с компонентами делиться на два времени Design-Time и Run-Time (Время разработки и работы). Design-Time - это время, когда компоненты добавляются в ручную разработчиком, Run-Time – компоненты добавляются по средством кода и до запуска приложения программист имеет изображения, с отображением позиции и прочих визуальных свойств, компонента на форме. Теперь перейдем непосредственно постановки задачи и ее решению.

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

Решение:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure MyPro(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyPro(Sender: TObject);
begin
  Form1.Caption := TimeToStr(Time);

end;

procedure TForm1.Button1Click(Sender: TObject);
var But:TButton;
begin
  But := TButton.Create(self);
  with But do
    begin
      Parent := Self;
      Caption := 'try';
      Width := 30;
      Height := 24;
      Top := 10;
      Left := 10;
      onclick := MyPro;
      Visible := True;
    end;
end;

end.


Внешний вид:
Динамическое создание визуальных компонентов


Описание решения:
В нашем случае динамическую кнопку создает другая кнопка Button1, которая создана в Design-Time . Как видите при описании типа TForm1, указана переменная Button1 типа TButton и соответственно если нам нужна новая кнопка то мы можем использовать данный тип. Именно по этому в процедуре описывающий действия Button1 при нажатии мы и объявляем нашу новую кнопку:
var But:TButton;

But у нас объявлен, но фактически он не создан и именно по этому после begin мы описываем создание But :
But := TButton.Create(self);

Теперь наша динамическая кнопка создана, но нам необходимо описать ее свойства:
  with But do
    begin
      Parent := Self;
      Caption := 'try';
      Width := 30;
      Height := 24;
      Top := 10;
      Left := 10;
      onclick := MyPro;
      Visible := True;
    end;

Описывать свойства можно в произвольном порядке, но вот команду на отображения лучше в самую последнюю очередь. В коде использован with, для уменьшения кода. Если вы еще не очень опытны, то изначально можете писать:
      But.Parent := Self;
      But.Caption := 'try';
      But.Width := 30;
      But.Height := 24;
      But.Top := 10;
      But.Left := 10;
      But.onclick := MyPro;
      But.Visible := True;

Значение свойств But:
Parent := Self; - «Родитель», это может быть любой визуальный компонент пример
Parent := Form1;
Parent := Panel1;    


Caption := \'try\'; - Текст отображаемый на кнопке
Width := 30; - Длинна кнопки (в пикселях)
Height := 24; - Высота кнопки (в пикселях)
Top := 10; - Позиция кнопки, отступ сверху (в пикселях)
Left := 10; - Позиция кнопки, отступ слева (в пикселях)
onclick := MyPro; - Выполняемая процедура при нажатии
Visible := True; Команда на отображение кнопки на форме

И напоследок, хочу обратить ваше внимание на процедуру, которая исполняется при нажатии кнопки But – MyPro. Объявляя ее в private класса TForm1 мы указываем, что данная процедура доступна только в приделах класс TForm1. Для выполнения MyPro, как события «при нажатии» кнопки But параметром процедуры MyPro должна быть переменная Sender типа TObject.
procedure MyPro(Sender: TObject);


Удачных проб!

С уважением, Сургай Владимир.



Похожие статьи: