Цитата:
Сообщение от bfrogg
Далее я инициализирую массив при открытии формы. N переходит из предыдущей формы и вводится пользователем.
Код:
procedure TForm2.FormCreate(Sender: TObject);
begin
i:= 0;
SetLength(pipe, Form1.n);
end;
|
Думаю ошибка здесь. FormCreate это событие
не "при открытии формы", а "при создании формы". Разница существенная. А понятия "при открытии формы" даже и не существует. Есть понятия "при создании/разрушении формы" и есть "при показе/скрытии формы". Т.е. если форма создана, но скрыта (невидима), а ты ей говоришь "Show" или "Visible:=True", то она появляется, но событие FormCreate не сработает (так как форма уже была создана), а значит и не проинициализируются переменные i и pipe.
Цитата:
Сообщение от bfrogg
Программа компилируется, но при попытке присвоить значение полю x,
вылезает ошибка "pipe[i].x = Inaccessible value"
Не получается даже просто присвоить полю какую либо константу.
|
Поставь точку останова в этом месте и в отладчике посмотри чему равно значение переменной i и сколько элементов у массива pipe.
Или добавь программную проверку. Например так:
Код:
procedure TForm2.btn1Click(Sender: TObject);
begin
if i <= Form1.n - 1
then
begin
Assert((i>=Low(pipe)) and (i<=High(pipe)),
'Вне диапазона! Количество элементов в массиве pipe равно '+
IntToStr(Length(pipe))+', а переменная i равна '+IntToStr(i));
pipe[i].x:= StrToInt(edit1.Text);
pipe[i].y:= StrToInt(edit2.Text);
....
p.s. Также можно ещё включить проверку на выход из диапазона (в опциях проекта или директивой {$R}). Но это я написал только для полноты картины, а включать эту опцию я не рекомендую.