Форум: "Начинающим";
Текущий архив: 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.004 c