![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Здравствуйте, помогите понять в чем проблема.
Создаю динамический массив из записей вида Код:
type TPipe = record x, y: integer; concentration: real; end; Объявляю его в var Код:
var Form2: TForm2; i: integer; pipe: array of Tpipe; Далее я инициализирую массив при открытии формы. N переходит из предыдущей формы и вводится пользователем. Код:
procedure TForm2.FormCreate(Sender: TObject); begin i:= 0; SetLength(pipe, Form1.n); end; Хочу сделать, чтобы при нажатии на кнопку поля x и y i-того элемента массива заполнялись значениями из edit1 и edit2. Код:
procedure TForm2.btn1Click(Sender: TObject); begin if i <= Form1.n - 1 then begin pipe[i].x:= StrToInt(edit1.Text); pipe[i].y:= StrToInt(edit2.Text); i:= i + 1; end else begin Form3.Show; Form2.Hide; end; end; Программа компилируется, но при попытке присвоить значение полю x, вылезает ошибка "pipe[i].x = Inaccessible value" Не получается даже просто присвоить полю какую либо константу. |
#2
|
||||
|
||||
![]() Цитата:
Цитата:
Или добавь программную проверку. Например так: Код:
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}). Но это я написал только для полноты картины, а включать эту опцию я не рекомендую. |
#3
|
||||
|
||||
![]() Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
||||
|
||||
![]() Цитата:
Смысл событий OnActivate/OnDeactivate у формы заключается только в том, что форма активировалась или деактивировалась, ни какого отношения к открытию и закрытию эти события не имееют. Если у приложения есть формы, то одна и только одна из этих форм должна быть активной. Какая форма активна в данный момент можно узнать из свойства Screen.ActiveForm. К примеру если у приложения открыто на экране 10 форм, то одна из них обязательно будет активной. Если кликнуть по любой неактивной форме, то в активной форме произойдёт событие OnDeactivate, а у той по которой кликнули произойдёт событие OnActivate. Т.е. эти события означали просто, что одна форма деактивировалась в то время как другая активировалась. Вот и всё, никаких открытий/закрытий форм при этом не происходило. |
#5
|
|||
|
|||
![]() Большое спасибо за ответ!
Проблема действительно в этом. Когда я провожу инициализацию при нажатии на кнопку все работает. Но как сделать, чтобы инициализация проходила без участия пользователя? Кроме обработки события OnCreate, я не знаю как делать. Проблема решена: инициализирую массив в первой форме, нажатием на кнопку)) Последний раз редактировалось bfrogg, 10.10.2012 в 22:46. |
#6
|
||||
|
||||
![]() Еще можно при создании формы создать одноразовый таймер, который инициализирует все, что надо, как только форма будет создана. Главное не забыть подтереть за собой его. Самый простой способ для решения задач подобного класса, хоть и не самый красивый.
00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |