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