Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
3-1188392155
amily
2007-08-29 16:55
2008.01.06
как исправить DBF


2-1197369129
Washington
2007-12-11 13:32
2008.01.06
WinAPI - закрашивание круглой кнопки


15-1196689767
alsov
2007-12-03 16:49
2008.01.06
событие виндовс на email


2-1197048547
@!!ex
2007-12-07 20:29
2008.01.06
Быстрый алгоритм сжатия упаковки(не архивация) массива


15-1196625121
Удав
2007-12-02 22:52
2008.01.06
где надыбать вирей





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