Консультация № 140754
26.07.2008, 09:07
0.00 руб.
0 3 2
Здравствуйте.
В программе обьявлен массив (приложение №1).

По нажатию кнопки на главной форме вызываю модально окно (Форму 4).
На форме 4: есть ТEdit и TBitBtn.
При нажатии на кнопку пытаюсь передать массиву новое значение, увеличив перед этим его размер на 1. (приложение №2).

При клике вызывает ошибку Invalid Pointer Operation. Как с этим бороться? Форма обязательно должна вызываться модально.

Приложение:
№1 unit main; interface uses ******* var IniFile: TIniFile; FriendList: array of string[20]; {массив} Friend: Integer; {переменная в которой хранится его размерность} type TForm1 = class(TForm) MainMenu1: TMainMenu; ... _________________________________________________________ №2 procedure TForm4.BitBtn1Click(Sender: TObject); begin Friend := Friend + 1; SetLength(FriendList,Friend); FriendList[friend] := Edit1.Text; Form4.close; end;

Обсуждение

Неизвестный
26.07.2008, 10:00
общий
это ответ
Здравствуйте, Сарумян!
Ваша ошибка в том, что первоначальное значение Friend равно 1, размерность FriendList[] присваивается тоже 1. А индекс массива FriendList[] начинается с нуля.
Поэтому нужно писать так: FriendList[friend-1] := Edit1.Text;

Удачи!
Неизвестный
26.07.2008, 12:17
общий
это ответ
Здравствуйте, Сарумян!

Я бы вам предложил несколько улучшений:
1. Для работы со строками лучше использовать TStringList.
2. Pascal это не Си и размер массива хранить не обязательно, его всегда можно получить используя функцию Length.

Например, вашу функцию можно избавить от лишней переменной таким образом:

Приложение:
procedure TForm4.BitBtn1Click(Sender: TObject);
begin
SetLength(FriendList, Length(FriendList) + 1);
FriendList[Length(FriendList) - 1] := Edit1.Text;
Form4.close;
end;

давно
Мастер-Эксперт
425
4118
28.07.2008, 14:06
общий
Сарумян

1. Вам эксперт Antony Belov дал очень полезный совет, попытаться использовать в своей программе TStringList вместо динамического массива. Единственная его проблема, что он не обосновал свой совет. Но поверьте, если бы Вы использовали вместо динамического массива TStringList, то Вашей ошибки не возникло бы в принципе.
2. "...по-этому узнавать каждый раз размер массива не уместно, т.к. будет тратится существенное кол-во системных ресурсов..."
К сожалению, смотря на Ваш код, вот это самое отнюдь не явствует с непреклонной определённостью, поэтому сия претензия в адрес эксперта притянута за уши.

Давайте всё-таки высказываться по сути, а не исходя из предположения, что все эксперты без исключения полностью в курсе того, что Вы написали в своём коде.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа