Чтение онлайн

на главную

Жанры

Шрифт:

Только при использовании подобных методов лучше проверять, является ли содержимое буфера обмена текстовой информацией. В листинге 8.4 показан пример копирования в буфер обмена всего текста, введенного в текстовое поле.

...

Листинг 8.4.

Копирование текста из поля редактора Memo в буфер обмена

procedure TFormClipboard.bnCopyTextClick(Sender: TObject);

begin

//Выделяем весь текст в поле редактора

MemoText.SelectAll;

//Копируем текст

MemoText.CopyToClipBoard;

end;

Буфер

обмена часто используется для хранения текста, поэтому объект Clipboard имеет специальное свойство AsText типа String, предназначенное для обработки содержимого буфера как данных текстового формата. Свойство AsText предназначено как для чтения, так и для записи. При чтении свойства данные извлекаются из буфера, а при записи – заносятся в буфер обмена (листинг 8.5).

...

Листинг 8.5.

Копирование текстовой информации

procedure TFormClipboard.bnCopyTextAsTextClick(Sender: TObject);

begin

//Если в буфере текст, то выводим его в поле редактора

if Clipboard.HasFormat(CF_Text)

then MemoText := Clipboard.AsText

end;

При работе с графическими компонентами для операций, связанных с обменом информацией через общую область, удобно использовать метод Assign. Процедура Assign (Source: TPers is tent) присваивает буферу обмена объект, указанный параметром Source. Если объект является изображением и принадлежит таким графическим классам, как TBitmap, TPicture или TMetaf ile, то в буфер обмена копируется изображение установленного формата. Для извлечения изображения также может использоваться метод Assign.

Пример использования буфера обмена для копирования изображений проводится в листинге 8.6.

...

Листинг 8.6.

Обмен изображением через буфер обмена

procedure TFormClipboard.bnCopyImageClick(Sender: TObject);

begin

//Открываем монопольный доступ

Clipboard.Open;

//Заносим изображение в буфер

Clipboard.Assign(ImageMyPic1.Picture);

//Проверям формат находящихся в буфере данных

if Clipboard.HasFormat(CF_Picture)

then ImageMyPic2.Picture.Assign(Clipboard);

//Закрываем монопольный доступ к буферу

Clipboard.Close;

end;

Изображение, находящееся в образе ImageMyPicl, помещается в буфер обмена, откуда затем копируется в образ ImageMyPic2. Для выполнения этих операций устанавливается монопольный доступ к объекту Clipboard.

Таким образом, использование объекта Clipboard находит широкое применение в программировании приложений, которым необходим обмен данными с другими программами. Необходимо отметить, что буфер обмена ориентирован на работу с пользователем (пользователь инициирует обмен данными между приложениями), поэтому такой способ обмена данными наиболее удобен с точки зрения пользователя. К тому же буфер обмена поддерживает множество форматов представления информации, что позволяет сделать обмен данными более гибким и эффективным.

8.3. Проецируемые в память файлы

Не менее мощным и гибким

методом организации обмена данными между приложениями является метод, который базируется на проецируемых в память файлах (Files Mapping). Главная идея этого механизма основывается на использовании динамической разделяемой памяти системы для хранения в ней данных. Как известно, каждый процесс имеет свой участок памяти, называемый виртуальным адресным пространством. При использовании механизма проецируемых в память файлов данные становятся доступны из любого процесса, который использует этот файл. В этом случае говорят, что файл отображается в виртуальное адресное пространство процесса, поэтому данные, хранимые в файле, доступны процессу, который этот файл открыл. Механизм проецирования файлов в память используется, например, для исполняемых файлов приложений, а также для DLL.

Для работы с проецируемыми в память файлами существует целый ряд API-функций. Но прежде чем их рассматривать, разберемся в процессе организации обмена данными через проецируемые файлы. На первом этапе необходимо создать объект (файл, отображаемый в память), затем «отобразить» созданный объект в адресное пространство процесса приложения, получая возможность записи и чтения данных их этого файла. При отображении файла на определенный участок памяти (адресного пространства процесса) манипуляции с данными этого участка памяти отражаются на содержимом файла. После произведенных над объектом манипуляций необходимо закрыть доступ к данным файла (удалить проекцию и закрыть файл).

Рассмотрим некоторые функции для работы с проецируемым в память файлом. Для того чтобы создать объект файла, проецируемого в память, можно использовать функцию CreateFileMapping. Ее синтаксис выглядит следующим образом:

...

function CreateFileMapping(hFile: THandle;

lpFileMappingAttributes: PSecurityAttributes;

flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD;

lpName: PChar ): THandle;

Подробнее рассмотрим параметры функции.

• hFile – идентификатор файла. В результате присвоения этому аргументу значения константы INVALID_HANDLE_VALUE мы свяжем создаваемыйобъект файлового отображения со страничным swap-файлом (системным файлом подкачки).

• lpFileMappingAttributes – указатель на структуру типа TSecurity-Attributes. Структура содержит параметры безопасности создаваемого файла.

• flProtect – параметр, задающий способ совместного использования создаваемого объекта, в случае доступа на чтение и запись принимает значение PAGE_ READWRITE.

• dwMaximumSi zeHigh – старший разряд 64-битного значения размера выделяемого объема памяти.

• dwMaximumSizeLow – младший разряд 64-битного значения размера выделяемого объема памяти.

• lpName – имя объекта проецируемого файла (может быть nil для создания безымянной проекции файла).

Функция возвращает глобальный дескриптор (THandle). Если проецируемый файл не создан, то функция CreateFileMapping возвращает нулевое значение.

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

Поделиться:
Популярные книги

СД. Восемнадцатый том. Часть 1

Клеванский Кирилл Сергеевич
31. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.93
рейтинг книги
СД. Восемнадцатый том. Часть 1

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Вечная Война. Книга VII

Винокуров Юрий
7. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
5.75
рейтинг книги
Вечная Война. Книга VII

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне

Неудержимый. Книга III

Боярский Андрей
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III

LIVE-RPG. Эволюция-1

Кронос Александр
1. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.06
рейтинг книги
LIVE-RPG. Эволюция-1

Колючка для высшего эльфа или сиротка в академии

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Колючка для высшего эльфа или сиротка в академии

Адский пекарь

Дрейк Сириус
1. Дорогой пекарь!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Адский пекарь

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь

Царь поневоле. Том 1

Распопов Дмитрий Викторович
4. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 1

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Сильнейший ученик. Том 2

Ткачев Андрей Юрьевич
2. Пробуждение крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 2