Програмування - це просто - Динамічні масиви в Delphi (масив, SetLength, TListBox)
Вихідник уроку можна завантажити тут.
Масив – це впорядкований набір даних. Як правило, кількість елементів масиву обмежена. Середовище Delphi використовує синтаксис мови Object Pascal, а відповідно до останнього, масиви оголошуються так:
| varMy_Array : array[index1..indexN]ofBaseType |
Де index1. indexN належать упорядкованому типу, діапазон якого, як написано в документації Delphi 6, не перевищує 2Gb. BaseType – це тип елементів масиву.
| varMy_Array : array[0..999] of double; |
ми оголосили масив, що складається з 1000 елементів типу double (числа з плаваючою точкою) з індексом від 0 до 999.
Масиви можуть бути одновимірні, двовимірні, тривимірні. N-мірні. Теоретично, обмеження на мірність немає. Насправді розмірність обмежує обсяг пам'яті.
Нині ми розглянули статистичні масиви. На відміну від динамічних, вони мають істотний недолік. У багатьох випадків ми не знаємо, з яких елементів буде складатися наш масив, а його розмір змінити в ході виконання програми неможливо. Тому доводиться резервувати пам'ять "про запас", що погодьтеся, не дуже раціонально.
Як приклад такого завдання – читання інформації з файлу. Ми не знаємо заздалегідь, скільки в ньому містяться елементи. Як вихід із положення замість масиву для зберігання завантажених даних можна використовувати динамічні списки, організовані за принципом LIFO (Last In First Out, стек) або FIFO (First In First Out, черга).
Розробники Delphi, у версіях починаючи з п'ятої, реалізували досить гнучкий механізм роботи з динамічними масивами.
| varMy_Array : масивзBaseType |
| SetLength(My_Array,LengthOfArray); |
де LengthOfArray - кількість елементів масиву.
| procedureTfrmDinamicArrayTest.btnCopyAndModifyClick(Sender: TObject);переміннаDM1, DM2:TIntegerArray; i: ціле;beginSetLength(DM1,5);fori:=Low(DM1)toHigh(DM1)doDM1[i]:=5; DM2:=DM1; DM1[2]:=3; ShowArray(DM1,lbArray1); ShowArray(DM2,lbArray2);кінець; |
procedureTfrmDinamicArrayTest.btnCopyAndResizeClick(Sender: TObject);переміннаDM1, DM2:TIntegerArray; i: ціле;beginSetLength(DM1,5); для i:=Low(DM1) до High(DM1) зробити DM1[i]:=5; DM2:=DM1; Установити довжину (DM2,7); DM1[2]:=3; ShowArray(DM1,lbArray1); ShowArray(DM2,lbArray2);кінець;
procedureTfrmDinamicArrayTest.ShowArray(A:TIntegerArray; L:TListBox);переміннаi:ціле;початиL.Clear;fori:=Low(A)toHigh(A)doL.Items.Add(IntToStr(A[i]));кінець;
При виконанні першої процедури ми бачимо такий результат: