Иллюстрированный самоучитель по Tirbo Pascal



Использование коллекций - часть 2


Procedure TInterior.ReadFile;

var

.....

begin

PS := New(PStringCollection, Init(100,10)); 

s := copy(ParamStr(0),1,pos('.',ParamStr(0)))+'pas'; 

assign(f,s);

reset (f); {Открыть файл с текстом программы} 

while not (EOF(f) or LowMemory) do 

begin

ReadLn(f,s);

if s <> ' ' then PS.Insert(NewStr(s)) 

end;

Close(f); 

exit;

Seek(DataFile,0);

while not (EOF(DataFile) or 

LowMemory) do 

begin

Read(DataFile, data); 

with data do 

begin

end;

if s<>''then PS.Insert(NewStr(s)) 

end; 

end; {ReadFile}

В приведенном фрагменте мы предусмотрительно изменили только ту часть программы, которая стоит после оператора Exit и которая зависит от удаленных глобальных определений. Вы должны сделать эти изменения (они все равно нам пригодятся) или закомментировать эту часть текста, чтобы получить синтаксически правильный вариант программы.

С помощью оператора

PS := New(PStringCollection, Init(100,10));

инициируется экземпляр коллекции, причем параметр 100 определяет начальный размер коллекции, а параметр 10 - шаг наращивания коллекции, если ее размер превысит 100 элементов. Оператор

if s<> ' ' then PS.Insert(NewStr(s))

вставляет очередную непустую строку в коллекцию. Заметим, что коллекции РЗЛ передается не строка 5, а лишь указатель на нее, т.к. функция NewStr размещает строку в куче и возвращает ее адрес. Функция NewStr не может разместить в куче пустую строку, поэтому мы вставляем в коллекцию только непустые строки.

Функция LowMemory используется для контроля за размерами динамической памяти: она возвращает значение True, если в куче осталось менее 4 Кбайт.

В последний оператор метода Interior.Init внесите следующее изменение:

Constructor TInterior.Init(var Bounds: TRect; HS,VS: PScrollBar);

begin

SetLimit(LLine,PSA.Count) 

end; {TInterior.Init}

Другим станет также и реализация метода TInterior.Draw:

Procedure TInterior.Draw; 

var

n,k: Integer; 

B: TDrawBuffer; 




Содержание  Назад  Вперед