- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Файловые потоки
Как мы уже упоминали ранее, VCL определяет два класса потоков, которые можно использовать для управления файлами — TFileStream и THandleStream. Если известно имя файла, которым нужно управлять, но не известен дескриптор файла (дескриптор файла Windows), можно использовать TFileStream. Например, если запросить пользователя ввести имя файла, используя одно из общих диалоговых окон, имя файла вводится пользователем. С другой стороны, если необходимо открывать и закрывать файл функциями API Windows, для манипуляций с файлом используется THandleStream.
Для любого из этих классов соответствующая информация о файле передается в конструкторе Create:
constructor TFileStream.Create(const FileName: string; Mode: Word);
constructor THandleStream.Create(AHandle: Integer);
Так как конструктор TFileStream будет пытаться открыть файл, необходимо определить, будет ли содержимое файла использоваться в режиме разделения (share) совместно с другим пользователем. Различные режимы (появляющиеся в интерактивной помощи) связаны со значениями режима OF_XXX функции OpenFile в API Windows.
Примечание
Из различных режимов наиболее важны fmShareDenyWrite, используемый для простого чтения данных из разделяемого файла, и fmShareExclusive, используемый для записи данных в разделяемый файл.
Как можно предположить, создание и использование файлового потока может быть достаточно простым. Действительно, в большинстве случаев можно просто создать поток, а затем вызвать соответствующий компонентный метод, чтобы читать или записывать данные потока. Например, методы LoadFromStream или SaveToStream определены в следующих классах: TBlobField, TGraphicField, TMemoField, TOutline, TStrings, TStringList, TMetafile, TIcon и TBitmap.
Интересно, что многие из компонентов VCL (включая некоторые из перечисленных выше) также предоставляют методы, которые можно использовать для загрузки или сохранения данных непосредственно в файл. Очевидно, если известно, что приложение будет всегда читать или записывать компоненты данных, используя файл, то лучше использовать эти прямые методы вместо создания объекта потока с последующей передачей этого объекта компоненту для задач чтения и записи. Однако этот подход не сэкономит много кода и довольно серьезно ограничит ваши возможности (будет не просто изменять программу так, чтобы она использовала область памяти вместо файла).
Напротив, копирование с использованием TFileStream или THandleStream приводит к простому вызову метода CopyFrom. Это намного проще, чем отдельная установка буферов и выполнение явных операций чтения и записи в файл.
Методы потоков в действии: программаMemoStr
Чтобы увидеть некоторые из методов, упомянутых в последнем абзаце, в действии, давайте рассмотрим программу MemoStr.
В данном примере мы использовали объект TFileStream для следующих задач:
• загрузки данных в компонент Memo из файла;
• сохранения данных из компонента Memo в файл;
• копирования в файл.
Для обработки каждой задачи предоставляются компонент Button и соответствующий обработчик события (event handler).
procedure TForml.ButtonSaveMemoClick(Sender: TObject);
var
MyStream: TFileStream;
begin
if SaveDialogl.Execute then begin
if FileExists(SaveDialogl.FileName) then
MyStream:= TFileStream.Create(
SaveDialogl.FileName, fmOpenWrite)
else
MyStream:= TFileStream.Create(SaveDialogl.FileName, fmOpenWrite or fmCreate);
try
Memol.Lines.SaveToStreas(MyStream);
finally
MyStream.Free;
end;
end;
end;
procedure TForml.ButtonLoadMemoClick(Sender: TObject);
var
MyStream: TFileStream;
begin
if OpenDialogl.Execute then begin
MyStream:= TFileStream.Create(OpenDialogl.FileName, fmOpenRead);
try
Memol.Lines.LoadFromStream(MyStream);
finally
MyStream.Free;
end;
end;
end;
procedure TForml.ButtonCopyFileClick(Sender: TObject);
var
Streaml, Stream2: TFileStream;
begin
if OpenDialogl.Execute and SaveDialogl.Execute then begin
Streaml := TFileStream.Create(OpenDialogl.FileName, fmOpenRead);
try
Stream2 := TFileStream.Create(SaveDialogl.FileName, fmOpenWrite or fmCreate);
try
Stream2.CopyFrom(Streaml, Streaml.Size);
finally
Stream2.Free;
end;
finally
Streaml.Free;
end;
end;
end;
Теперь, после знакомства с некоторыми базисными примерами использования объектов файловых потоков, можно перейти к примеру использования объекта потока памяти, а затем заняться более сложными темами.