Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к ПиОА (теория).doc
Скачиваний:
97
Добавлен:
28.10.2018
Размер:
9.91 Mб
Скачать

Общие свойства:

  • Position: Longint — текущая позиция чтения-записи.

  • Size: Longint — текущий размер потока в байтах.

Общие методы:

  • CopyFrom(Source: TStream; Count: Longint): Longint — копирует Count байт из потока Source в свой поток.

  • Read(var Buffer; Count: Longint): Longint — читает Count байт из потока в буфер Buffer, продвигает текущую позицию на Count байт вперед и возвращает число прочитанных байт. Если значение функции меньше значения Count, то в результате чтения был достигнут конец потока.

  • ReadBuffer(var Buffer; Count: Longint) — читает из потока Count байт в буфер Buffer и продвигает текущую позицию на Count байт вперед. Если выполняется попытка чтения за концом потока, то генерируется ошибка.

  • Seek(Offset: Longint; Origin: Word): Longint — продвигает текущую позицию в потоке на Offset байт относительно позиции, заданной параметром Origin. Параметр Origin может иметь одно из следующих значений: 0 — смещение задается относительно начала потока; 1 — смещение задается относительно текущей позиции в потоке; 2 — смещение задается относительно конца потока.

  • Write(const Buffer; Count: Longint): Longint — записывает в поток Count байт из буфера Buffer, продвигает текущую позицию на Count байт вперед и возвращает реально записанное количество байт. Если значение функции отличается от значения Count, то при записи была ошибка.

  • WriteBuffer(const Buffer; Count: Longint) — записывает в поток Count байт из буфера Buffer и продвигает текущую позицию на Count байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка.

Ниже приводится фрагмент программы, демонстрирующий создание файлового потока и запись в него строки:

var

Stream: TStream;

S: AnsiString;

StrLen: Integer;

begin

// Создание файлового потока

Stream := TFileStream.Create('Sample.Dat', fmCreate);

...

// Запись в поток некоторой строки

StrLen := Length(S) * SizeOf(Char);

Stream.Write(StrLen, SizeOf(Integer)); // запись длины строки

Stream.Write(S, StrLen); // запись символов строки

...

// Закрытие потока

Stream.Free;

end;

36. Обрабока исключительных ситуаций

4.3.1. Создание исключительной ситуации

Идея обработки исключительных ситуаций состоит в следующем. Когда подпрограмма сталкивается с невозможностью выполнения последующих действий, она создает объект с описанием ошибки и прерывает нормальный ход своей работы с помощью оператора raise. Так возникает исключительная ситуация.

raise EOutOfMemory.Create('Маловато памяти');

Данный оператор создает объект класса EOutOfMemory (класс ошибок исчерпания памяти) и прерывает нормальное выполнение программы. Вызывающие подпрограммы могут эту исключительную ситуацию перехватить и обработать. Для этого в них организуется так называемый защищенный блок:

try

// защищаемые от ошибок операторы

except

// операторы обработки исключительной ситуации

end;

Между словами try и except помещаются защищаемые от ошибок операторы. Если при выполнении любого из этих операторов возникает исключительная ситуация, то управление передается операторам между словами except и end, образующим блок обработки исключительных ситуаций. При нормальном (безошибочном) выполнении программы блок except...end пропускается (рисунок 4.1).

Рисунок 4.1. Логика работы оператора try…except…end

При написании программы вы можете использовать вложенные защищенные блоки, чтобы организовать локальную и глобальную обработку исключительных ситуаций. Концептуально это выглядит следующим образом:

try

// защищаемые операторы

try

// защищаемые операторы

except

// локальная обработка исключительных ситуаций

end;

// защищаемые операторы

except

// глобальная обработка исключительных ситуаций

end;

Исключительные ситуации внешнего защищенного блока, возникающие за пределами вложенного блока, обрабатываются внешней секцией except...end. Исключительные ситуации вложенного защищенного блока обрабатываются вложенной секцией except...end.