Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];

Вниз

Как удалить компонент его обработчиком?   Найти похожие ветки 

 
eLVik   (2002-09-12 18:36) [0]

У меня ламерский вопрос. На форме имеется компонент, созданный в run-time.
К нему прицеплен обработчик события OnClick. Можно ли в этом обработчике уничтожить данный компонент, чтобы не вылетал EAbstract Error? Прочитал в FAQ нечто похожее, но там не написано как разрешить эту проблему или это в принципе невозможно?
Заранее спасибо за помощь!


 
MBo   (2002-09-12 18:38) [1]

послать ( PostMessage) сообщение форме, по которому она удалит компонент


 
KSergey   (2002-09-13 08:12) [2]

Удалить компонент в его же обработчике нельзя.
Как делать - написал MBo © (12.09.02 18:38)

[Стоит, пожалуй, заметить, что была как-то здесь дискуссия про удаление формы, так вот там я приводил пример из VCL, где форма сама себя нагло же и уничтожает вызовом Free, но этот Free стоит последним оператором в методе! Впрочем, возможно именно для формы борланд как-нибудь хитро извернулась, т.е. в общем случае так делать явно не стоит]


 
Song   (2002-09-13 08:41) [3]

Free делать нельзя. Можно Release, если он доступен.


 
eLVik   (2002-09-13 14:40) [4]

Спасибо за старания, но можно ли по подробнее про PostMessage?


 
Song   (2002-09-13 15:04) [5]

Посылай сообщение, WM_USER например. А в форме его лови и делай Free для нужного тебе компонента. По-моему, MBo всё популярно рассказал...


 
Старый Паскалист   (2002-09-13 15:27) [6]

2eLVik

В чём тут вообще проблема?
В том, что обработчики событий вызываются в основном по такой схеме:

procedure TSomething.DoEvent; // диспетчерский метод.
begin
SomeCodeBefore;
if Assigned(FOnEvent) then FOnEvent(Self); // вызывается обработчик события (если он назначен)
SomeCodeAfter;
end;

Т.е. обработчик события может быть окружён каким-либо кодом.
Причём DoEvent сама вызывается из какой-нибудь ф-и,
обычно из обработчика сообщения, и тоже может быть окружена кодом:

procedure WMEvent(var Msg: TMessage); // message WM_EVENT;
begin
SomeCodeBeforeDoEvent;
DoEvent;
SomeCodeAfterDoEvent;
end;

Если в FOnEvent будет вызван Free,
то SomeCodeAfter при попытке обратиться к полям объекта
или вызвать виртуальную ф-ю
обратится к уже несуществующему объекту со всеми вытекающими последствиями.

Обойти это можно вызвав в обработчике
PostMessage(Handle, CM_RELEASE, 0, 0)
Так мы помещаем в очередь сообщений потока, в котором создана форма, сообщение CM_RELEASE для нашей формы.

Выполнение кода в одном потоке линейно, поэтому это сообщение будет достано из очереди и передано форме уже после того, как отработает DoEvent (и WMEvent).

В обработчике этого сообщения форма просто вызовет Free. И всё.

(Если бы ты попытался передать сообщение через
SendMessage(Handle, CM_RELEASE, 0, 0), (или Perform)
то оно было бы обработано сразу же)


 
eLVik   (2002-09-13 15:54) [7]

Всё! Всем спасибо за участие! Тема закрыта, вопросов больше не имею!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
3-85408
SONY
2002-09-03 14:40
2002.09.26
SUM(TIMEFIELD)


3-85369
Nikolai_S
2002-09-05 09:50
2002.09.26
Помогите составить SQL запрос в MS Access


14-85654
Silentor
2002-08-30 18:46
2002.09.26
Киев, отзовись!


14-85649
murza
2002-08-30 14:54
2002.09.26
Продолжение логической игры


1-85569
diMAN
2002-09-12 18:29
2002.09.26
Эффективная работа со множеством форм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский