Vlad2 Опубликовано 3 февраля, 2015 Поделиться Опубликовано 3 февраля, 2015 Всем здравствуйте))Вот я придумал себе задачу (в учебных целях) сделать программку, на форме которой будет располагаться 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. Как быть?Надеюсь на вашу помощь) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 февраля, 2015 Поделиться Опубликовано 3 февраля, 2015 Почему не используем поисковик? Не sender.Destroy, а sender.Free Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 4 февраля, 2015 Автор Поделиться Опубликовано 4 февраля, 2015 Нет, С Free тоже не работаетОдна и та же ошибка Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 4 февраля, 2015 Поделиться Опубликовано 4 февраля, 2015 Попробуй такие варианты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;)... Все-таки советую поработать с поисковиком, возможно найдешь нужные примеры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 4 февраля, 2015 Автор Поделиться Опубликовано 4 февраля, 2015 Нет тоже самое. Все работает только если создать 1 кнопку и потом нажатием удалить ее. Потом создать и удалить. В общем по одной кнопке все работает.Хорошо, попробую поискать получше. Если найду - отпишусь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 4 февраля, 2015 Поделиться Опубликовано 4 февраля, 2015 Пробуй делать динамический массив, каждым элементом которого будет новая кнопка. А так ты одной и той же переменной присваиваешь новый объект. А куда старый делся - в воздухе завис. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 5 февраля, 2015 Автор Поделиться Опубликовано 5 февраля, 2015 (изменено) 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) Не передает созданный объект. Потому и ошибка, а почему не передает, загадка... Изменено 5 февраля, 2015 пользователем Vlad2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения