>>Что помешало разработчикам безопасно обработать сообщение незнаю.
Не порите чушь уважаемый. вызывать деструктор объекта внутри метода этогоже объекта - глупо и противоречит принципам ООП. Перекрестясь это еще можно сделать в какомнибудь своем классе, когда сам контролируешь цепочку вызовов до деструктора, и особенно после. Но толко перекрестясь - через какоето время разработки эта цепочка поменяется, появится вызов виртуального метода или доступ к данным класса после вызова деструктора и приехали.
Вы в курсе какая куча методов вызывается до Button.onclick и какая после? А под разными виджсетами? Я не в курсе, и поэтому понимаю что так делать нельзя. Если приспичило сделать подобное - нужно использовать чтото асинхронное, например http://wiki.freepascal.org/Asynchronous_Calls
Уничтожаю Button, обнуляется DrawGrid
Модератор: Модераторы
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
А с чего это вдруг обработчик события щелка мыши по кнопке стал методом класса кнопки? Он вообще на 100% от объекта кнопки должен быть отвязан, иначе это хлам, а не реализация.
Формально, это вообще метод главной формы. Но можно и извращенную собственную модель реализовать.
Это конкретный косяк разработчиков LCL под Windows. Не настолько страшный, чтобы предать анафеме, но косяк.
Формально, это вообще метод главной формы. Но можно и извращенную собственную модель реализовать.
Это конкретный косяк разработчиков LCL под Windows. Не настолько страшный, чтобы предать анафеме, но косяк.
Это может быть метод хоть чего, но формально. По факту он будет вызван из какогонибудь button.click и после него будет много разных вызовов button.ченибудь. Поставте внутри точку остановки, глянте стек, пожамкайте F7.
>>Не настолько страшный, чтобы предать анафеме, но косяк.
Ненадо валить с больной головы на здоровую - косяк ваш, а не LCL. То что это прокатывает в делфи ничего не значит, в разных виджсетах обработка событий организованна по разному - не стоит надеяться что если гдето прокатил "неправильный" способ, то он должен прокатывать везде
Добавлено спустя 11 часов 28 минут 41 секунду:
вот вполне рабочий способ убить контрол в его обработчике
>>Не настолько страшный, чтобы предать анафеме, но косяк.
Ненадо валить с больной головы на здоровую - косяк ваш, а не LCL. То что это прокатывает в делфи ничего не значит, в разных виджсетах обработка событий организованна по разному - не стоит надеяться что если гдето прокатил "неправильный" способ, то он должен прокатывать везде
Добавлено спустя 11 часов 28 минут 41 секунду:
вот вполне рабочий способ убить контрол в его обработчике
Код: Выделить всё
procedure TForm1.AsyncDestroy(Data: PtrInt);
begin
TObject(data).Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.QueueAsyncCall(@AsyncDestroy,PtrInt(Button1));
end;
Я что зря написал
Button1.Enabled:=false;
Button1.Visible:= false;
и только потом
Button1.Free ;
Без этого и в линуксе крешется !
Понятно что при активном батоне при выходе из обработчика класс будет пытаться обратится к его "призраку" ( мы его его уже "освободили" и все "повисло в воздухе" )
Button1.Enabled:=false;
Button1.Visible:= false;
и только потом
Button1.Free ;
Без этого и в линуксе крешется !
Понятно что при активном батоне при выходе из обработчика класс будет пытаться обратится к его "призраку" ( мы его его уже "освободили" и все "повисло в воздухе" )
Нельзя дестроить в обработчике. Только скрывать и каким-то последующим проходом чистить.. уже извне. Вариантов море: таймер, посылка сообщения, обработчик оншоу и тд.
