|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Принудительное удаление объекта изнутри
Собственно есть код:
Код:
unit Unit1; interface uses SysUtils, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FB:TButton; procedure FBClick(Sender: TObject); { Private declarations } public { Public declarations } end; TMButton = class(TButton) procedure Click; override; end; var Form1: TForm1; MB:TMButton; implementation {$R *.dfm} procedure CreateTMButton(); begin MB:=TMButton.Create(Form1); MB.Width:=Form1.ClientWidth; MB.Height:=Form1.ClientHeight-20; MB.Caption:='Class'; MB.Parent:=Form1; end; procedure TMButton.Click; begin inherited; //showmessage(inttostr(Integer(MB))); FreeAndNil(MB); //CreateTMButton(); //showmessage(inttostr(Integer(MB))); //Showmessage('MButtonClick'); end; procedure TForm1.FBClick(Sender: TObject); begin FreeAndNil(MB); //CreateTMButton(); //Showmessage('FBClick'); end; procedure TForm1.FormCreate(Sender: TObject); begin CreateTMButton(); FB:=TButton.Create(Form1); FB.Top:=Form1.ClientHeight-20; FB.Height:=20; FB.Width:=Form1.ClientWidth; FB.Caption:='Form'; FB.OnClick:=FBClick; FB.Parent:=Form1; end; end. В коде создается две кнопки: FB (для внешнего удаления), MB (для внутреннего удаления) При клике на FB все работает удовлетворительно. А при клике на MB происходит AV ошибка при выходе из процедуры из-за попытки передачи управления на уже несуществующие адреса. Вопрос в том как адекватно спилить под собой ветку и не налюбнутся с дерева? Тость, как можно адекватно(приближенно к правильному) удалять объект MB из той же TForm1.FBClick? Есть ли какие-то стандартные или нестандартные махинации со стеком или прыжками в иное место кода чтоб все адекватно удалялось и работало? Буду признателен даже за извращенные варианты (хоть эта задачка в принципе извращенная вроде как)... Так сказать если не для дела, то для общего развития и более глубоко понимания сгодятся |