![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура вызывает AV [D7, XP]
pavel_guzhanov © (2010-04-18 19:36:00)Вот такой вот код процедуры:
procedure TMainForm.OnClickImage(sender:TObject);
var Name:String[10];
i, j, k, l,m,c, a, x, y, xa, ya:SmallInt;
BitMap, BitMapR : Graphics.TBitMap;
P, PR : PByteArray;
Image1, Image2: TImage;
SL:TStringList;
S:String;
begin
SL:=TStringList.Create;
Name:=TControl(Sender as TImage).Name;
y:=StrToInt(copy(name, 2, 2));
x:=StrToInt(copy(name, 4, 2));
m:=0;
c:=0;
try
if Pan[y, x]<>nil then
SL.Add(String(Pan[y, x].Name))
else
SL.Add('');
while m<=c do
begin
y:=StrToInt(copy(name, 2, 2));
x:=StrToInt(copy(name, 4, 2));
for k:=1 to 4 do
begin
case k of
1:begin
xa:=x+1;
ya:=y;
end;
2:begin
xa:=x;
ya:=y+1;
end;
3:begin
xa:=x-1;
ya:=y;
end;
4:begin
xa:=x;
ya:=y-1;
end;
end; //case
if (xa<1) or (ya<1) or (xa>18) or (ya>12) or (Pan[yA,xA]=nil) then
continue;
Image1:=Pan[y, x];
Image2:=Pan[ya, xa];
BitMap:=Image1.Picture.Bitmap;
BitMapR:=Image2.Picture.Bitmap;
for i:=0 to Bitmap.Height - 1 do
begin
P := Bitmap.ScanLine[i];
PR:=BitMapR.ScanLine[i];
if not CompareMem(p, pr, BitMap.Width) then
begin
j:=i;
Break;
end;//if not
j:=i;
end;//for i
if j=Bitmap.Height - 1 then
begin
a:=0;
for l:=0 to SL.Count-1 do
begin
if String(Pan[ya, xa].Name)=SL.Strings[l] then
begin
a:=l;
break;
end; //if string
a:=l;
end;// for l
if a=SL.Count-1 then
SL.Add(String(Pan[ya, xa].Name));
c:=SL.Count;
end; //if j
if (SL.Count>1) and (m<c) then
begin
name:=SL.Strings[m];
end;// if sl.count and
S:='';
for l:=0 to SL.Count-1 do
begin
S:=S+SL.Strings[l];
end; //for l
end; //for k
inc(m);
end; //while
for l:=0 to SL.Count-1 do
begin
if sl.Count>1 then
begin
y:=StrToInt(copy(SL.Strings[l], 2, 2));
x:=StrToInt(copy(SL.Strings[l], 4, 2));
pan[y,x].Free;
pan[y,x]:=nil;
end;// if sl.count
end; //for l
for i := 0 to 11 do
begin
for j:=0 to 17 do
begin
if pan[i+1, j+1]<>nil then
pan[i+1,j+1].Parent:=Panel1;
end; //for j
end; //for i
finally
SL.Destroy;
end;
end;
Все отрабатывает правильно. Но... При пошаговой отладке, после секции finally по клавише F7 попадаю на end; который закрывает процедуру. А после него вылетает AV. Подскажите пожалуйста, откуда AV и как с ним бороться?
Anatoly Podgoretsky (2010-04-18 21:50:00) [81]
> Больше нигде не используется.
Верится с трудом, это же глобальная переменная или поле класса. Об объявление которой, ты скромно молчишь.
Anatoly Podgoretsky (2010-04-18 21:45:00) [82]> pavel_guzhanov (18.04.2010 20:47:07) [7]
Не создан объект, ищи какой, можно попытаться найти строку с адресом 00403375
pavel_guzhanov (2010-04-18 21:35:00) [83]
> Оно потом нигде не используется?
Используется. Но с проверкой на nil:
> for i := 0 to 11 do
> begin
> for j:=0 to 17 do
> begin
> if pan[i+1, j+1]<>nil then
> pan[i+1,j+1].Parent:=Panel1;
> end; //for j
> end; //for i
Больше нигде не используется.
_Юрий (2010-04-18 21:19:00) [84]Можно подключить FastMem в качестве менеджера памяти, и включить в его настройках подробный вывод информации.
YurikGL (2010-04-18 21:18:00) [85]
> pan[y,x].Free;
Оно потом нигде не используется? В какой-нибудь перерисовке...
pavel_guzhanov (2010-04-18 21:08:00) [86]а как определить, к какому объекту обращается? После завершающего end'а сразу вылетает AV.
YurikGL (2010-04-18 20:53:00) [87]
> pavel_guzhanov © (18.04.10 20:47) [7]
Судя по ошибке - обращение к несуществующему (несозданному) объекту....
pavel_guzhanov (2010-04-18 20:47:00) [88]Включил. Легче не стало. Получаю следующую информацию:
Project ***.exe raised exception class EAccessViolation with message 'Access violation at address 00403375 in module '***.exe'. Read of address 00000028'. Process stopped. Use Step or Run to continue.
После нажатия OK приложение не падает, а продолжает работать. При повторном выполнении процедуры такая же ошибка, только адреса отличаются.
Anatoly Podgoretsky (2010-04-18 20:30:00) [89]> pavel_guzhanov (18.04.2010 20:03:04) [4]
Взгляни настройки проекта.
YurikGL (2010-04-18 20:23:00) [90]
> контроль диапазонов, а заодно и переполнения
идешь в самое начало кода, нажимаешь ctrl+o+o и потом читаешь тут
http://www.delphisources.ru/pages/faq/base/compiler_directives.html
или тут http://www.delphibasics.ru/1Compiler-directives.php
pavel_guzhanov (2010-04-18 20:03:00) [91]
> Включи контроль диапазонов, а заодно и переполнения
Я конечно извиняюсь за глупый вопрос, но как их включить?
Anatoly Podgoretsky (2010-04-18 19:54:00) [92]> YurikGL (18.04.2010 19:47:01) [1]
Можешь не сомневаться, исполняется множество обработчиков.
Anatoly Podgoretsky (2010-04-18 19:53:00) [93]> pavel_guzhanov (18.04.2010 19:36:00) [0]
Включи контроль диапазонов, а заодно и переполнения. Потом отпишись.
YurikGL (2010-04-18 19:47:00) [94]может после end-а еще что то выполняется?