Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уничтожение компонента изнутри [D6]


webpauk ©   (2007-02-20 18:35:00) 

Есть ли безопасный механизм уничтожения компонента изнутри?
скажем из одной из его процедур...


webpauk   (2007-02-22 10:18:00) [1]


> RASkov   (21.02.07 21:19) [18]


> RASkov   (21.02.07 21:19) [17]

спсб


RASkov   (2007-02-21 21:19:00) [2]

....и ssDouble


RASkov   (2007-02-21 21:19:00) [3]

> вопрос открытый как разделить клик на OnClick и OnDblClick,
> если есть только OnMouseDown?

TShiftState


DiamondShark   (2007-02-21 19:55:00) [4]


> вопрос открытый как разделить клик на OnClick и OnDblClick,
>  если есть только OnMouseDown?

это не тот вопрос, ответ на который тебе нужен.

если тебе лень разбираться, почему контролы нельзя удалять в обработчиках их событий, просто запомни мантру: "контролы нельзя удалять в обработчиках их событий".

Как развязаться от обработчика -- тебе уже показали.


webpauk   (2007-02-21 19:22:00) [5]


> Аноним   (21.02.07 19:13) [14]

осенью приходить?
вопрос открытый как разделить клик на OnClick и OnDblClick, если есть только OnMouseDown?


Аноним   (2007-02-21 19:13:00) [6]


> (чудеса!)


Чудеса будут позже


webpauk   (2007-02-21 17:30:00) [7]


> Аноним   (21.02.07 17:18) [12]

эт я для краткости.
на самом деле есть array of Timage
OnClick - for I:=Low(arr) to high(arr) FreeAndNil(arr[I])
потом создается новый array, элементам которого задается событие OnClick

проблема в OnClick (OnDblClick). OnMouseDown - и проблемы нет (чудеса!)
пусть будет так.
вопрос открытый как разделить клик на OnClick и OnDblClick, если есть только OnMouseDown?


Аноним   (2007-02-21 17:18:00) [8]


> webpauk  


> ему задается событие OnClick
> в этом событии Timage.Free


Так делать не надо


> когда переопределил событие на OnMouseDown - abstract error
> исчез


Это не закономерно, а случайность, так делать тоже не надо.

МОжно так сделать

uses Messages;
...
const UM_DELETE_IMAGE = WM_USER+1;

type
 TForm1 = class(TForm)
...
 private
   procedure UmDeleteImage(var M: TMessage); message UM_DELETE_IMAGE;
...
 end;

....
procedure TForm1.UmDeleteImage(var M: TMessage);
begin
 TImage(M.LParam).Free;
end;

procedure TForm1.Image1Click(Sender: Tobject);
var
 Image: TImage;
begin
 Image:=Sender as TImage;
 PostMsssage(handle, UM_DELETE_IMAGE, 0, LParam(Image)); //отправили, разрушится когда сообщение будет выбрано из очереди
 Image:=TImage.Create(Self);
 Image.OnClick:=Image1Click;

end;


webpauk   (2007-02-21 17:03:00) [9]

наверно я не слишком полно сформулировал вопрос...
извиняюсь!
проблема в следующем:
создается Timage, ему задается событие OnClick
в этом событии Timage.Free и создается новый Timage.

когда переопределил событие на OnMouseDown - abstract error исчез
взвязи с этим есть новый вопрос:
как определить внутри обработчика OnMouseDown, что произошло - DblClick или Click


Аноним   (2007-02-21 15:48:00) [10]


> Поручи кому-нибудь другому


Если вин-контрол, можно отправить сообщение PostMessage'ем на свой сбоственный хендл, а там уже вызвать Free
будет безопасно


Аноним   (2007-02-21 15:45:00) [11]

Abstract Error иногда возникает при обращениях к виртуальным методам уже разрушенного объекта.

> webpauk


Поручи кому-нибудь другому, или убедись, что все то, что может быть вызвано после деструктора (и до выхода из метода, в т.ч сам метод), статическое.


Игорь Шевченко   (2007-02-21 15:18:00) [12]


> тогда почему ошибка выскакивает "Abstract Error"?


Код в студию


Суслик   (2007-02-21 02:27:00) [13]

вопрос скользкий.
поясню почему.
если метод статический и ты контролируешь его вызов (ну т.е. сам и вызываешь метод где-то), то в методе вполне можно удалять объект - главное после удаления не обращаться к полям объекта.

другой вопрос, что если ты хочешь сделать удаление в каком-то виртуальном методе, который ты перекрыл (да хоть в событии, что одно и то же в данном контексте). в этом случае сторона, вызвавшая вирт. метод или событие, может (а скорее всего так и есть) не предполагать, что после вызова вирт. метода (читай твоего метода) объект умрет. есно предок начинает шариться по своим полям, а объекта то нет - умер он уже. отседова и av.

мое мнение таково - если уж очень нужно, то копай каждый конткретный случай - корректно ли так удалять объект или нет.


Плохиш   (2007-02-20 21:52:00) [14]


> webpauk   (20.02.07 18:54) [3]
> тогда почему ошибка выскакивает " Abstract Error"?

Никакого отношения к уничтожению объектов не имеет, используешь абстрактный класс. Рекомендую включить показ варнингов и сделать полный буилд проекта, после этого читать долго и внимательно полученные варнинги.


webpauk   (2007-02-20 19:03:00) [15]

точно...
значит сдохло где-то в другом месте


Loginov Dmitry   (2007-02-20 18:55:00) [16]

Вероятно, тебе лучше знать, из-за чего у тебя вытекает такая ошибка.
Приведи код, как ты уничтожаешь компонент изнутри.


webpauk   (2007-02-20 18:54:00) [17]

тогда почему ошибка выскакивает "Abstract Error"?


Loginov Dmitry   (2007-02-20 18:40:00) [18]

> Вызывай Free из своей процедуры.


т.е. из метода, входящего в реализацию компонента.


Loginov Dmitry   (2007-02-20 18:39:00) [19]

Ну а чем проблема-то? Вызывай Free из своей процедуры.


Наверх

Титульная страница Поиск, карта сайта Написать письмо