Уничтожаю Button, обнуляется DrawGrid

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

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

Re: Уничтожаю Button, обнуляется DrawGrid

Сообщение zub » 04.08.2013 22:59:19

>>Что помешало разработчикам безопасно обработать сообщение незнаю.
Не порите чушь уважаемый. вызывать деструктор объекта внутри метода этогоже объекта - глупо и противоречит принципам ООП. Перекрестясь это еще можно сделать в какомнибудь своем классе, когда сам контролируешь цепочку вызовов до деструктора, и особенно после. Но толко перекрестясь - через какоето время разработки эта цепочка поменяется, появится вызов виртуального метода или доступ к данным класса после вызова деструктора и приехали.
Вы в курсе какая куча методов вызывается до Button.onclick и какая после? А под разными виджсетами? Я не в курсе, и поэтому понимаю что так делать нельзя. Если приспичило сделать подобное - нужно использовать чтото асинхронное, например http://wiki.freepascal.org/Asynchronous_Calls
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Уничтожаю Button, обнуляется DrawGrid

Сообщение NTFS » 05.08.2013 00:00:01

А с чего это вдруг обработчик события щелка мыши по кнопке стал методом класса кнопки? Он вообще на 100% от объекта кнопки должен быть отвязан, иначе это хлам, а не реализация.

Формально, это вообще метод главной формы. Но можно и извращенную собственную модель реализовать.

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

Re: Уничтожаю Button, обнуляется DrawGrid

Сообщение zub » 05.08.2013 00:17:32

Это может быть метод хоть чего, но формально. По факту он будет вызван из какогонибудь button.click и после него будет много разных вызовов button.ченибудь. Поставте внутри точку остановки, глянте стек, пожамкайте F7.

>>Не настолько страшный, чтобы предать анафеме, но косяк.
Ненадо валить с больной головы на здоровую - косяк ваш, а не 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;
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Уничтожаю Button, обнуляется DrawGrid

Сообщение Alex2013 » 16.08.2013 15:11:42

Я что зря написал
Button1.Enabled:=false;
Button1.Visible:= false;

и только потом
Button1.Free ;
:?: :idea:
Без этого и в линуксе крешется !
Понятно что при активном батоне при выходе из обработчика класс будет пытаться обратится к его "призраку" ( мы его его уже "освободили" и все "повисло в воздухе" )
Alex2013
долгожитель
 
Сообщения: 3147
Зарегистрирован: 03.04.2013 11:59:44

Re: Уничтожаю Button, обнуляется DrawGrid

Сообщение B4rr4cuda » 17.08.2013 02:21:43

Нельзя дестроить в обработчике. Только скрывать и каким-то последующим проходом чистить.. уже извне. Вариантов море: таймер, посылка сообщения, обработчик оншоу и тд.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron