Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа6.doc
Скачиваний:
3
Добавлен:
06.11.2018
Размер:
238.59 Кб
Скачать
    1. Работа с буфером обмена

Буфер обмена представляет собой область оперативной памяти и специальных функций, которые используются операционной системой Windows для временного хранения данных. Буфер обмена является общим для всех программ, любое приложение может помещать в него информацию и считывать ее оттуда. Буфер обмена хранит любые данные и сведения об их формате.

Для выполнения операций обмена данными через буфер в Delphi предназначен специальный класс TClipboard и специальный объект Clipboard, являющийся экземпляром этого класса. Для доступа к свойствам и метолам объекта Clipboard необходимо указать в разделе Uses имя модуля Clipbrd. Свойство Clipboard.AsText позволяет получить содержимое буфера обмена, который представлен как текст.

С помощью функции HasFormat(Format:Word) можно проверить, какого формата информации содержится в буфере. В скобках могут быть следующие константы:

  • CF_TEXT – обычный текст в кодировке ANSI

  • CF_BITMAP- рисунок формата BMP

  • CF_METAFILEPICT- рисунок формата WMF

  • CF_TIFF- рисунок формата TIFF

  • CF_WAVE- звук

  • CF_UNICODETEXT- текст в кодировке Unicode

  • CF_PICTURE- объект типа TPicture

Метод Open позволяет открыть монопольный доступ приложения к буферу обмена, а метод Close закрывает его.

Методы CopyToClipboard, CutToClipboard и PasteFromClipboard позволяют выполнить стандартные операции копирования, вырезания и вставки текстового фрагмента. Например, в компоненте Memo1 скопируем набранный текст в буфер обмена, назначив для этого обработчик события - нажатие на кнопку Button1:

Procedure TForm1.Button1Click(Sender: TObject);

Begin

Memo1.SelectAll;

Memo1.CopyToClipboard;

End;

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

If Clipboard.HasFormat(CF_Text) then

Memo1.PasteFromClipboard;

Или скопировать в Memo1 содержимое первой строки в следующую строчку:

Clipboard.Astext:=Memo1.Lines[0];

Memo1.Lines[1]:=Clipboard.AsText;

При работе с графическими компонентами используют метод Assign(Source: TPersistent), который позволяет скопировать и извлечь из буфера изображение, принадлежащих классам TBitmap, TPicture или TMetafile. Например, скопируем изображение из одной компоненты Image в другую:

Procedure TForm1.Button1Click(Sender: TObject);

Begin

Clipboard.Open;

Clipboard.Assign(Image1.Picture);

If Clipboard.HasFormat(CF_Picture)

Then Image2.Picture.Assign(Clipboard)

Else Image2.Picture.Assign(nil);

Clipboard.Close;

End;

Объект Clipboard – это глобальный буфер обмена. Кроме него в программе могут использоваться локальные буферы обмена, представляющие собой области оперативной памяти, выделенные программе во время выполнения для временного хранения и использования каких-либо данных. Для обмена между объектом Clipboard и локальным буфером предназначены методы GetTextBuf и SetTextBuf.

    1. Динамический обмен данными (dde)

С помощью технологии DDE два приложения могут динамически взаимодействовать и обмениваться текстовыми данными во время их выполнения. При этом программа, запрашивающая данные, становится клиентом, а программа, служащая источником данных, является сервером.

Организация динамического обмена данными включает в себя два этапа:

  1. установление связи между клиентом и сервером, ее можно устанавливать при разработке и при выполнении приложения.

  2. собственно передача текстовых данных:

    1. получение данных от сервера

    2. передача данных на сервер

    3. посылка серверу команд

Для совместной отладки двух приложений сначала создаем сервер, а затем – клиент, или запуск двух копий приложений, в которых отлаживаются сервер и клиент.

Для организации приложения сервера должны быть размещены две компоненты DdeServerConv (сеанс обмена данными) и DdeServerItem (передаваемые данные), находящиеся в палитре компонентов на странице System. Так же нам понадобиться два редактора Edit1и Edit2 для передачи и приема текстовой информации и кнопка Button1 для реализации копирования параметров связи.

Компонент DdeServerItem через свойство ServerConv связан с компонентой DdeServerConv и непосредственно определяет текстовые данные, пересылаемые в процессе обмена. Устанавливаем связь между компонентами DdeServerConv и DdeServerItem:

procedure TForm1.FormCreate(Sender: TObject);

begin

DdeServerItem1.ServerConv := DdeServerConv1 ;

end;

Эти данные должны быть занесены в свойство Text или Lines. Например, при передаче текста из редактора Edit1 обновление свойства Text может быть выполнено в обработчике события OnChange редактора Edit1 с помощью следующего оператора:

procedure TForm1.Edit1Change(Sender: TObject);

begin

DdeServerItem1.Text:=Edit1.Text;

end;

При подключении к серверу клиента последнему нужна информация о параметрах сервера. Эти параметры могут быть помещены в буфер обмена с помощью метода CopyToClipboard компоненты DdeServerItem. Затем эти параметры можно извлечь и использовать в приложении клиента при подключении к серверу.

procedure TForm1.Button1Click(Sender: TObject);

begin

DdeServerItem1.CopyToClipboard ;

end;

Если сервер может принимать данные от клиента, в программе должен быть подготовлен обработчик события OnPokeData компоненты DdeServerItem. При отображении получаемых данных в редакторе Edit2 оператор обработчика может иметь вид:

procedure TForm1.DdeServerItem1PokeData(Sender: TObject);

begin

Edit2.Text:= DdeServerItem1.Text;

end;

Если сервер может обрабатывать макросы, то соответствующие действия кодируются в обработчике события OnExecuteMacro типа TMacroEvent компоненты DdeServerConv. Тип события описан следующим образом:

Type TMacroEvent=procedure (Sender: TObject; Msg: TStrings) of Object;

Для организации приложения клиента должны быть размещены две компоненты DdeClientConv (сеанс обмена данными) и DdeClientItem (передаваемые данные), находящиеся в палитре компонентов на странице System. Компонент DdeClientConv обеспечивает установление сеанса связи с сервером и управление процессом обмена данными, используя параметры сервера в следующих свойствах:

  • DDEService- название сервера, имя приложения сервера без расширения

  • DDETopic- предмет обмена, например, DdeSeverConv

  • ServiceAplication- полное имя исполняемого файла приложения сервера без расширения, если приложение сервер находится не в текущем каталоге.

Эти параметры можно установить через “Инспектор объектов” в свойстве DdeService, если предварительно скопировать параметры связи в приложении сервера и вставить их в окне DDE Info по кнопке Paste Link:

Такие изменения можно внести в обработчик события OnCreate формы:

DdeClientConv1.DdeService := 'Server';

DdeClientConv1.DdeTopic := 'DdeServerConv1';

Так же нам понадобиться два редактора Edit1и Edit2 для передачи и приема текстовой информации и кнопка Button1 для реализации передачи данных на сервер.

Свойство ConnectMode компоненты DdeClientConv управляет режимом подключения клиента к серверу и принимает значение ddeAutomatic (автоматическое соединение) или ddeManual (ручное соединение). Если при запуске приложения клиента приложение сервера еще не было запущено, то оно автоматически запускается при значении ddeAutomatic. Если значение установлено в ddeManual, то приложение сервера будет запускаться по вызову метода OpenLink компоненты DdeClientConv. Для отключения от сервера используют метод CloseLink.

Компонент ddeClientItem отвечает за получаемые от сервера данные, которые заносятся в те же свойства, что и у компоненты ddeServerItem. При изменении данных компонента ddeClientItem генерирует событие OnChange, обработчик которого используется для приема этих данных.

procedure TForm1.DdeClientItem1Change(Sender: TObject);

begin

edit1.Text :=DdeClientItem1.Text ;

end;

Клиент может принимать данные от сервера и посылать ему данные и команды для выполнения (макросы). Для этого используют метод PokeData или PokeDataLines (для нескольких строк):

procedure TForm1.Button1Click(Sender: TObject);

var pc:PChar;

begin

DdeClientConv1.PokeData(ddeclientitem1.DdeItem,

StrPCopy(pc, edit2.Text));

end;

На сервере должен быть подготовлен обработчик события OnPokeData компоненты DdeServerItem Для посылки макросов используют метод ExecuteMacro или ExecuteMacroLines. На сервере выполнение макросов кодируется в обработчике события OnExecuteMacro компоненты DdeServerConv.

Компонент DdeClientItem связывается с компонентом ddeClientConv через свойство DdeConv, а через свойство ddeItem указывается компонент DdeServerItem, с которым выполняется обмен данными:

DdeClientItem1.DdeConv :=DdeClientConv1 ;

DdeClientItem1.DdeItem := 'DdeServerItem1';

Теперь при запуске обоих приложений можно передавать данные между ними.