Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление Обьектов [D7, WinXP]


ZLinX ©   (2007-12-10 12:34:00) 

существует некоторый клас н.п. 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;


Kolan   (2007-12-11 11:19:00) [1]

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


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


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


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


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


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


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


> ZLinX   (11.12.07 09:43) [16]

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


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


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



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


{RASkov}   (2007-12-10 14:54:00) [4]

> [13] ZLinX   (10.12.07 14:50)

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

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


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


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

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


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

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


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

> [11] ZLinX   (10.12.07 14:42)

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


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


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


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


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

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


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

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

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

> [8] fics   (10.12.07 13:56)

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


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

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


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

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


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

> [5] fics   (10.12.07 13:12)

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


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

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


Rouse_   (2007-12-10 13:01:00) [15]


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

А зачем?


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

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


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

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

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


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

И ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо