Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как уничтожить объект в его же OnClick? ----- 
:(
    Опции темы
Гость_Андрей
Дата 17.2.2005, 15:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Выскакивает Access Violation, ну оно и понятно...
Но всё-таки, должен же быть способ smile(

P.S. Если быть точным, то мне нужно в обработчике Button1.OnClick удалить собственника этой Button1, саму Button1, а также всех остальных потомков собственника Button1.
smile
  Вверх
Rennigth
Дата 17.2.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



можно удалять PostMessage


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Гость_Андрей
Дата 17.2.2005, 16:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если можно, чуть подробнее. В сообщениях я не шибко понимаю...
  Вверх
Girder
Дата 17.2.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Брось на форму: TPanel, а на неё кнопку smile... ну и на OnClick данной кнопки вот ентот обработчик smile
Код
procedure TForm1.Button1Click(Sender: TObject);
var f:TMessage;
begin
FillChar(f,SizeOf(f),#0);
f.Msg:=WM_Close;
TComponent(Sender).GetParentComponent.Dispatch(f);
end;


PS: Если кнопка лежит на форме - то прибьется и форма smile

Это сообщение отредактировал(а) Girder - 17.2.2005, 16:39


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Гость_Андрей
Дата 17.2.2005, 16:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, пойду попробую. Будут вопросы - еще напишу.
  Вверх
Гость_Андрей
Дата 17.2.2005, 17:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Приведенное решение действительно подходит для случая, когда есть панель, а на ней кнопка.
Однако у меня ситуация такая:

есть панель1, на ней n объектов лежат,
есть панель2 (своего рода Caption для Panel1) (родитель у нее - также панель1),
на панели2 есть кнопка.

Нужно при нажатии на кнопку у ничтожить всё.
Делаю так:

procedure TGrCaption._OnCloseButtonClick (Sender: TObject);
var f: TMessage;
begin
FillChar (f, SizeOf (f), #0);
f.Msg:= WM_CLOSE;
TComponent (Sender).GetParentComponent.Dispatch (f);
TComponent (Sender).GetParentComponent.GetParentComponent.Dispatch (f);
end;


Эффект от этого следующий:
1) создаю программно всю свою байду (панели с объектами), нажимаю кнопку, всё пропадает. Прекрасно!
2) еще раз создаю программно такую же конструкцию, нажимаю кнопку,
всё пропадает только при повторном нажатии на нее (первая панель как-то опять появилась под второй)

создаю всю хитроумную панель GrBC так:
begin
GrBC:= TGrBasicComponent.Create (ModelScrollBox);
AssignFile (f, (Sender as TRzGroupItem).Hint);
Reset (f);
GrBC.LoadData (f);
GrBC.Left:= LeftPositionOnCreate;
GrBC.Top:= TopPositionOnCreate;
end;

Сдается мне, ошибка где-то в обработке WM_CLOSE, что-то я неправильно вызываю.
  Вверх
December
Дата 17.2.2005, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Можешь попробовать заюзать ApplicationEvents.OnIdle.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Girder
Дата 17.2.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Уничтожаем себя smile :
Код
TComponent(Sender).Destroying;
TControl(Sender).Parent:=nil;


Уничтож с "отцом" smile :
Код
TComponent(Sender).Destroying;
TControl(TControl(Sender).GetParentComponent).Parent:=nil;
TComponent(Sender).GetParentComponent.Destroying;
TControl(Sender).Parent:=nil;


Уничтожаем с "дедом" smile
Код
TComponent(Sender).Destroying;
TComponent(Sender).GetParentComponent.GetParentComponent.Destroying;
TControl(TControl(Sender).GetParentComponent.GetParentComponent).Parent:=nil;
TControl(Sender).Parent:=nil;


PS: Если предок форма... то тут надо быть внимательным... так как форма не будет унижножена!

Итого (для использования smile ):
Код
procedure TForm1.OnCloseButtonClick(Sender: TObject);
var i:integer;
   Comp:TComponent;
begin
i:=2; //Убить вместе с "дедушкой" (если его нет... прибьется до того что есть);
Comp:=TComponent(Sender);
while (i>0)and(Comp.GetParentComponent.GetParentComponent<>nil) do
 begin
  Comp:=Comp.GetParentComponent;
  dec(i);
 end;
Comp.Destroying;
TControl(Comp).Parent:=nil;
end;


Это сообщение отредактировал(а) Girder - 17.2.2005, 23:27


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Гость_Андрей
Дата 18.2.2005, 06:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Girder, огромное тебе спасибо. Твой вариант работает!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.