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

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

Процедура вызывает AV [D7, XP]


Страницы:   1 2 3 4 5

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-а еще что то выполняется?


Страницы:   1 2 3 4 5

Наверх

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