Наиболее простой и примитивный способ передачи данных – использование буфера обмена(clipboard). Буфер обмена – это выделенная в операционной системе область памяти, которой могут пользоваться все приложения (Рис. 20.1).

Рис. 24.1 Буфер обмена.
В буфер можно помещать данные разного типа: текст, графику, звук и т.д. Для вставки информации из буфера в ту или иную программу необходимо, чтобы эта программа умела обрабатывать данный вид информации. Скажем, не удастся через буфер обмена вставить 3D модель из Компаса в Word.
Для работы с буфером из ваших приложений в проект необходимо подключить модуль Clipbrd:
uses …Clipbrd;
После этого в программе появляется глобальная переменная Clipboard. Это функция, возвращающая ссылку на объект типа TClipboardсо своими свойствами и методами.
Простейшая операция с буфером – помещение в него текста. Делается это так:
Clipboard.SetTextBuf(PCHAR('текст'));
Обратите внимание на команду приведения типа PCHAR. Она преобразует "паскалевскую" текстовую строку в строку, оканчивающуюся нулем (по стандарту языка С). Это связано с тем, что в Windows используется именно стандарт С и для взаимодействия с системным буфером обмена необходимо использовать соглашения Windows.
Для получения значения из буфера обмена в виде текстовой строки применяется метод GetTextBuf:
procedure TForm1.Button1Click(Sender: TObject);
var MyBuffer: PChar;
MyBufferSize: Byte;
MyString: String;
begin
// Копировать содержимое буфера обмена в строку
MyString := Clipboard.AsText;
// Установить длину буфера в длину строки
MyBufferSize := Length(MyString);
// Динамически создать буфер
GetMem(MyBuffer, MyBufferSize);
// Копировать в буфер содержимое буфера обмена Clipboard.GetTextBuf(MyBuffer, MyBufferSize);
// Копировать содержимое буфера в окно Edit,
// чтобы убедиться, что все работает корректно
Edit1.Text := MyBuffer;
// Освободить буфер FreeMem(MyBuffer, MyBufferSize);
end;
Если в буфере содержится не текстовая информация (изображение), то копирование, естественно, не выполняется. Чтобы проверить, информация какого типа лежит в буфере, следует заглянуть в свойство HasFormat:
if clipboard.HasFormat(CF_TEXT) then
// вставляем текст из буфера
Основные возможные значения типов информации:
CF_TEXT – текст;
CF_BITMAP – растровое изображение в формате bmp;
CF_METAFILEPICT – векторное изображение в формате wmf;
CF_PICTURE – любое изображение;
CF_COMPONENT – объект Delphi.
Помимо перечисленных, существует огромное количество других форматов.
Ряд визуальных компонентов имеют встроенные методы для работы с буфером. Например, компонента Tedit есть методы CopyToClipboard (поместить введенный текст в буфер обмена) и PasteFromClipboard (скопировать текст из буфера в поле ввода). Увы, в Delphi нет простых способов для работы с изображениями через буфер обмена.
Для очистки буфера используется метод Clipboard.Clear. Наконец, для копирования всего экрана в буфер обмена (в виде растровой картинки) можно сымитировать нажатие клавиши PrintScreen командой
keybd_event(VK_SNAPSHOT, 0, 0, 0);