Ошибка при удалении кнопки из ее события

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка при удалении кнопки из ее события

Сообщение NTFS » 10.10.2011 11:39:00

День добрый.

Нашел, ИМХО, баг (ИМХО, потому что сравниваю поведение Lazarus и Delphi).

Создаем пустую форму. Кидаем на нее кнопку Button1.

Создаем обработчик:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Free ;
end;


При щелчке на эту кнопку во время работы программы, она вылетает с проклятым SIGSEGV.

В Delphi аналогичный код работает без запинки.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Ошибка при удалении кнопки из ее события

Сообщение minoshi » 10.10.2011 11:53:04

уже обсуждали здесь

Не работает ?

Добавлено спустя 52 секунды:
Тонкость в том, что не Button1Click, а Button1MouseUp
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: Ошибка при удалении кнопки из ее события

Сообщение Mr.Smart » 10.10.2011 11:56:51

А что вы хотели получить?
Вы удаляете сам объект, который вызывает событие. Ведь после удаления необходимо вернуться по стеку назад в объект.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при удалении кнопки из ее события

Сообщение NTFS » 10.10.2011 12:04:46

minoshi - конечно, я так и сделал, через временный таймер. Но это костыль.
Mr.Smart - в Delphi это работает, отлично работает.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Ошибка при удалении кнопки из ее события

Сообщение Mr.Smart » 10.10.2011 12:26:31

NTFS управление памятью в FPC отличается от Delphi.
И это никак не баг FPC ИМХО.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при удалении кнопки из ее события

Сообщение NTFS » 10.10.2011 15:07:07

Полагаю, что это особенности реализации LCL под Windows. На самом деле, баг некритичный и легко обходится.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Ошибка при удалении кнопки из ее события

Сообщение Максим » 11.10.2011 04:24:04

NTFS

К слову о Delphi.

Откуда нижеприведённая цитата взята догадаться с трёх раз сумеете? :mrgreen:

Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, do not free a button or the form that owns the button in its OnClick event handler.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Ошибка при удалении кнопки из ее события

Сообщение NTFS » 11.10.2011 11:20:06

Цитата-то к месту, но по моему скромному разумению, события должны вызываться из слоя НАД компонентами. Иначе возникает реальная опасность конкретных падений программы. И опять же, в Delphi это работает.

В общем, я понял - для подобных задач лучше чистый WinAPI или дополнительный слой обработки событий.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Ошибка при удалении кнопки из ее события

Сообщение .wOvAN » 11.10.2011 17:31:19

Дельфи как и лазарус после события Клик вызывают событие МышиКнопкаВверх. Но дельфи умудряется исполнить обработчик МКВ даже после уничтожения самого объекта кнопки в событии Клик. :| Вот такие пироги.

Даже не знаю правильно это или нет исполнять обработчик несуществующего объекта. :?:
.wOvAN
постоялец
 
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12

Re: Ошибка при удалении кнопки из ее события

Сообщение NTFS » 11.10.2011 18:00:14

Что мешает просто исправить LCL, чтобы после удаления объекта прекращать его дальнейшие события?
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Ошибка при удалении кнопки из ее события

Сообщение Mr.Smart » 11.10.2011 18:40:33

NTFS здравый смысл!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при удалении кнопки из ее события

Сообщение AlexVinS » 11.10.2011 18:44:09

NTFS писал(а):Что мешает просто исправить LCL, чтобы после удаления объекта прекращать его дальнейшие события?


Могу только пожелать удачи в таком начинании. Не все так просто, особенно если решать задачу в общем виде :wink:
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Ошибка при удалении кнопки из ее события

Сообщение Максим » 12.10.2011 04:16:24

NTFS писал(а):И опять же, в Delphi это работает.

Хочется приключений? Ну что ж, желаю удачи. :mrgreen:
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Ошибка при удалении кнопки из ее события

Сообщение Inferno » 12.10.2011 08:44:23

Я делаю так в FPC. Работает и в linux и в windows:
Код: Выделить всё

type

  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
    procedure FreeObject(Data: PtrInt);
  public
    { public declarations }
  end;
var
  Form1: TForm1;

implementation

{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
    Application.QueueAsyncCall(@FreeObject,PtrInt(Button1));
end;

procedure TForm1.FreeObject(Data: PtrInt);
begin
  TObject(Data).Free;
end;
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 205

Рейтинг@Mail.ru