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

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

почему то происходит обращение к удаленному Shape [D2005, XP]


Тимофей_ка ©   (2007-08-19 16:22:00) 

const
 ShEnd1=5;
 ShEnd2=4;

var
 Sh: array [1..ShEnd1, 1..ShEnd2] of TShape;


for i := Low(sh) to ShEnd1 do
for j := Low(sh) to ShEnd2 do
begin
 if assigned(Sh[i,j]) then InRect(Sh[i,j]);
end;


вот процедура в которой идет удаление объекта:

procedure TForm4.InRect (Shapes: TShape);
begin

// здесь всякий код в котором идет обращение к объекту (здесь как раз и валится если Shape удален). По условию иногда Shape удаляется:

   Shapes.Free;
 end;

end;


так вот если Sh[i,j] удален, то выходит access violaton, хотя вроде проверку правильно сделал и в процедуру он лезть не должен, но почему то лезет, пожскажите что не так ?


Юрий Зотов   (2007-08-19 17:16:00) [1]

> Тимофей_ка   (19.08.07 16:54) [8]

Перед проверкой IsDr нужно обновлять, иначе там хранится старое значение.

for i := Low(sh) to ShEnd1 do
 for j := Low(sh) to ShEnd2 do
 begin
   if Sh[i, j] <> nil then
   begin
     InRect(Sh[i, j], IsDr);
     if IsDr then
     begin
       sh[i, j].Free;
       sh[i, j]:=nil;
     end;
   end;
 end;


Тимофей_ка   (2007-08-19 17:11:00) [2]

всё, понял, сделал. получилось
спасибо!


Anatoly Podgoretsky   (2007-08-19 17:05:00) [3]

> Тимофей_ка  (19.08.2007 17:02:10)  [10]

Опять какой то неизвестный Shapes


Тимофей_ка   (2007-08-19 17:02:00) [4]

ну изначально массив Shape-ов создается на форме (визуальный компонент):

for i := Low(sh) to ShEnd1 do
 for j := Low(sh) to ShEnd2 do
 begin
   Sh[i,j]:=TShape.create(self);
   Sh[i,j].parent:=form4;
   with Sh[i,j] do
   begin
     parent := form4;
     height := 25;
     width := 80;
     top := i * 100 - 80;
     left := j* 180 - 140;
   end;
 end;


когда у меня было в коде: Shapes.free; соответствующий Shape удалялся с формы и это правльно, но при повторном обращении как я говорил вылатала ошибка.
сейчас при том куске кода что я написал выше,  Shape не удаляются с формы вообще.


Anatoly Podgoretsky   (2007-08-19 16:59:00) [5]

> Тимофей_ка  (19.08.2007 16:54:08)  [8]

Нигде не видать, что бы с формы чегото убиралось.
Опять молчишь, опять темнишь.
Слова, слова и ни видать желания.


Тимофей_ка   (2007-08-19 16:54:00) [6]

написал вот так:


var
IsDr:boolean;

for i := Low(sh) to ShEnd1 do
for j := Low(sh) to ShEnd2 do
begin
 if Sh[i,j]<>nil then InRect(Sh[i,j],IsDr);
 if IsDr=true then
 begin
   sh[i,j].Free;
   sh[i,j]:=nil;
 end;
end;


процедура:

procedure TForm4.InRect (Shapes: TShape; IsDrop:Boolean);
begin

//условие
 IsDrop:=True;
end;


теперь не валится, но и Shape с формы не удаляется.


Anatoly Podgoretsky   (2007-08-19 16:44:00) [7]

> Тимофей_ка  (19.08.2007 16:43:06)  [6]

Вот это другое дело и ты утверждаешь, что у тебя происходит вызов, не верю


Тимофей_ка   (2007-08-19 16:43:00) [8]


> Shapes никакого отношения к sh не имеет


надо вне процедуры обнулять ?

Sh[i,j].free;
Sh[i,j]:=nil;


Anatoly Podgoretsky   (2007-08-19 16:37:00) [9]

> Тимофей_ка  (19.08.2007 16:33:04)  [4]

Shapes никакого отношения к sh не имеет


Тимофей_ка   (2007-08-19 16:33:00) [10]

вот сейчас процедура уже такая:

procedure TForm4.InRect (Shapes: TShape);
var
IsDrop:boolean;

begin
 //всякий код
 if IsDrop=true then
 begin
   Shapes.Free;
   Shapes:=nil;
 end;
end;

end;


так вот он в эту процедуру все равно лезет при удаленном Shape...


Anatoly Podgoretsky   (2007-08-19 16:30:00) [11]

> Тимофей_ка  (19.08.2007 16:27:02)  [2]

Слова, слова и ничего кроме слов.
Я лично компилятору верю, а тебе нет.


Тимофей_ка   (2007-08-19 16:27:00) [12]

да писал я и nil, все равно та же ошибка )))


Anatoly Podgoretsky   (2007-08-19 16:26:00) [13]

А nil будет Пушкин присваивать?


Наверх

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