Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
61-66.doc
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
59.39 Кб
Скачать

64) Разработка собственных компонентов.

1. Определить ближайшего предка Вашего компонента. 

2. С помощью мастера создания новых компонентов сделать «заготовку» (шаблон) для нового компонента, задав имя класса, название вкладки на Панели инструментов и пути к файлу, где будет храниться код будущего компонента.

3. Написать конструктор нового компонента, не забыв его объявление в разделе Public. 

4. Задать необходимые свойства в процедуре конструктора.

5. Написать деструктор компонента и сохранить файл с кодом компонента. 

6. Создать новый пакет – Package

7. Добавить в него файл с кодом компонента и сохранить проект. 

8. Инсталлировать новый пакет с компонентом.

9. Обязательно нажмите пиктограмму «Сохранить» перед тем, как закрыть проект. 

65) Поточная обработка данных. Файловые потоки.

Tstream

В delphi используется абстрактный класс tstream (поток данных), который является основой для работы с файлами как с объектами. В случае объектов совершенно не важно, что именно является носителем информации - дисковый ли файл, ленточный носитель или оперативная память. В специализированных потомках tstream определены стандартные методы read, write и seek, открывающие полный доступ к файловому объекту. Сам объект создается конструктором и уничтожается деструктором. Примечание Поток не, учитывает специфику хранящихся в файле данных, т. е. по существу работает с данными, как если бы хранились в не типизированном файле.

Свойства

Position — указывает на текущую позицию курсора в потоке. Начиная с этой позиции будет происходить чтение данных; Size — размер данных в потоке.

Методы

CopyFrom — метод предназначен для копирования из другого потока. У него два параметра: указатель на поток, из которого надо копировать, и число, показывающее размер данных, подлежащих копированию; Read — прочитать данные из потока, начиная с текущей позиции курсора. У этого метода два параметра — буфер, в который будет происходить чтение, и число, показывающее размер данных для копирования; Seek — переместиться в новую позицию в потоке. У этого метода два параметра:

  1. Первый параметр: число, указывающее на позицию, в которую надо перейти. Если вам нужно передвинуться на пять байт, то просто укажите цифру 5.

  2. Второй параметр: откуда надо двигаться. Тут возможны три варианта:

    1. soFromBeginning — двигаться на указанное количество байт от начала файла;

    2. soFromCurrent — двигаться на указанное количество байт от текущей позиции в файле к концу файла;

    3. soFromEnd — двигаться от конца файла к началу на указанное количество байт.

SetSize — установить размер потока. Здесь только один параметр — число, указывающее новый размер потока. Допустим, что вам надо уменьшить размер файла. В этом случае с помощью метода SetSize потока TFiieStream вы можете уменьшить или даже увеличить размер файла. Write — записать данные в текущую позицию потока. У этого метода два параметра:

  1. переменная, содержимое которой нужно записать;

  2. число байт для записи.

Собственно от THandleStream произведен только класс TFileStream. Остальные из категории поточных произведены от TStream. Ну, мы рассматриваем TFileStream, так что этим и займемся.

TFileStream

Этот конструктор использует два параметра - имя создаваемого файла (AnsiString) и режим открытия. режим открытия задает типы операций и права доступа, применимые к данному объекту. Могут быть следующие значения, комбинируемые с помощью binary or оператора "|".

  • fmCreate

создать новый файл. Если файл существует, то открывается в режиме чтения.

  • fmOpenRead

открыть для чтения.

  • fmOpenWrite

открыть для записи.

  • fmOpenReadWrite

открыть и для того, и для другого.

  • fmShareCompat

совмещенный режим доступа.

  • fmShareExclusive

эксклюзивный режим. Ни одно приложение не может читать или записывать открытый файл.

  • fmShareDenyWrite

запрет по записи для других приложений.

  • fmShareDenyRead

запрет по чтению.

  • fmShareDenyNone

никакого разделения ресурса.

Read, Write, Seek

Первые два в качестве параметра используют преременную void* и целое, определяющее длину считываемой/записываемой порции данных. Ну а Seek вообще очень похоже на fseek. Вот примеры использования функции:

TFileStream* stream=new TFileStream("c:\\test.txt",fmOpenReadWrite|fmShareExclusive) //на всякий случай займем этот файл как эксклюзив ;) stream->Seek(0,soFromBeginning);

Этот пример иллюстрирует возможность создания формата (полностью демонстрационного) для хранения изображений. В общем-то являясь уступающим аналогом DIB (по нашему - BMP), тем не менее я думаю это хороший пример.

Некоторая оговорка. Я не говорю, что TFileStream вообще и в данном случае - наилучший вариант поточного io класса. Например, можно было использовать fstream [basic_fstream]. Но все-таки это раздел, посвященный VCL и всему, что с ним связано. Поскольку программист на C++ Builder часто использует компонентные классы VCL, то ему приходится обращаться к сооствествующим поточным классам (потомкам TStream).

TMemoryStream

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

Свойство

property Memory: Pointer;

определяет область памяти, отведенную для хранения данных потока. Изменение размера отведенной памяти осуществляется методом

procedure SetSize(NewSize: Longint); override;

Для очистки памяти потока используется метод

procedure Clear;

Чтение/запись данных в память выполняется привычными методами Read и Write.

Также запись данных в память может осуществляться методами:

  •  procedure LoadFromFile(const FileName: string); — из файла;

  •  procedure LoadFromStream(Stream: TStream) ; — из другого потока.

Дополнительно можно использовать методы записи данных в файл или поток:

procedure SaveToFile(const FileName: string);

 procedure SaveToStream(Stream: TStream);

66)

Вообщем. Большие числа записываются в массив (т.е. каждая цифра такого числа есть элемент массива) и далее с этими массивами производятся соответствующие деяствия.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]