
- •ЛР 1. Операторы и выражения Delphi
- •Оператор присваивания
- •Арифметические операторы
- •Оператор конкатенации строк
- •Логические операторы
- •Операторы поразрядного сдвига
- •Операторы отношения
- •Операторы множеств
- •Составной оператор begin..end
- •Условный оператор if..then..else
- •Оператор-селектор case
- •Оператор перехода goto
- •Оператор with..do
- •Организация циклов
- •Цикл с параметром for..do
- •Инструкция in в цикле for..do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Вложенные циклы
- •Операторы break и continue
- •ЗАДАНИЕ
- •Вариант 1.
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 2. Структурные типы
- •Множества
- •Записи
- •Вариантные поля
- •Усовершенствованная запись
- •Массивы
- •Объявление массива
- •Обращение к ячейкам массива
- •Динамический массив
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 3. Объекты и классы
- •Проектирование класса
- •Управление жизненным циклом объекта
- •Опережающее объявление класса
- •Ограничение видимости членов класса
- •Свойства объекта
- •Особенности объявления методов
- •Поля класса и методы класса
- •Иерархия наследования
- •Полиморфизм
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •ЛР4. Опорные классы VCL
- •Класс TObject
- •Класс TPersistent
- •Основа компонента, класс TComponent
- •Владение компонентом
- •Класс TControl
- •Принадлежность к родительскому контейнеру
- •Размещение и размеры элемента управления
- •События, связанные с изменением размеров
- •Выравнивание элемента управления в контейнере
- •Видимость и активность элемента управления
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант5
- •Совет
- •ЛР5. Обработка клавиатурных событий и событий мышки
- •Щелчки кнопками мыши
- •Перемещение указателя мыши
- •Вращение колесика мыши
- •Операция перетаскивания drag and drop
- •Обработка событий клавиатуры
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •ЛР 6. Классы потоков данных
- •Прототип потоков данных, класс TStream
- •Потоки с дескриптором, класс THandleStream
- •Файловый поток данных, класс TFileStream
- •Пример работы с файловым потоком данных
- •Задание
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.

Языки программирования
Прототип потоков данных, класс TStream
Абстрактный класс TStream описан в модуле Classes. Он определяет концепцию построения всех своих наследников и определяет общие для всех принципы чтения и записи в поток данных.
Класс вооружен всего парой свойств:
property Size: : Int64; property Position : Int64;
Размер потока данных Size измеряется в байтах. Попытка редактировать значение свойства в родительском классе не даст никаких результатов, но такая возможность реализована в некоторых потомках TStream. Свойство Position возвращает текущую позицию курсора внутри потока во время операций чтения или записи.
За изменение позиции курсора внутри потока отвечает метод function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
Здесь параметр Offset определяет новую позицию внутри потока, а параметр Origin уточняет правила определения позиции.
type TSeekOrigin = (soBeginning, //отступ Offset байт от начала потока soCurrent, //сместиться на Offset от текущего положения soEnd); //отступ (Offset<=0) байт от конца потока
Для чтения данных из потока объявлен метод
function Read(var Buffer; Count: Longint): Longint;
Процесс записи поддерживает функция
function Write(const Buffer; Count: Longint): Longint;
Методы Read() и Write() низкоуровневые, поэтому для осуществления операций ввода/вывода я рекомендую обращаться к более совершенным процедурам:
procedure ReadBuffer(var Buffer; Count: Longint); procedure WriteBuffer(const Buffer; Count: Longint);
Данные процедуры представляют собой надстройки над методами Read() и Write(), их ключевая особенность в том, что при невозможности считать/записать указанное в аргументе Count число байтов немедленно генерируется исключительная ситуация: EReadError или EWriteError. Благодаря этому разработчик получает возможность контролировать корректность поведения своей программы.
Для копирования данных в поток из другого потока предназначен метод function CopyFrom(Source: TStream; Count: Longint): Longint;
Здесь Source — поток-источник, а Count — число копируемых байтов. При необходимости полностью скопировать поток в параметр Count передается аргумент 0. Функция возвращает размер скопированного потока. Так как для выполнения операции задействуются методы ReadBuffer() и WriteBuffer() во
59
СКФУ Кафедра компьютерной безопасности