- •Новые технологии.
- •Создание новых компонент
- •Добавление свойств
- •Добавление методов
- •Добавление событий
- •Разработка ресурсов для компоненты
- •Установка компоненты
- •Испытание компоненты
- •Редактирование компоненты
- •Создание справочной службы помощи
- •Динамически подключаемые библиотеки (dll)
- •Работа с буфером обмена
- •Динамический обмен данными (dde)
- •Связывание и внедрение объектов (ole)
- •Упражнения:
-
Работа с буфером обмена
Буфер обмена представляет собой область оперативной памяти и специальных функций, которые используются операционной системой 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.
-
Динамический обмен данными (dde)
С помощью технологии DDE два приложения могут динамически взаимодействовать и обмениваться текстовыми данными во время их выполнения. При этом программа, запрашивающая данные, становится клиентом, а программа, служащая источником данных, является сервером.
Организация динамического обмена данными включает в себя два этапа:
-
установление связи между клиентом и сервером, ее можно устанавливать при разработке и при выполнении приложения.
-
собственно передача текстовых данных:
-
получение данных от сервера
-
передача данных на сервер
-
посылка серверу команд
-
Для совместной отладки двух приложений сначала создаем сервер, а затем – клиент, или запуск двух копий приложений, в которых отлаживаются сервер и клиент.
Для организации приложения сервера должны быть размещены две компоненты 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';
Теперь при запуске обоих приложений можно передавать данные между ними.