Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

else

if (Capacity < 64) then

NewCapacity := Capacity +16

{Ссли тСкущая Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ массива 64 ΠΈΠ»ΠΈ большС, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° 25%}

else

NewCapacity := Capacity + (Capacity div 4);

{ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π·Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ индСкс массива}

if (NewCapacity > FMaxElemCount) then begin

NewCapacity := FMaxElemCount;

if (NewCapacity = Capacity) then

rlError (tdeAtMaxCapacity, 'rlExpand', 0);

end;

{ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ}

Capacity := NewCapacity;

end;


procedure TtdRecordList.rlSetCapacity(aCapacity : integer);

begin

if (aCapacity <> FCapacity) then begin

{Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Ρ‡Π΅Ρ€Π΅Π· максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ количСство элСмСнтов}

if (aCapacity > FMaxElemCount) then

rlError(tdeCapacityTooLarge, 'rlSetCapacity', 0);

{ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ссли Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ массива ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π° Π΄ΠΎ нуля}

{$IFDEF Delphi1}

if (aCapacity= 0) than begin

FreeMem(FArray, word(FCapacity) * FElementSize);

FArray := nil

end

else begin

if (FCapacity = 0) then

GetMem( FArray, word (aCapacity) * FElementSize) else

FArray := ReallocMem(FArray,

word(FCapacity) * FElementSize,

word(aCapacity) * FElementSize);

end;

{$ELSE}

ReallocMem(FArray, aCapacity * FElementSize);

{$ENDIF}

{Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ? Ссли Π΄Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ счСтчик}

if (aCapacity < FCapacity) then begin

if (Count > aCapacity) then

Count := aCapacity;

end;

{ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ}

FCapacity := aCapacity;

end

end;


ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, любой класс массива оказался Π±Ρ‹ бСсполСзным, Ссли Π±Ρ‹ Π±Ρ‹Π»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт ΠΈΠ· массива. Π’ классС TtdRecordList для этой Ρ†Π΅Π»ΠΈ имССтся свойство Items. ЕдинствСнным срСдством доступа для этого свойства являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ считывания rlGetItem. Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ копирования Π΄Π°Π½Π½Ρ‹Ρ… Π² элСмСнт, ΠΌΠ΅Ρ‚ΠΎΠ΄ rlGetItem Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° элСмСнт массива. Π­Ρ‚ΠΎ позволяСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ элСмСнт. ИмСнно поэтому для свойства Items Π½Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° записи. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ свойство ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом default, доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтам ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π° MyArray[i], Π° Π½Π΅ MyArray.Items[i].

Листинг 2.8. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ элСмСнту массива


function TtdRecordList.rlGetItem(aIndex : integer): pointer;

begin

if (aIndex < 0) or (aIndex >= Count) then

rlError(tdeIndexOutOfBounds, 'rlGetItem', aIndex);

Result := pointer(FArray + (aIndex * FElementSize));

end;


И послСдний ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ сСйчас рассмотрим, - это ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для установки свойства Count - rlSetCount. Установка свойства Count позволяСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для элСмСнтов массива ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Delphi Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со стандартными массивами. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Insert ΠΈ Delete Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Count ΠΏΡ€ΠΈ вставкС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ элСмСнтов. Установка свойства Count явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ установку свойства Capacity (ΠΌΠ΅Ρ‚ΠΎΠ΄ Insert Π΄Π΅Π»Π°Π΅Ρ‚ это автоматичСски). Если Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Count большС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, значСния всСх Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС элСмСнты, индСксы ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ Π½ΠΎΠ²ΠΎΠΌΡƒ количСству элСмСнтов, станут нСдоступными (фактичСски ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌΠΈ).

Листинг 2.9. Установка количСства элСмСнтов Π² массивС


procedure TtdRecordList.rlSetCount(aCount : integer);

begin

if (aCount <> FCount) then begin

{Ссли Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ количСства элСмСнтов Π² массивС большС Смкости массива, Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ массив}

if (aCount > Capacity) then

Capacity := aCount;

{Ссли Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ количСства элСмСнтов Π² массивС большС старого значСния, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π½ΡƒΠ»ΡŽ}

if (aCount > FCount) then

FillChar((FArray + (FCount * FElementSize))^, (aCount - FCount) * FElementSize, 0);

{ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика элСмСнтов}

FCount := aCount;

end;

end;


ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ класса TtdRecordList ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². ПослС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΎΡ‚Ρ‹Ρ‰ΠΈΡ‚Π΅ срСди Π½ΠΈΡ… Ρ„Π°ΠΉΠ» TDRecLst.pas. Π’ Ρ„Π°ΠΉΠ»Π΅ находятся Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… стандартных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠ°ΠΊ First, Last, Move ΠΈ Exchange.

НовыС динамичСскиС массивы

Π’ Delphi 4 компания Borland Π²Π²Π΅Π»Π° динамичСскиС массивы - Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ языка, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массивы, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π° этапС программирования Π½Π΅ извСстСн. Код, вносимый компилятором Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ‚ΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строк. Как ΠΈ для строк, Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ SetLength. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, динамичСскиС массивы Π²Π΅Π΄ΡƒΡ‚ счСтчики ссылок. И Π΄Π°ΠΆΠ΅ большС, функция Copy ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части массива. Как ΠΈ для стандартных статичСских массивов, доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтам осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ [].

Π’ настоящСй ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ динамичСскиС массивы. Π˜Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² вСрсиях, начиная с Delphi 4 ΠΈ Kylix. И, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ прСдоставляСт класс TtdRecordList. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ большС ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ динамичСских массивах, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ своСй вСрсии Delphi.

Класс TList, массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

Π‘ самой ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии Π² Delphi сущСствовал Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ стандартный массив -класс TList. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ всСх Ρ€Π°Π½Π΅Π΅ Π½Π°ΠΌΠΈ рассмотрСнных массивов, TList прСдставляСт собой массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ класса TList

Класс TList Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ массива. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ. Они ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° записи, строки ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Класс ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для вставки ΠΈ удалСния элСмСнтов, поиска элСмСнта Π² спискС, пСрСстановки элСмСнтов ΠΈ, Π² послСдних вСрсиях компилятора, для сортировки элСмСнтов Π² спискС. Как ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ массив, TList ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ [ ]. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ свойство Items являСтся свойством ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ для получСния доступа ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ с индСксом i вмСсто MyList.Item[i] ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ MyList[i]. Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ Π² классС TList всСгда начинаСтся с 0.

НСсмотря Π½Π° Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ класса TList, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ Π΅Π³ΠΎ использовании Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Одна ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ встрСчаСтся ΠΎΡ‡Π΅Π½ΡŒ часто: ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ экзСмпляра TList ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная ΠΏΠΎΠ΄ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² Π½Π΅ΠΌ элСмСнты, Π½Π΅ освобоТдаСтся. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ это Π΄Π°ΠΆΠ΅ прСимущСство, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ TList Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освободит ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ Π΅Π³ΠΎ элСмСнтами. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ элСмСнт ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² нСсколько списков, Π½Π΅ боясь, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ ΠΏΠΎ ошибкС. К соТалСнию, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты склонны ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ TList Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ любой ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ„ΠΎΡ€ΠΌΡ‹ (Ρ‚.Π΅. ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ всС Π΅Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹). Но Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ TList это Π½Π΅ Ρ‚Π°ΠΊ, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ списка ΡƒΠ΄Π°Π»ΡΠ»ΠΈΡΡŒ ΠΈ всС Π΅Π³ΠΎ элСмСнты.

Однако сущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° трудноуловимая ошибка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΡ‡Π΅Π½ΡŒ часто ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ написании ΠΊΠΎΠ΄Π° удалСния всСх элСмСнтов ΠΈΠ· списка. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΊΠΎΠ΄ удалСния выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


for i := 0 to pred(MyList.Count) do begin

if SomeConditionApplies(i) then begin

TObject(MyList[i]).Free;

MyList.Delete(i);

end;

end;


Π³Π΄Π΅ ScmeConditionApplies - нСкоторая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Π°Ρ функция, которая опрСдСляСт, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ элСмСнт с индСксом i.

ВсС ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ. ИмСнно Π² этом-Ρ‚ΠΎ ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ошибка. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² массивС находится Ρ‚Ρ€ΠΈ элСмСнта. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΊΠΎΠ΄ Π² Ρ†ΠΈΠΊΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°: для индСксов 0, 1 ΠΈ 2. ΠŸΡƒΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° условиС выполняСтся. ΠŸΡ€ΠΈ этом освобоТдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с индСксом 0, Π° Π·Π°Ρ‚Π΅ΠΌ элСмСнт с индСксом 0 удаляСтся ΠΈΠ· списка. ПослС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ выполнСния Ρ†ΠΈΠΊΠ»Π° Π² спискС остаСтся Π΄Π²Π° элСмСнта, Π½ΠΎ ΠΈΡ… индСксы Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ 0 ΠΈ 1, Π° Π½Π΅ 1 ΠΈ 2. ΠŸΡ€ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°, ΠΏΡ€ΠΈ соблюдСнии условия, освобоТдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с индСксом 1 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ссли Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Π±Ρ‹Π» ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ элСмСнтом с индСксом 2), послС Ρ‡Π΅Π³ΠΎ удаляСтся элСмСнт с индСксом 1. ПослС этого Π² спискС остаСтся всСго ΠΎΠ΄ΠΈΠ½ элСмСнт. И Π΅Π³ΠΎ индСкс 0. ΠŸΡ€ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΊΠΎΠ΄ пытаСтся ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, индСкс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ 2, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ "list index out of bounds".

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ Π½Π°Ρ‡Π°Π» ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты с ΠΊΠΎΠ½Ρ†Π° списка. Π’Π°ΠΊ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки.

Для освобоТдСния всСх элСмСнтов списка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Π° Π½Π΅ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Delete для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта:


for i := 0 to pred(MyList.Count) do

TObject(MyList[i]).Free;

end;


Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ использовании класса TList являСтся созданиС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ TList ΡΠ²Π»ΡΡŽΡ‚ΡΡ статичСскими, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ доступны, ΠΈ Ρ‚.Π΄. МоТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠΎΠ²Π΅Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ классы ΠΎΡ‚ TList.TList - это Π½Π΅ Ρ‚ΠΎΡ‚ класс, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы. Он Π±Ρ‹Π» создан Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΌ, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, TString. ΠŸΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ класс TList. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π° Π½Π΅ наслСдованиС.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ написании ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π° Π°Π²Ρ‚ΠΎΡ€ ΠΊΠ½ΠΈΠ³ΠΈ Π½Π΅ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ компания Borland сдСлала с классом TList Π² вСрсии Delphi 5. Π’ Delphi 5 ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ нСпостиТимым ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ класса TList с Ρ†Π΅Π»ΡŒΡŽ обСспСчСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса - TObjectList.TObjectList ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для хранСния экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Он находится Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Contnrs, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.