Форум: "Основная";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
ВнизУничтожение компонента изнутри Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c