![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление Обьектов [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]И ?