Для того, чтобы хранить все, что вы хотите, вы можете использовать TList (или TStringList.Objects)! TList.Items хранят указатели на объекты или записи, но они ничего не могут сделать с ними, поэтому вы можете привести их к типу longint, и больше о них не беспокоиться! Вот пример хранения в TList списка целых:
var
aList: TList;
I : Integer;
L : Longint;
begin
aList := TList.Create;
L := 93823;
aList.Add(Pointer(L));
aList.Add(Pointer(83293));
forI := 1 toaList.Count doL := L + Longint(aList.Items[I-1]);
aList.Free;
end;
В TList и TStringList вы можете иметь до 16380 элементов. А теперь обещанный пример того, как можно хранить в TList записи (или объекты), вернее, указатели на них:
type
PMyRec = TMyRec;
TMyRec = record
Name: string[40];
Addr : string[25];
Comments: string;
salary: Double;
end;
var
aList: TList;
aRecPtr: PMyRec;
I : Integer;
begin
aList := TList.Create;
New(aRecPtr);
withaRecPtr^ do begin
Name := 'Валентин';
Addr := 'неизвестен';
Comments := 'Автор Советов по Delphi';
Salary := 999000.00;
end;
aList.Add(aRecPtr);
aList.Add(…);
…
forI := 1 toaList.Count do begin
aRecPtr := PMyRec(aList.Items[I-1]);
{что-то делаем с записью}
end;
{теперь избавляемся от всех записей и самого списка-объекта}
forI := 1 toaList.Count doDispose(PMyRec(aList.Items[I-1]));
aList.Free;
end;
Динамические массивы VIII
Иногда разработчик, работая с массивами, не знает какого размера массив ему нужен. Тогда Вам пригодится использование динамических массивов.
var intArray : array ofinteger;
При таком объявлении размер массива не указывается. Что бы использовать его дальше необходимо определить его размер (обратите внимание, что размер динамического массива можно устанавливать в программе):
begin
intArray:=(New(IntArray,100); //Размер массива? 100
end;
Igor Nikolaev aKa The Sprite
Пример массива констант (Array of Const) III
procedurefoo(a : array of const);
implementation
var
var1: longint;
var2: pointer;
var3: integer;
begin
var1 := 12345678;
var2 := @var1;
var3 := 1234;
foo([var1, var2, var3]);
В действительности, массив array of const более корректным было бы назвать массивом array of tvariant. Tvariant — множественный выбор типов переменной, в которой можно задать номер типа. В Visual Basic у него имеется наследник. Delphi также позволяет использовать имена.
Определите тип, например, так:
TYPENAME1 = Array[1..4,1..10] ofInteger;
Затем, в вашей секции CONST:
NAME2: NAME1 = ((1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10));
Массив объектов-изображений
Вы не сможете сделать это напрямую и "визуально", но если вы не возражаете против нескольких строк кода, то я покажу как это может быть просто:
type
TForm1 = class(TForm)
…
public
images: array[1..10] ofTImage;
…
end;
procedureTForm1.FormCreate(…);
vari: integer;
begin
…
fori := 1 to10 do begin
images[i] := TImage.Create(self);
withimages[i] do begin
parent := self;
tag := i; { это облегчит идентификацию изображения }
… установите другие необходимые свойства, например:
OnClick := MyClickEventHndlr;
end;
end;
…
end;
Для того, чтобы убедиться, что все модули в секции «uses» установлены правильно, бросьте на форму один такой динамический компонент, и затем удалите его, или установите его видимость в False. Более сложный способ заключается в разработке собственного компонента, делающего описанное выше.
Constptarr : Array[0..4] OfTPoint =((x:0; y:4), … (x:4; y:4));
Создание больших массивов
В 16-битной версии Delphi нельзя сделать это непосредственно. В новой, 32-битной версии, это как-то можно сделать, но за два месяца колупания я так и не понял как. (Некоторые бета-тестеры знают как. Не могли бы они сообщить нам всю подноготную этого дела?)
Читать дальше