Vadim писал(а): В данном случае к переменной просто нет доступа - она не существует.
Тут ты не прав. Так как это экземпляр объекта (object) а не класса (class). И он объявлен статически. Т.е. место под все переменные уже выделено в стеке. Если бы его объявляли через указатель и делали динамическим - то тогда оно было бы в куче.
Ошибка возникает же в методе
SetLength из-за того, что переменная динамического массива - это фактически указатель (pointer). Процедура SetLength проверяет что указатель, переданный ей не пустой (а он будет не пустым, так как в стеке, отведённом под переменные, мусор - никто его нулями не забивал) и считает что уже массив какойто был объявлен - надо просто прозвести изменение его размера. Но на самом то деле массива не существует, и из-за мусора в стеке, наш указатель указывает вовсе не туда - получаем ошибку обращения к памяти.
Но если мы перед вызовом SetLength сделаем Initialize() или хотябы V=nil - то этим самым мы обнулим указатель - и всё становится на свои места.
Но, ещё раз повторю, тут правильно и проще обеспечить вызов коснтруктора TObject.Init (прямо или косвенно через наследование). Именно он обеспечивает обнуление всех пермененных, объявленных в вашем объекте.