Буфер обмена в операционной системе — это непросто выделяемая операционной системой память для обмена данными, а совокупность специальных областей данных ("корзин"), имеющих указатели (дескрипторы) на информацию, хранящуюся в специальном формате.
Буфер обмена поддерживает некоторое количество предопределенных форматов для хранения информации различных типов, таких как графика и текст, хотя любое приложение может определять свой собственный формат. Предопределенные форматы распознаются функциями GetClipboardData И Setciipboardoata. Для помещения информации в буфер приложение сначала должно открыть его функцией OpenClipboard, затем предварительно очистить буфер функцией EmptyClipboard, которая удаляет всю информацию из буфера в любом формате и назначает буфер конкретному окну, передавая параметр hWndNewOwner, установленный в функции Openclipboard. Затем приложение вызывает функцию SetClipboardData, передавая ей флаг, указывающий формат данных, и указатель на сами данные. Функция CloseClipboard закрывает буфер и завершает работу с ним. Приложение может получить данные из буфера с помощью функции GetClipboardData, передавая ей флаг формата запрашиваемых данных. Если данные в буфере существуют в запрашиваемом формате, то будет возвращен указатель на них. При помещении приложением данных в буфер желательно, чтобы они находились там во всех возможных форматах. Это нужно, чтобы наибольшее количество приложений могло ими воспользоваться. Например, если текстовый процессор поместит данные в буфер только в собственном формате, то они будут доступны только запущенным экземплярам этого процессора. Если этот процессор поместит данные в буфер дополнительно к собственному формату еще и в форматах CF_TEXT и CF_UNICODETEXT, то эти данные будут доступны другим Windows-приложениям, таким как Блокнот или MS Word.
Windows обеспечивает автоматическое преобразование различных предопределенных форматов один в другой. В табл. 2 показаны наименования форматов, их возможные варианты конвертирования и поддержка различными версиями операционной системы Windows.
Таблица 2
В табл. 3 приведены системные функции для работы с буфером обмена.
Таблица 3.
Используя функции работы с буфером обмена, можно, например, определить поддерживаемые форматы буфера обмена его текущего владельца.
Пример. Определение текущего формата буфера обмена
procedure TForml.TimerlTimer(Sender: TObject);
const
{массив, содержащий все предопределенные имена форматов буфера обмена}
PredefinedClipboardNames: array[1..17] of string =
('CF TEXT', 'CF BITMAP’,
‘CF_METAFILEPICT’, 'CF_SYLK', 'CF_DIF’
‘CF_TIFF', 'CF_OEMTEXT', 'CF_DIB',
'CF_PALETTE’, 'CF_PENDATA’ 'CF_RIFF’
‘CF_WAVE', 'CF_UNICODETEXT',
'CF_ENHMETAFILE', 'CF_HDROP', 'CF_LOCALE',
'CF_MAX');
var
FormatID: UINT; {для ID-формата буфера обмена}
FormatName: array[0..255] of char; {для имени формата буфера обмена}
Len: Integer; {для длины формата буфера обмена}
begin
{очищаем окно вывода}
ListBoxl.Items.Clear;
{подсчитываем и выводим количество форматов, поддерживаемых текущим
владельцем буфера обмена}
Labell.Caption :=
'Всего форматов доступно: '+IntToStr(CountClipboardFormats);
{открываем буфер обмена}
OpenClipboard(0);
{пытаемся считать первый из доступных форматов}
FormatID := EnumClipboardFormats(0);
{пытаемся считать остальные форматы}
while (FormatID<>0 ) do
begin
{получаем имя формата буфера обмена; при этом будет возвращено имя
зарегистрированного, а не предопределенного формата}
Len := GetClipboardFormatName (FormatID, FormatName,255) ;
{если длина равна нулю, то это предопределенный формат}
if Len = 0 then
ListBoxl.Items.Add(PredefinedClipboardNames[FormatID]+
‘(Предопределенный)'+
'[' + IntToStr(FormatID)+ ']')
else
{иначе это зарегистрированное имя формата}
ListBoxl.Items.Add(FormatName+' [' + IntToStr(FormatID) + ‘]’);
{получаем ID следующего формата буфера обмена}
FormatID:=EnumClipboardFormats(FormatID);
end;
{обязательно закрываем буфер}
CloseClipboard;
end;
|