Перейти к содержанию

Delphi Динамическое создание кнопок на форме.


Рекомендуемые сообщения

Всем здравствуйте))

Вот я придумал себе задачу (в учебных целях) сделать программку, на форме которой будет располагаться 1 кнопка.

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

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure ButtonDestroy(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonDestroy(Sender: TObject);beginsender.Destroy;end;procedure TForm1.Button1Click(Sender: TObject);var btn: TButton;begin btn := TButton.Create(Form1); btn.Parent := Form1; btn.Name := 'Button'+inttostr(random(100)); btn.Height := 20; btn.Width := 80; btn.Left := random(200); btn.Top := random(200); btn.OnClick := ButtonDestroy;end;end.

В общем все создается, но вот при удалении возникает ошибка abstract error. Как быть?
Надеюсь на вашу помощь)

Ссылка на комментарий
Поделиться на другие сайты

Попробуй такие варианты

procedure TForm1.ButtonDestroy(Sender: TObject);begin try  (sender as TButton).Destroy; except end;end;
procedure TForm1.ButtonDestroy(Sender: TObject);begin try   (sender as TButton).Free; except end;end;

Если кнопка не может сама себя удалить через клик, то нужно чтобы что-то её удаляло. Может быть например таймер, который проверяет есть ли в очереди(массив) кнопки для удаления и удаляет их. Вообще я бы посветовал скрывать кнопки. Если создаются новые кнопки и есть скрытые, то показывать скрытые (использовать не .destroy, а .Visible := false;)...

 

Все-таки советую поработать с поисковиком, возможно найдешь нужные примеры.

Ссылка на комментарий
Поделиться на другие сайты

Нет тоже самое. Все работает только если создать 1 кнопку и потом нажатием удалить ее. Потом создать и удалить. В общем по одной кнопке все работает.
Хорошо, попробую поискать получше. Если найду - отпишусь.

Ссылка на комментарий
Поделиться на другие сайты

Пробуй делать динамический массив, каждым элементом которого будет новая кнопка. А так ты одной и той же переменной присваиваешь новый объект. А куда старый делся - в воздухе завис. 

Ссылка на комментарий
Поделиться на другие сайты

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure ButtonDestroy(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  Buttons: array of TButton; implementation {$R *.dfm} procedure TForm1.ButtonDestroy(Sender: TObject);beginsender.Free;end; procedure TForm1.Button1Click(Sender: TObject);var n: integer;begin n := Length(Buttons); n := 1+n; setLength(Buttons, n); n := n-1; Buttons[n] := TButton.Create(Form1); Buttons[n].Parent := Form1; Buttons[n].Name := 'Button'+inttostr(random(100)); Buttons[n].Height := 20; Buttons[n].Width := 80; Buttons[n].Left := random(200); Buttons[n].Top := random(200); Buttons[n].OnClick := ButtonDestroy;end; end.
Вот с динамическим массивом. Каждая кнопочка в отдельной ячейки, но все равно ошибка остается прежней(

Может я делаю чтото не то?

Все кнопки реагируют на нажатие, например, если вместо sender.Free; написать ShowMessage('hello!');. При нажатии на каждую созданную кнопку будет выводиться hello!. 

Так что по логике все работает. Я так понял что (Sender:TObject) Не передает созданный объект. Потому и ошибка, а почему не передает, загадка...

Изменено пользователем Vlad2
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.