Здравствуйте, в этой статье я хотел бы поговорить про то как в своих приложениях можно использовать буфер обмена. Вообще как бы буфер обмена предназначен для временно хранения данных, поэтому в буфер обмена мы можем как записывать информацию, так и получать из него эту самую информацию. Вообще например в нашем случае можно использовать буфер в качестве например программы, которая будет закачивать на сервер какой-нибудь файл. То есть мы выбираем файл и просто выделяем его и нажимаем в Windows например Ctrl+C или в контекстном меню выбираем пункт «Копировать», а затем программа проверяет буфер обмена, если в нем есть что-то, то начинает закачивать, ну это я так как пример привел, а так мы будем знакомится с методами и свойствами класса, который отвечает за работу с буфером обмена. В Delphi за работу с буфером обмена отвечает модуль Clipbrd, да именно его необходимо подключить в Uses, конечно я думаю есть и другие модули, но этот по крайней мере стандартный и можно его спокойно подключать в Uses.

После того как мы подключим данный модуль, нам необходимо создать переменную класса TClipboard. После объявления нам ее необходимо создать. Но давайте пока что просто поговорим о свойствах и методах данного класса.

Свойства

  • AsText - рассматривает буфер обмена как текстовую строку, с помощью данного свойства мы можем получить из буфера текст, если он там конечно находится
  • FormatCount - возвращает общее количество форматов, хранящиеся в буфере. То есть это свойства определяет номер формата, который сейчас в буфере, если картинка, то например 3, если текст, то например 4 и так далее. Тип — Integer
  • Formats[Index:Integer]:Dword - Открывает доступ к формату, указанному индексом Index. То естаь мы можем например если в буфере находятся и картинка и другой какой-нибудь файл, то можно прочитать именно картинку, если только она там есть

Ну вот и все по свойствам, теперь перейдем к методам

  • Assign - копирует изображение в буфер
  • Clear - тут думаю и комментировать не надо, очищает буфер
  • Close - закрывает буфер обмена
  • GetTextBuf(Buffer:Pchar,Bufsize:integer) — копирует из буфера Byfsize символов и возвращает действительное количество скопированных символов
  • HasFormat(Format:Word) — возвращает True если буфер содержит данные в формате Format
  • Open - открывает буфер обмена
  • SetTextBuf(Buffer:Pchar) — помещает в буфер обмена текстовое значение

Во многих компонентах есть свойства, которые позволяет помещать данные в буфер, да и вообще работать с буфером обмена. Например TMemo, TEdit, TRichEdit есть такие методы как CopyToClipboard, CutToClipboard, PasteFromToClipboard. В TImage также имеются методы для вставки и копирования изображения в буфер и наооборот, на сейчас мы только работаем с TClipboard.

Давайте вставим теперь текст в буфер обмена

Но для начала создадим переменную класса TClipboard на OnCreate формы

procedure TForm1.FormCreate(Sender: TObject);
begin
   ClipBoard:=TClipboard.Create;
end;

А вот теперь можно приступить к работе с буфером, добавляем текст в буфер

procedure TForm1.Button3Click(Sender: TObject);
begin
    ClipBoard.SetTextBuf('Text to Buffer');
end;

Про этот метод я рассказывал, как точно рассказывал и про AsText, который позволяет получать текстовую информацию из буфера

procedure TForm1.Button4Click(Sender: TObject);
begin
   if ClipBoard.FormatCount=4 then
    ShowMessage(ClipBoard.AsText);
end;

Мы перед этим убеждаемся, что в буфере именно текстовая информация, а не картинка или еще что-нибудь

Далее теперь давайте добавим картинку в буфер из TImage например и из файла, а затем в TImage отобразим ее. Для этого на форме у нас должно быть 2 TImage, в один загружаем картинку, а второй пускай пустует, а теперь мы запишем в буфер картинку из TImage

procedure TForm1.Button1Click(Sender: TObject);
begin
   ClipBoard.Open;
   ClipBoard.Assign(Image1.Picture);
   ClipBoard.Close;
end;

Из файла

procedure TForm1.Button6Click(Sender: TObject);
var
 jpg:TJPEGImage;
begin
   if OpenPictureDialog1.Execute then
    begin
     jpg:=TJPEGImage.Create;
     jpg.LoadFromFile(OpenPictureDialog1.FileName);
     ClipBoard.Assign(jpg);
     jpg.Free;
    end;
end;

Конечно если Вы будете добавлять в jpg, например, Bitmap, то «выскочит» ошибка, поэтому необходимо проверять формат.

Ну а теперь нам осталось только в TImage отобразить нашу картинку

procedure TForm1.Button2Click(Sender: TObject);
begin
   ClipBoard.Open;
   if ClipBoard.FormatCount=3 then
    Image2.Picture.Assign(ClipBoard);
   ClipBoard.Close;
end;

Мы также проверяем формат, хранимый в буфере, чтобы не вылетало у нас никаких ошибок и отображаем в TImage

Ну а очищать буфер наверное само лекго

procedure TForm1.Button5Click(Sender: TObject);
begin
   ClipBoard.Clear;
end;
Хочу сказать Вам, что голосовое общение в сети Интернет очень популярно на данный момент, а для этого существует огромное количество программ. Одна из них — это skype, так что скачать skype на русском языке Вы сможете для любых платформ ОС и общайтесь на здоровье.

Исходник статьи качаем тут

Автор статьи - Andrey53

Метки: , , , , , ,




К записи “Работа с буфером обмена” оставлено комментариев: 5.

  1. Keeper:

    На текст всегда проверяли так:
    ClipBoard.HasFormat(CF_TEXT)
    а не
    ClipBoard.FormatCount=4

    И еще
    ClipBoard.Close;
    лучше помещать в finally.

    Это все, конечно, не сильно принципиально =)

  2. Vlad:

    >>А вот теперь можно приступить к работе с буфером, добавляем текст в буфер

    Можно было бы и без создания обойтись
    Clipboard.AsText := ‘Any String’

    Дело в том, что в модуле clipbrd есть:

    function Clipboard: TClipboard;
    begin
    if FClipboard = nil then
    FClipboard := TClipboard.Create;
    Result := FClipboard;
    end;

  3. Andrey53:

    Кстати да Vlad, спасибо, можно было и не создавать, не до конца модуль просмотрел

  4. Rais96:

    без строки
    ClipBoard:=TClipboard.Create;
    в D2009 — AV

  5. [...] его оттуда. Мы уже с Вами рассматривали статью о том, как работать с буфером обмена в Delphi. В данной статье мы рассмотрим [...]

Оставить комментарий на Rais96

Вы можете использовать следующие теги:

*