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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самоуничтожение визуального компонента 
V
    Опции темы
PosiTive
Дата 29.3.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ситуация:

динамически создаются кнопки
Код

  job_button_delete:= TButton.Create(Application);
  with job_button_delete do
  begin
    Parent:= job; // job - это фрейм
    Left:= 552;
    Top:= 39*job_count+8;
    Width:= 75;
    Height:= 25;
    Tag:= job_count;
    Caption:= 'Удалить';
    onclick:= del_job;
  end;


и обработчик onclick

Код

procedure TForm1.del_job(Sender: TObject);
begin
(Sender as TButton).Destroy;
end;


при нажатии на кнопку она удаляется, но вместе с этим выдается ошибка обращения к памяти. Как я понимаю нельзя удалять объект из собственного же метода. Может быть есть какой-нибудь ещё способ?

Заранее спасибо.

Это сообщение отредактировал(а) bems - 28.12.2009, 23:51
PM MAIL   Вверх
Akella
Дата 29.3.2009, 15:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



FreeAndNil?
PM MAIL   Вверх
PosiTive
Дата 29.3.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Akella @ 29.3.2009,  15:00)
FreeAndNil?

всмысле (Sender as TButton).Free?

если да, то пробовал, тоже самое :(
PM MAIL   Вверх
Akella
Дата 29.3.2009, 15:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



PosiTive

Цитата(PosiTive @  29.3.2009,  15:03 Найти цитируемый пост)
всмысле (Sender as TButton).Free?

нет

Добавлено через 56 секунд
Что в справке написано по FreeAndNil?

Добавлено через 4 минуты и 40 секунд
Ладно, если не можешь додумать, то вот:
Код

FreeAndNil(job_button_delete);

PM MAIL   Вверх
PosiTive
Дата 29.3.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Akella @ 29.3.2009,  15:06)
PosiTive

Цитата(PosiTive @  29.3.2009,  15:03 Найти цитируемый пост)
всмысле (Sender as TButton).Free?

нет

Добавлено @ 15:07
Что в справке написано по FreeAndNil?

Добавлено @ 15:10
Ладно, если не можешь додумать, то вот:
Код

FreeAndNil(job_button_delete);

таже самая ошибка памяти. 

на всякий случай кусок кода:

Код

procedure TForm1.del_job(Sender: TObject);
begin
freeandnil(Sender);
end;


PM MAIL   Вверх
Akella
Дата 29.3.2009, 15:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(PosiTive @  29.3.2009,  15:14 Найти цитируемый пост)
на всякий случай кусок кода:


ты видишь мой кусок кода или нет?? ГДЕ ТАМ SENDER?
PM MAIL   Вверх
kami
Дата 29.3.2009, 15:19 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(PosiTive @  29.3.2009,  13:44 Найти цитируемый пост)
Как я понимаю нельзя удалять объект из собственного же метода.

Правильно, нельзя.
После вызова события OnClick в процедуре TWinControl.DoKeyPress еще идет обращение к полям экземпляра класса, хотя самого экземпляра уже не существует. Отсюда AV.

Нужно реализовать "замедленное" удаление, например - через механизм сообщений Windows.
PM MAIL WWW   Вверх
Akella
Дата 29.3.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Код

 job_button_delete:= TButton.Create(сюда запихай форму, к которой принадлежит кнопка);




Цитата(PosiTive @  29.3.2009,  13:44 Найти цитируемый пост)
job_button_delete:= TButton.Create(Application);
  with job_button_delete do
  begin
    Parent:= job; // job - это фрейм
    Left:= 552;
    Top:= 39*job_count+8;
    Width:= 75;
    Height:= 25;
    Tag:= job_count;
    Caption:= 'Удалить';
    onclick:= del_job;
  end;


а где owner?
PM MAIL   Вверх
kami
Дата 29.3.2009, 15:26 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Поясняю.
Мы - в обработчике события OnClick той кнопки, которую нужно уничтожить.
Само собой, что уничтожить ее напрямую нет возможности (а соблазн так велик smile ).
Тогда делаем следующий финт ушами:

Код

procedure TForm1.del_job(Sender: TObject);
begin
  PostMessage(Handle, WM_USER, integer(Sender), 0); // Именно Postmessage
end;

Объявляем приемщик сообщения:

TForm1=class(.....)
private
  procedure MyButtonDelete(var Message:TMessage); message WM_USER;
....
end;

procedure TForm1.MyButtonDelete(var Message:TMessage);
begin
  TObject(Message.Wparam).Free;
end;


Цитата(Akella @  29.3.2009,  15:19 Найти цитируемый пост)
а где owner?

Какой Owner, какой Sender?
У человека создается КУЧА кнопок динамически. Переменная job_button_delete теряет смысл сразу после выхода из процедуры создания, да и можно вполне обойтись и без нее.

Это сообщение отредактировал(а) kami - 29.3.2009, 15:32
PM MAIL WWW   Вверх
PosiTive
Дата 29.3.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kami @ 29.3.2009,  15:26)
Поясняю.
Мы - в обработчике события OnClick той кнопки, которую нужно уничтожить.
Само собой, что уничтожить ее напрямую нет возможности (а соблазн так велик smile ).
Тогда делаем следующий финт ушами:

Код

procedure TForm1.del_job(Sender: TObject);
begin
  PostMessage(Handle, WM_USER, integer(Sender), 0); // Именно Postmessage
end;

Объявляем приемщик сообщения:

TForm1=class(.....)
private
  procedure MyButtonDelete(var Message:TMessage); message WM_USER;
....
end;

procedure TForm1.MyButtonDelete(var Message:TMessage);
begin
  TObject(Message.Wparam).Free;
end;


Цитата(Akella @  29.3.2009,  15:19 Найти цитируемый пост)
а где owner?

Какой Owner, какой Sender?
У человека создается КУЧА кнопок динамически. Переменная job_button_delete теряет смысл сразу после выхода из процедуры создания, да и можно вполне обойтись и без нее.

Большое спасибо за совет. У вас кошелек на Яндекс.Деньгах есть?
PM MAIL   Вверх
Akella
Дата 29.3.2009, 16:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(kami @  29.3.2009,  15:26 Найти цитируемый пост)
Какой Owner, какой Sender?
У человека создается КУЧА кнопок динамически.

ну owner ведь должен быть у кнопки
PM MAIL   Вверх
Akella
Дата 29.3.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(kami @  29.3.2009,  15:26 Найти цитируемый пост)
Мы - в обработчике события OnClick той кнопки, которую нужно уничтожить.

 smile я стормозил
PM MAIL   Вверх
THandle
Дата 29.3.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(Akella @  29.3.2009,  16:45 Найти цитируемый пост)
ну owner ведь должен быть у кнопки 


Ну дык а это кто:

Цитата(Akella @  29.3.2009,  15:19 Найти цитируемый пост)
job_button_delete:= TButton.Create(Application);


Хотя можно указать и Nil, если сам убивать собираешься. Вообще kami все правильно говорит. Этот метод кстати описан в книге Антона Григорьева.
PM   Вверх
БелАмор
Дата 23.8.2010, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 7
Всего: 17



Цитата(PosiTive @  29.3.2009,  13:44 Найти цитируемый пост)
Как я понимаю нельзя удалять объект из собственного же метода

Нельзя уничтожать объект не "из собственного метода", а "из собственного обработчика". Это две большие разницы.
"Собственный метод" - это метод, объявленный в этом классе, а "собственный обработчик" - это любой (подходящий) метод любого класса (объекта которого может даже не существовать), ссылка на который хранится в свойстве OnЧтоТоТам своего объекта. Причём в большинстве случаев обработчик является не своим методом, например:
  TForm1.Button1Click - это обработсик OnClick кнопки Button1, но является методом формы Form1.

Ещё пример "большой разницы":
  Form2.Free;
Здесь Free - "свой метод", и в нём вызывается деструктор, но он не "свой обработчик"...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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