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

Вниз

Удаление Обьектов   Найти похожие ветки 

 
ZLinX   (2007-12-10 12:34) [0]

существует некоторый клас н.п. TSameClass

есть процедура Создания обьектов


procedure TfMain.AddObject(x,y);
var
 p:TSameClass;
begin
 p:=TSameClass.Create(Application);
 p.X:=X;
 p.Y:=Y;
 p.Name:="SmObject"+IntToStr(index);
 inc(index);
end;


также есть процедура обработки щелчка на кнопке


procedure TfMain.ObjectClick(Sender:TObject);
begin
...................
 if (Sender is TSameClas) then
 (Sender as TSameClass).Free  //выдает сообщение "Abstract Error"
..................
end;


 
Сергей М. ©   (2007-12-10 12:46) [1]

И ?


 
Григорьев Антон ©   (2007-12-10 12:52) [2]

После завершения работы ObjectClick управление возвращается методам вызвавшего его объекта, а объект вы уже удалили, т.е. выполняются методы несуществующего объекта. Ошибки могут быть самыми разными.

Эту проблему можно решить следующим образом: создать специальное оконное сообщение, которое с помощью PostMessage (но ни в коем случае не SendMessage) посылать форме, а на форме при обработке этого сообщения удалять соответствующий объект (ссылку на него можно передавать через параметры сообщения). В этом случае обработчик будет только ставить сообщение в очередь, а удалятся объект будет только при следующей итерации петли сообщений, в которой вызовов методов этого объекта не будет.


 
fics   (2007-12-10 13:00) [3]

А почему вы не указываете в своём коде перента для созданого объекта?


 
Rouse_ ©   (2007-12-10 13:01) [4]


> А почему вы не указываете в своём коде перента для созданого
> объекта?

А зачем?


 
fics   (2007-12-10 13:12) [5]

А я не знаю, спросил.-)


 
{RASkov} ©   (2007-12-10 13:43) [6]

> [5] fics   (10.12.07 13:12)

Парент есть только у потомков TControl, т.е. у "визуальных классов", а у автора наверняка не визуальные, вот только хранение ихо не совсем правильное.... в списке компонентов объекта Application.....
Имхо, в данном случае лучше свой список иметь, например TObjectList....


 
fics   (2007-12-10 13:48) [7]

или массив можно A:array of TSameClass.


 
fics   (2007-12-10 13:56) [8]

и можно удалить вот так A[i].free


 
{RASkov} ©   (2007-12-10 14:01) [9]

> [7] fics   (10.12.07 13:48)
> или массив можно

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

> [8] fics   (10.12.07 13:56)

Правильно заметил :)
А в случае со списком, так - MyObjectList.Delete(i);
Только в случае массива, нужно "как-то" уменьшить размерность массива, например для того чтобы Length() возвращал кол-во "живых" объектов....
А в случае с листом - это все автоматом)


 
fics   (2007-12-10 14:06) [10]

Вот спабибо вам {RASkov}, а то я когда удалял смещал выше стоящие елемент на 1, потом изменял размерность массива, итд


 
ZLinX   (2007-12-10 14:42) [11]


> Парент есть только у потомков TControl, т.е. у "визуальных
> классов", а у автора наверняка не визуальные, вот только
> хранение ихо не совсем правильное.... в списке компонентов
> объекта Application.....Имхо, в данном случае лучше свой
> список иметь, например TObjectList....


Класс TSameClass наследуется от TGraphicControl


 
{RASkov} ©   (2007-12-10 14:47) [12]

> [11] ZLinX   (10.12.07 14:42)

Если ты здесь еще не нашел ответа на свой вопрос, то уточни его(вопрос)....
Так же не плохо бы посмотреть на то, что скрыто за .............. в ObjectClick....


 
ZLinX   (2007-12-10 14:50) [13]

ObjectClick яввляется методом класса TSameClass, В котором при определенных обстоятельствах происходит удаление обьекта


 
Григорьев Антон ©   (2007-12-10 14:52) [14]


> ZLinX   (10.12.07 14:50) [13]
> ObjectClick яввляется методом класса TSameClass

Как же методом TSameClass, если из вашего кода следует, что это метод TfMain?


 
{RASkov} ©   (2007-12-10 14:54) [15]

> [13] ZLinX   (10.12.07 14:50)

PostMessage шли, форме например, где и удаляй нужный объект... В [2] же подробно написано...

А вообще по ветке.... инфы мало и она еще и в добавок запутана :(


 
ZLinX   (2007-12-11 09:43) [16]


> > ZLinX   (10.12.07 14:50) [13] > ObjectClick яввляется
> методом класса TSameClassКак же методом TSameClass, если
> из вашего кода следует, что это метод TfMain?



var
p:TSameClass;
begin
.....
p.OnClick:=ObjectClick;
.......
end;


 
Григорьев Антон ©   (2007-12-11 10:23) [17]


> ZLinX   (11.12.07 09:43) [16]

Ну и что? Метод ObjectClick назначен событию OnClick экземпляра класса TSameClass, но от этого он не перестаёт быть методом класса TfMain. А вот вызывается этот метод в таком случае действительно из методов класса TSameClass, о чём я и написал в [2].


 
Kolan ©   (2007-12-11 11:19) [18]

> существует некоторый клас н.п. TSameClass


> есть процедура Создания обьектов


> также есть процедура обработки щелчка на кнопке


> Класс TSameClass наследуется от TGraphicControl


> ObjectClick яввляется методом класса TSameClass


Класс, столько инфы, непонятно одно, надо то чего? Или просто рассказываете?



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

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

Наверх




Память: 0.51 MB
Время: 0.015 c
2-1197264514
Александр Семак
2007-12-10 08:28
2008.01.06
Создание объекта с динамическим классом


2-1197226685
alikon1
2007-12-09 21:58
2008.01.06
Работа с конкретной строкой в DBGrid


11-1182283667
=BuckLr=
2007-06-20 00:07
2008.01.06
RE_FmtBackColor


2-1197311875
Ruzzz
2007-12-10 21:37
2008.01.06
точка в имени папки


2-1197015502
Zheksik
2007-12-07 11:18
2008.01.06
Можно ли разукрашивать StringGrid в событии отличном от DrawCell?