Показать сообщение отдельно
  #2  
Старый 09.10.2012, 03:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от 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}). Но это я написал только для полноты картины, а включать эту опцию я не рекомендую.
Ответить с цитированием