Программирование - это просто
Advertisement
Главная arrow Статьи arrow Статьи по Delphi arrow Динамические массивы в Delphi (array, SetLength, TListBox)
06.10.2022 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Динамические массивы в Delphi (array, SetLength, TListBox) Печать E-mail
Автор megabax   
28.08.2009 г.
Массив

Динамические массивы в Delphi (array, SetLength, TListBox)

Исходник урока можно скачать здесь.

Массив - это упорядоченный набор данных. Как правило, количество элементов массива ограничено. Среда Delphi использует синтаксис языка Object Pascal, а согласно последнему, массивы объявляются так:

var My_Array : array[index1..indexN] of BaseType
 

Где index1...indexN принадлежат упорядоченному типу, диапазон которого, как написано в документации по Delphi 6, не превышает 2Gb. BaseType - это тип элементов массива.

Пример:

var My_Array : array[0..999] of double;

мы объявили массив, состоящий из 1000 элементов типа double (числа с плавающей точкой), с индексом от 0 до 999.

Массивы могут быть одномерные, двухмерных, трехмерные. N-мерные. Теоретически, ограничения на мерность нет. На практике размерность ограничивает объем памяти.

Сейчас мы рассмотрели статистические массивы. В отличии от динамических, у них есть существенный недостаток. Во многих случаев мы не знаем, из скольких элементов будет состоять наш массив, а его размер изменить в ходе выполнения программы невозможно. По этому приходиться резервировать память "про запас", что согласитесь, не очень рационально.

Как пример такой задачи - чтение информации из файла. Мы не знаем заранее, сколько в нем содержаться элементов. Как выход из положения, вместо массива для хранения загруженных данных можно использовать динамические списки, организованные по принципу LIFO (Last In First Out, стек) или FIFO (First In First Out, очередь).

Разработчики Delphi, в версиях начиная с пятой, реализовали достаточно гибкий механизм работы с динамическими массивами.

Для их объявления используется синтаксис

var My_Array : array of BaseType

При таком объявлении память не выделятся, и первоначальный размер массива - нулевой. Для установки длины массива

SetLength(My_Array,LengthOfArray);

где LengthOfArray - количество элементов массива.

У динамических массивов есть интересное свойство. Если сделать присвоить переменной массив, то его содержимое не копируется, присваивается только указатель на массив. А вот если применить к новому массиву SetLength, то тогда и произойдет копирование. Рассмотрим все это на примере:

procedure TfrmDinamicArrayTest.btnCopyAndModifyClick(Sender: TObject);
var DM1, DM2:TIntegerArray; i:integer;
begin
    SetLength(DM1,5);
    for i:=Low(DM1) to High(DM1) do DM1[i]:=5;
    DM2:=DM1;
    DM1[2]:=3;
    ShowArray(DM1,lbArray1);
    ShowArray(DM2,lbArray2);
end;


procedure TfrmDinamicArrayTest.btnCopyAndResizeClick(Sender: TObject);
var DM1, DM2:TIntegerArray; i:integer;
begin
     SetLength(DM1,5);
     for i:=Low(DM1) to High(DM1) do DM1[i]:=5;
     DM2:=DM1;
     SetLength(DM2,7);
     DM1[2]:=3;
     ShowArray(DM1,lbArray1);
     ShowArray(DM2,lbArray2);
end;


procedure TfrmDinamicArrayTest.ShowArray(A:TIntegerArray; L:TListBox);
var i:integer;
begin
     L.Clear;
     for i:=Low(A) to High(A) do L.Items.Add(IntToStr(A[i]));
end;

При выполнении перовой процедуры мы увидим такой результат:

Динамические массивы в Delphi (array, SetLength, TListBox)

а при выполнении второй вот такой:

Динамические массивы в Delphi (array, SetLength, TListBox)

Последнее обновление ( 18.02.2013 г. )
 
« След.
 
© 2022 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги