Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Уничтожение компонента изнутри   Найти похожие ветки 

 
webpauk   (2007-02-20 18:35) [0]

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


 
Loginov Dmitry ©   (2007-02-20 18:39) [1]

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


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

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


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


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

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


 
Loginov Dmitry ©   (2007-02-20 18:55) [4]

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


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

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


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


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

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


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

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

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

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


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


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


Код в студию


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

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

> webpauk


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


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


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


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


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

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

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


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


> 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:30) [13]


> Аноним   (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 19:13) [14]


> (чудеса!)


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


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


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

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


 
DiamondShark ©   (2007-02-21 19:55) [16]


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

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

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

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


 
RASkov   (2007-02-21 21:19) [17]

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

TShiftState


 
RASkov   (2007-02-21 21:19) [18]

....и ssDouble


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


> RASkov   (21.02.07 21:19) [18]


> RASkov   (21.02.07 21:19) [17]

спсб



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

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.082 c
6-1161818820
arpohom
2006-10-26 03:27
2007.04.15
TServerSocket и Сетевые Интерфейсы


8-1148486568
anton773
2006-05-24 20:02
2007.04.15
Подскажите алгоритм


15-1173883111
ArtemESC
2007-03-14 17:38
2007.04.15
Взгляд "со стороны" на современное человечество...


2-1174605776
dreamse
2007-03-23 02:22
2007.04.15
Преобразовать руские буквы для поиска в google


15-1174643044
Post_
2007-03-23 12:44
2007.04.15
Вопросик