Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Программно создать/удалить компонент на форме


Автор: saneea 26.3.2008, 18:08
Не могу разобраться как программно создать/удалить компонент на форме. Хочу по нажатию на кнопку что-бы создавался TLabel. Пробовал так:

Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;
  san: TLabel;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
san.Left:=50;
san.Top:=50;
san.Caption:='adsfdsdf';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
san:=TLabel.Create(nil);
end;

end.



но никакого результата нет! Что я не правильно делаю?

Автор: Rodman 26.3.2008, 18:11
Код

san.Destroy;

Автор: Rennigth 26.3.2008, 18:21
Цитата(saneea @  26.3.2008,  18:08 Найти цитируемый пост)
но никакого результата нет! Что я не правильно делаю? 

Parent не указываешь.

Добавлено через 1 минуту и 55 секунд
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(san) then
    san := TLabel.Create(Self);
  san.Parent := Self;
  san.Left := 50;
  san.Top := 50;
  san.Caption := 'adsfdsdf';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(san) then
    FreeAndNil(san);
end;



Автор: saneea 26.3.2008, 19:18
Rennigth, спасибо, работает!

А Self - это какой-то объект-родитель? Если да, то для всех ли компонентов?

Как я понял код:
Код

FreeAndNil(san);


можно заменить на:
Код

san.Destroy;
san:=nil;


Что делает функция Assigned? Проверяет создан объект или нет?

И ещё вопрос: я тоже самое проделал с TButton, как обрабатывать клик по такой кнопке?

Заранее спасибо!

Автор: Rennigth 26.3.2008, 19:30
Цитата(saneea @  26.3.2008,  19:18 Найти цитируемый пост)
А Self - это какой-то объект-родитель? Если да, то для всех ли компонентов?

Self это указатель на самого себя, т.е. в контексте твоей формы Form1 и Self одно и тоже.

Цитата(saneea @  26.3.2008,  19:18 Найти цитируемый пост)
Как я понял код:
Код

FreeAndNil(san);

можно заменить на:
Код

san.Destroy;
san:=nil;

да.

Цитата(saneea @  26.3.2008,  19:18 Найти цитируемый пост)
Что делает функция Assigned? Проверяет создан объект или нет?

Не совсем. Она проверяет не равен ли указатель на объект nil. 

Цитата(saneea @  26.3.2008,  19:18 Найти цитируемый пост)
И ещё вопрос: я тоже самое проделал с TButton, как обрабатывать клик по такой кнопке?

Код

interface
  TForm1 = class(TForm)
//...
  private
    FButton: TButton;
    procedure ButtonClick(Sender: TObject);
//...
  end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(FButton) then
    FButton := TButton.Create(Self);
  FButton.Parent := Self;
  FButton.Left := 50;
  FButton.Top := 50;
  FButton.Caption := 'adsfdsdf';
  FButton.OnClick := ButtonClick;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(FButton) then
    FreeAndNil(FButton);
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  ShowMessage('Click');
end;


Автор: dma 26.3.2008, 19:32
Цитата(saneea @  26.3.2008,  18:18 Найти цитируемый пост)
Как я понял код:
Выделить всёкод Pascal/Delphi
1:
    
FreeAndNil(san);


можно заменить на:
Выделить всёкод Pascal/Delphi
1:
2:
    
san.Destroy;
san:=nil;


во Free ещё условие на  существование проверяется:

Код

if san <> nil then
  san.Destroy;


Автор: saneea 26.3.2008, 21:20
Последний вопрос(я надеюсь что он последний): если мне нужно (к примеру) на форму таким образом поместить неизвестное заранее число TButton'ов и потом отслеживать нажатие на каждую из таких кнопок, как быть?

Автор: dma 27.3.2008, 00:31
для каждого создаваемого Button указывай обработчик OnClick, в котором смотри от какого именно Button он пришёл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)