Delphi World - Почему возникает ошибка Access Violation
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Почему возникает ошибка Access Violation

Автор: Vit
WEB-сайт: http://forum.vingrad.ru

Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено. Это возможно во многих случаях, но наиболее типичные ситуации я попытаюсь перечислить:

1) Обращение к не созданному объекту.

var
  e: TEdit;
begin
  e.text := 'Hello world!';
end;

В данном случае объект e ещё не создан и идёт обращение к памяти, которая ещё не выделена.

2) Обращение к уже разрушенному объекту:

var
  e: TEdit;
begin
  ...
  e.free;
  ...
  e.text := 'Hello world';
end;

Тут есть хитрость, допустим вы хотите проверить есть ли объект и модернизируете код:

if e <> nil then
  e.text := 'Hello world!';

или

if assigned(e) then
  e.text := 'Hello world!';

Особенно часто приходится такое делать когда надо уничтожить объект:

if e <> nil then
  e.free;

Так вот - такой код может быть источником ошибки, так как метод Free автоматически не устанавливает указатель в Nil. Обязательно после каждого Free используйте установление указателя в nil:

e.free; 
e := nil; 

3) При выходе за границы динамического массива обычно генерится ошибка "Index out of bound", но возможно и возникновение Access Violation, особенно когда не стоят опции компилляции по проверки границ массивов. Эта ошибка может быть очень сложна в отлаживании - дело в том что допустим у вас есть массив а длиной в 10 элементов, в пишете:

a[20] := something; 

И эта строка может пройти как и надо, без всяких проблем, но её выполнение повредит какой-то другой код, причём каждый раз другой! Теперь самая безобидная операция типа i:=10 может вдруг внезапно дать Access Violation.

3) На форме на onCreate вызывается что-то с других форм - эти другие формы на этот момент еще не созданы

4) На форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования