Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

{ЧУДОВИЩНАЯ РАСТРАТА ПАМЯТИ - если вы действительно используете такие большие массивы и хэш-таблицы }

Mine[-100000] := {значение}

Mine[+100000] := {значение}

Если в вашем распоряжении находится «редкозаполненный» массив, использование хэш-таблицы дало бы существенный выигрыш. Я преобразую индексные значения в строки, а все остальное перепоручаю TStrings, но не из-за того, что я такой ленивый, а из-за того, что он сделает это лучше меня, мне нужно всего лишь осуществить преобразование в строки.

Для того, чтобы хранить все,

что вы хотите, вы можете использовать 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));

 for I := 1 to aList.Count do L := 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);

 with aRecPtr^ do begin

Name := 'Валентин';

Addr := 'неизвестен';

Comments := 'Автор Советов по Delphi';

Salary := 999000.00;

 end;

 aList.Add(aRecPtr);

 aList.Add(…);

 …

 for I := 1 to aList.Count do begin

aRecPtr := PMyRec(aList.Items[I-1]);

{что-то делаем с записью}

 end;

 {теперь избавляемся от всех записей и самого
списка-объекта}

 for I := 1 to aList.Count do Dispose(PMyRec(aList.Items[I-1]));

 aList.Free;

end;

Динамические массивы VIII

Иногда разработчик, работая с массивами, не знает какого размера массив ему нужен. Тогда Вам пригодится использование динамических массивов.

var intArray : array of integer;

При таком объявлении размер массива не указывается. Что бы использовать его дальше необходимо определить его размер (обратите внимание, что размер динамического массива можно устанавливать в программе):

begin

 intArray:=(New(IntArray,100); //Размер массива? 100

end;

Igor Nikolaev aKa The Sprite

Пример массива констант (Array of Const) III

Delphi 1

procedure foo(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 также позволяет использовать имена.

Определите тип, например, так:

TYPE NAME1 = Array[1..4,1..10] of Integer;

Затем, в вашей секции 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));

Массив объектов-изображений

Delphi 1

Вы не сможете сделать это напрямую и "визуально", но если вы не возражаете против нескольких строк кода, то я покажу как это может быть просто:

type

 TForm1 = class(TForm)

 …

 public

images: array [1..10] of TImage;

 end;

Поделиться с друзьями: