Delphi: унаследованное Create дает нарушение доступа

Я сделал приложение, которое открывает несколько других форм для обработки задач. Все формы работают нормально, кроме одной. Я использую один и тот же код для всех форм. Это как:

FormTypeA := TFormTypeA.Create(Application);

В конструкторе Create я добавил код для инициализации формы. Он содержит такие строки, как:

constructor TFormTypeA.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  more code ...
end;

В строке "Унаследованный Create(AOwner);" Я получаю нарушение прав доступа: "Проект ThisApplication.exe вызвал класс исключения $C0000005 с сообщением 'c0000005 ACCESS_VIOLATION'

Я просто не знаю, где искать в моем коде, чтобы решить эту проблему. Как я уже писал, другие формы используют ту же структуру и работают нормально.

Любое предложение было бы очень кстати.

1 ответ

ОК. Это то, что случилось.

При разработке этой конкретной формы я использую несколько TGridPanel. Эти панели состоят из столбцов и строк. Ячейки, которые создаются этой сеткой, могут быть заполнены VCL-объектами. Как только вы поместите эти объекты в форму, вы должны нарисовать их в желаемой GridPanel. После этого вам необходимо указать правильную ячейку, введя нужную строку и столбец в инспекторе объектов.

Все идет нормально.

Как только вы решите изменить положение ячеек какого-либо объекта, такой способ работы становится менее структурированным. Объекты перемещаются в следующую позицию, но это не всегда бесплатно, поэтому они тоже перемещаются, и вскоре все становится беспорядочно.

Чтобы этого не произошло, вы можете работать в текстовой версии формы. Как? Щелкните правой кнопкой мыши форму и выберите "Просмотр как текст". Идите в нужное место и внесите исправления. Когда вы закончите, щелкните еще раз правой кнопкой мыши и выберите "Просмотреть как форму".

Есть риск такой работы, и это: Опечатки

Многие будут пойманы компилятором, но не этот:

ControlCollection = <
  item
    Column = 0
    Control = SomeControlA
    Row = 0
  end
  item
    Column = -1  <------ Fatal!
    Row = 0
  end
  item
    Column = 0
    Control = SomeControlB
  end
end>

Фатальная строка - это отрицательное значение столбца (или строки). Это очевидно. Нет отрицательного номера столбца. Вот что происходит, когда вы пишете код.

Если вы вернетесь к форме, вы не получите ни ошибки, ни предупреждения. При компиляции? Тишина. Но бег? "исключение класса $C0000005 с сообщением" c0000005 ACCESS_VIOLATION"

Я знаю, все делают опечатки. Это противно.

Мне потребовалось некоторое время, чтобы это выяснить. Надеюсь, это описание поможет другим.

Другие вопросы по тегам