Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
24-05-2008 19:51
arigato godzaimasu))) выпрямлю руки, научусь кодить и уеду в японию))
21-05-2008 22:59 | Комментарий к предыдущим ответам
>>> А Вы попробуйте получить sizeof(arraydbedit), наверное удивитесь, что это будет ВСЕГО 20 байт.
Вы удивитесь ещё больше, если я скажу, что на самом деле sizeof(arraydbedit) = 4, поскольку переменная типа "динамический массив" - это указатель... А 20 - это количество памяти, выделенной под элементы массива... Чтобы не запутаться с SizeOf, нужно помнить, что SizeOf вычисляется на этапе компиляции и никак не зависит от динамически распределённой памяти... Это размер типа, который указывается либо напрямую, как тип, либо косвенно, как тип указанной переменной...
Переменная типа "динамический массив" является указателем, и этот указатель ссылается на адрес, с которого начинаются элементы массива, т.е. на первый (с индексом 0) элемент массиваа. С отрицательным смещением от этого адреса, т.е. ещё до элементов массива, лежат ещё 2 Integer'а, в которых хранятся:
1. Количество ссылок
2. Количество элементов в массиве
Если размер массива устанавливается равным нулю, то память, выделенная под элементы массива и 8 байт до них, освобождаются, а указателю, который раньше сюда ссылался, присваивается nil, дабы никого не вводить в заблуждение...
Рассмотрим такой код:
var
Arr: array of TEdit; {1}
begin
SetLength(Arr, 5); {2}
После строчки {1} мы имеем только указатель Arr размером 4 байта, которому присвоено значение nil (это принципиально). Никакой другой памяти под массив не пока не выделено, о чём нам и сообщает nil...
После строчки {2} захватывается память под указанные 5 элементов массива плюс 8 байт до них. Проиллюстрируем это:
При этом Arr ссылается на элемент Arr[0]
Всё вышеизложенное можно продемонстрировать кодом:
procedure TForm1.Button1Click(Sender: TObject);
var
Arr: array of TEdit;
i: Integer;
begin
SetLength(Arr, 5);
for i:=0 to 4 do
Arr[i] := TEdit.Create(nil);
Переменная классового типа, независимо от того, будет ли это отдельная переменная или элемент массива, является только ссылкой на объект, который располагается в динамической памяти. И чтобы он там появился, необходимо вызвать конструктор Create, чего в вашем коде не наблюдается. Отсюда и ошибка - обращение по ссылке, которая указывает неизвестно куда.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.