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


Автор: Zavlab 28.12.2009, 21:11
Здравствуйте.

  Приплыл в своём программировании в тупик. Получается, что компонент формы должен сам себя уничтожить. На первый раз проносит(имею ввиду цикл разрушения-создания), а дальше ошибки появляются. Самые информативные такие: "Abstract error" и "Invalid pointer operation". А дальше прогу вообще выключить нельзя нормальными способами. 
  Что ещё я обнаружил так это то, что после срабатывания метода free указатель на компоненту (Element:TControl;) равен не nil (как до создания пользуясь Create), а некоему ([csInheritable]). Это значение показывает Watch. В самом методе (Sender-ом, к примеру, является кнопка) всё происходит без Исключений, но как только дело доходит за последний end этого метода, тут же и сообщение об ошибке. Если этот же метод будет исполняться с Sender-ом в виде Form1 или другого компонента, который не подлежит удалению, то метод отрабатывается хорошо и после него тоже всё хорошо. Получается нужен кто-то ктобы потом позже произвёл удаление ненужного компонента. Думал реализовать это через сообщения, но методы Perform или WndProc работают как подпроцедуры, что совсем не подходит.
  Есть ли какие-либо другие способы устранить проблему. Вариант через timer оставлю как самый последний.


Для наглядности приведу суть метода:

Код

var Element:array of TControl;

procedure TForm1.FormReInitialization(Sender: TObject);
var i,fin:byte;
begin
    fin:=Length(Element);
    if fin>0 then
     for i:=fin-1 downto 0 do
       Element[i].free;
    SetLength (Element,0);
    form1.FormInitialization(Sender);
end;


Можно и без метода FormInitialization. Грабли те же.

Автор: DarkProg 28.12.2009, 21:58
Кажется это уже обсуждалось ранее, ну да ладно

Я тут что вижу ты связываешь массив компонентов с реальными компонентами, а что если попробовать так
Код

  FindComponent(Element[i].Name).free


А ещё предлагали вариант, я правда сам не пробовал
  
Код

  FreeAndNil(Element[i])

или так
Код

 Element[i].free;
 element[i]:=nil;

Автор: kami 28.12.2009, 21:58
Чуть пропиарю себя, любимого smile
http://forum.vingrad.ru/index.php?showtopic=253299&view=findpost&p=1826869

Автор: DarkProg 28.12.2009, 23:07
Цитата(kami @  28.12.2009,  21:58 Найти цитируемый пост)
Чуть пропиарю себя, любимого 
самоуничтожение визуального компонента 


О класс и, по моему доступно изложено

Да и я в этом вопросе чуток поумнее стал smile

Автор: Zavlab 28.12.2009, 23:31
Спасибо! "То что доктор приписал".

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