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"
Я знаю, все делают опечатки. Это противно.
Мне потребовалось некоторое время, чтобы это выяснить. Надеюсь, это описание поможет другим.