Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1174476821
Johnmen
2007-03-21 14:33
2007.04.15
Дайте код!


15-1174499553
Real
2007-03-21 20:52
2007.04.15
Рисовалка структуры БД


4-1164479611
Dmitry_177
2006-11-25 21:33
2007.04.15
Создание меню на API


2-1175101748
r1111
2007-03-28 21:09
2007.04.15
TMemo: файл загружается не полностью


2-1174828083
$00FF00
2007-03-25 17:08
2007.04.15
JPEG на API





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский