рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Буфер обмена и стандартные компоненты Delphi

Буфер обмена и стандартные компоненты Delphi - раздел Программирование,   Глава 23. Буфер Обмена .........................................

 

Глава 23. Буфер обмена ............................................................................................................ 559

 

 

23.1. Буфер обмена и стандартные компоненты Delphi ..................................................... 560

 

23.2 Объект Clipboard ............................................................................................................ 561

 

23.3 Картинки и буфер обмена. ............................................................................................ 562

 

23.4 Создание собственного формата для работы с буфером............................................ 566

 

нопки «Копировать» и «Вставить» есть практически в любом полноценном приложении. Я думаю, что ты тоже захочешь вставить такую возможность в свои программы. В этой главе я дам максимум полезной теоретической и

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

Если в твоей программе есть строки ввода TEdit, то они уже умеют работать с буфером обмена. Попробуй щёлкнуть в любой такой строке правой кнопкой и перед тобой откроется меню, в котором есть все необходимые пункты. ОС Windows очень много делает за нас и нам не приходиться заботить о таких мелочах.

С другими компонентами Windows дело обстоит немного сложнее. Тут нам придётся немного поработать на клавиатуре. Но эта работа не так уж сложна и ты убедишься в этом, когда закончишь чтение этой главы.

23.1. Буфер обмена и стандартные компоненты Delphi

ольшинство компонентов Delphi уже готовы к работе с буфером обмена. В основном это касается тех компонентов, которые содержат какие-либо данные, которые пользователь может захотеть поместить в буфер обмена. Если такая

возможность нужна, то у компонента будет методы с именами:

1. 1. CutToClipboard – вырезать в буфер обмена;

2. 2. CopyToClipboard – копировать в буфер обмена;

3. 3. PasteFromClopboard – вставить из буфера обмена.

 

Давай посмотрим на эти метода в действии. Создай новое приложение, и помести на его форму три кнопки: «Вырезать», «Копировать» и «Вставить». По центру окна растяни компонент TMemo. Мою форму ты можешь увидеть на рисунке 23.1.1.

Теперь создадим обработчики событий для кнопок. Для кнопки «Вырезать» напиши следующий код:

procedure TForm1.ToolButton1Click(Sender: TObject); begin Memo1.CutToClipboard; end;

Здесь всего лишь вызывается один метод CutToClipboard компонента Memo1. Этот метод вырежет выделенный текст в буфер обмена.

По событию OnClick для кнопки «Копировать» пишем следующий код:

procedure TForm1.ToolButton2Click(Sender: TObject); begin Memo1.CopyToClipboard; end;

Здесь происходит копирование выделенного фрагмента текста в буфер обмена с помощью метода CopyToClipboard.

Ну и для кнопки вставить пишем вызов метода PasteFromClipboard компонента Memo1. С помощью этого метода, всё содержимое буфера обмена будет вставлено в компонент Memo1.

Теперь попробуй запустить приложение и скопировать какой-нибудь текст в буфер обмена с помощью нашей кнопки «Копировать». После этого нажми на кнопку «Вставить» и скопированный текст появиться в текущей позиции курсора. Если ты скопируешь в буфер какое-нибудь изображение из любого графического редактора и попытаешься вставить его в компонент Memo1, то ничего не произойдёт. Система сама следит за форматом данных, хранимых в буфере обмена. Чуть позже я покажу, как сделать так, чтобы кнопка «Вставить» была активна только тогда, когда в буфере есть данные и они соответствуют нужному формату.

Попробуй щёлкнуть правой кнопкой мыши внутри компонента Memo1. Перед тобой так же должно появиться всплывающее меню с необходимыми для работы с буфером обмена пунктами.

На компакт диске, в директорииПримерыГлава 23Memo Clipboardты можешь увидеть пример этой программы.

 

23.2 Объект Clipboard

ля работы с буфером обмена в Delphi есть объект Clipboard. Несмотря на то, что это объект, его не надо инициализировать (как и TApplication и TPrinter), а

можно использовать без всяких инициализаций. Достаточно только подключить в разделе usesмодуль Clipbrd и он становиться тебе доступным.

У этого объекта не так уж и много свойств и методов, так что будем их рассматривать на практике. Для начала модернизируем пример, написанный в прошлой части с использованием этого объекта. Открой предыдущий пример и сразу добавь в раздел usesмодуль Clipbrd. Теперь по событию OnClick для кнопки «Копировать» напиши следующий код:

Clipboard.SetTextBuf(PChar(Memo1.SelText));

Здесь я использую метод SetTextBuf объекта Clipboard. Этот метод копирует переданный в качестве параметра текст в буфер обмена. В качестве это параметра я передаю выделенный в компоненте Memo1 текст Memo1.SelText. Единственное – это надо привести текст к типу PChar.

По нажатию кнопки «Вырезать» пишем следующий код:

Clipboard.SetTextBuf(PChar(Memo1.SelText));

Memo1.SelText:='';

«Вырезать» -значит скопировать текст в буфер и потом удалить его из компонента Memo1. Именно это я и делаю. В первой строке я написал код, который ты видел в обработчике события OnClick для кнопки «Копировать». Во второй строке я обнуляю (удаляю) выделенный текст.

По нажатию кнопки «Вставить» пишем следующий код:

Memo1.SelText:=Memo1.SelText+Clipboard.AsText;

Свойство AsText объекта Clipboard указывает на содержимое буфера обмена в виде текста. В этом коде я прибавляю это содержимое к выделенному тексту и вставляю это всё в выделенный текст. Вот таким нехитрым способом я реализовал вставку.

Попробуй запустить пример и убедиться, что всё работает. Как видишь, использование объекта Clipboard не намного сложнее и бояться тут нечего.

Теперь посмотрим ещё несколько интересных методов объекта Clipboard:

Assign – назначить в буфер обмена объект совместимый с TPersistent. К таким объектам относятся картинки TImage. В качестве единственного параметра нужно указать объект, содержимое которого нужно скопировать в буфер обмена.

Clear – очистить содержимое буфера обмена.

HasFormat – проверка, какого типа данные хранятся в буфере обмена. Возможны следующие типы данных:

CF_TEXT -буфер содержит текст.

CF_BITMAP -буфер содержит картинку.

CF_METAFILEPICT -буфер содержит векторную картинку.

CF_PICTURE -буфер содержит объект типа TPicture.

CF_COMPONENT -буфер содержит компонент.

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

procedure TForm1.InfoButtonClick(Sender: TObject); begin if Clipboard.HasFormat(CF_TEXT) then Application.MessageBox('Буфер содержит текст', 'Внимание!'); if Clipboard.HasFormat(CF_BITMAP) then Application.MessageBox('Буфер содержит картинку', 'Внимание!'); if Clipboard.HasFormat(CF_METAFILEPICT) then Application.MessageBox('Буфер содержит векторную картинку', 'Внимание!'); if Clipboard.HasFormat(CF_PICTURE) then Application.MessageBox('Буфер содержит объект типа TPicture', 'Внимание!'); if Clipboard.HasFormat(CF_COMPONENT) then Application.MessageBox('Буфер содержит компонент', 'Внимание!'); end;

SetComponent – назначить в буфер обмена компонент. В качестве единственного параметра нужно указать компонент, который надо скопировать в буфер. SetTextBuf -назначить в буфер обмена текстовый буфер. В качестве единственного параметра нужно указать буфер PChar, который надо скопировать в буфер.

На компакт диске, в директорииПримерыГлава 23Clipboardты можешь увидеть пример этой программы.

 

23.3 Картинки и буфер обмена.

авай теперь разберёмся, как работать с изображениями в буфере обмена. Как ты знаешь, у нас основной компонент для работы с картинками является TImage. Вот давай напишем пример, в котором будет копироваться и

вставляться изображение из буфера обмена в компонент TImage.

Создай новый проект, и помести на форму две кнопки «Копировать» и «Вставить». По центру окна расположи компонент TImage, который будет хранить изображения. Мою форму ты можешь увидеть на рисунке 23.3.1.

По событию OnClick для кнопки «Копировать пишем следующий код:

procedure TForm1.CopyButtonClick(Sender: TObject); begin Clipboard.Assign(Image1.Picture); end;

Здесь я просто устанавливаю методом Assign в буфер обмена содержимое свойства Picture компонента Image1. Свойство Picture имеет тип TPicture, который среди своих родителей имеет объект TPersistent, поэтому мы можем использовать метод Assign. Посмотри на рисунок 23.3.2, на котором показана иерархия объекта TPicture.

Теперь посмотрим на код, который надо написать по нажатию кнопки «Вставить»:

procedure TForm1.PasteButtonClick(Sender: TObject); begin Image1.Picture.Assign(Clipboard); end;

Здесь происходит обратное назначение свойству Picture содержимое буфера обмена с помощью метода Assign.

В принципе, пример готов и на этом можно было бы остановиться, но я здесь же хочу показать, как сделать так, чтобы кнопка «Вставить» была доступна только тогда, когда в буфере обмена находиться именно картинка. Для этого сначала движемся в раздел privateи объявляем там следующее:

Private

FClipboardOwner:HWnd; procedure WMDrawClipboard(var Msg: TWMDrawClipboard); message WM_DRAWCLIPBOARD;

Procedure TForm1.ClipboardChanged; var

I: Integer;

Begin

PasteButton.Enabled := False;

For I := 0 to Clipboard.FormatCount - 1 do

Begin if Clipboard.HasFormat(CF_BITMAP) then

end; end; end; Для начала я делаю кнопку «Вставить» неактивной. Потом я запускаю цикл от 0 до количества форматов в буфере обмена…

Unit ClipboardFormatUnit; interface implementation end.

После ключевого слова interfaceдобавляем раздел typeи объявление структуры TLineData и нового объекта TLineClipboard.

type TLineData=record Name:String[100]; LastName:String[100]; Bothday:String[10]; Age:Integer; Telephone:String[15]; end;

TLineClipboard=class

end; Структура TLineData состоит из пяти полей. Именно эту структуру мы будем… После структуры идёт объявление нового объекта. Здесь мы объявляем новый объект вручную описывая все его метода и…

End.

Здесь мы объявили блок initialization, который всегда выполняется автоматически при обращении к модулю или любому его содержимому. В этом блоке я присваиваю переменной CF_PERSONDATA результат выполнения функции RegisterClipboardFormat. Эта функция регистрирует новый формат для буфера обмена с именем указанным в качестве единственного параметра. Результат выполнения функции – число, идентифицирующее зарегистрированный формат данных. После этого, этот формат можно увидеть в свойстве Formats объекта Clipboard.

Вот теперь перейдём к реализации функций записи и чтения данных из буфера.

procedure TLineClipboard.CopyToClipboard;

var Data:THandle; DataPtr:Pointer;

begin //Выделяем память под данные Data:=GlobalAlloc(GMEM_MOVEABLE, SizeOf(LineData));

try
DataPtr:=GlobalLock(Data);
Move(LineData, DataPtr^, SizeOf(TLineData));

//Заполняем буфер обмена
Clipboard.Open;
Clipboard.SetAsHandle(CF_PERSONDATA, Data);
Clipboard.AsText:=LineData.Name+#13#10+LineData.LastName+#13#10+

LineData.Bothday+#13#10+IntToStr(LineData.Age)+#13#10+

LineData.Telephone;
Clipboard.Close;
GlobalUnlock(Data);

except GlobalFree(Data); end; end;

В процедуре объявлено две переменные:

Data – в эту переменную мы будем выделять память для хранения структуры, которую надо будет поместить в буфер обмена.

DataPtr – указатель на выделенную для переменной Data память.

В самом начале процедуры я присваиваю переменной Data результат вызова функции GlobalAlloc. Эта функция выделяет нужный кусок памяти в глобальной памяти. У неё два параметра:

1. 1. Параметры (флаги) выделяемой памяти. Здесь я указал флаг GMEM_MOVEABLE, который указывает на то, что память может быть перемещаемой. Например, когда ОС не хватает оперативной памяти, то она может выгрузить некоторую часть памяти на диск и по мере надобности вернуть эту память обратно. Такой флаг позволяет ОС производить такие манипуляции.

2. 2. Размер выделяемой памяти. Здесь я указываю размер SizeOf структуры LineData.

 

Следующим этапом я блокирую выделенную память с помощью функции GlobalAlloc и получаю указатель на выделенную память, который сохраняется в переменной DataPtr.

У нас есть выделенная память, и мы её временно заблокировали для работы с ней. Теперь мы должны скопировать в эту память структуру, которая должна быть помещена в буфер обмена. Для этого я пользуюсь процедурой Move, которая копирует данные из одного участка памяти (первый параметр – структура LineData) в другой участок (второй параметр – выделенная память DataPtr). Третий параметр – это размер копируемых данных. Я указываю тут размер нашей структуры.

Память подготовлена и в неё занесены данные для буфера обмена. Теперь можно приступать к установке этих данных в буфер. Для начала буфер надо открыть – Open для записи. Следующим этапом я заношу в буфер данные в виде структуры (зарегистрированного нами формата CF_PERSONDATA). Для этого я использую метод SetAsHandle. У этого метода два параметра:

1. 1. Тип заносимых данных.

2. 2. Данные.

 

Дальше, я заношу данные в виде текста, чтобы программы, которые не знают о существовании моего собственного формата, могли прочитать данные в виде текста. Для этого текст надо занести в свойство AsText объекта Clipboard. В это свойство я заношу все поля структуры, разделённые символами #13#10, Символ #13 означает конец строки, а #10 означает перевод каретки на новую строку. Получается, что каждый параметр будет занесён в виде отдельной строки. Чуть позже ты увидишь, как это выглядит на практике.

Данные занесены, можно уничтожать всё, что мы натворили. Для начала закрываю буфер обмена с помощью вызова метода Close объекта Clipboard. Потом вызываю метод GlobalUnlock, который разблокирует память. Уничтожать выделенную память (вызов GlobalFree) нужно только если во время записи произошла какая-то ошибка, поэтому я поместил вызов этой процедуры в блоке except..end. Если ошибок не было, то память должна остаться целой и невредимой, потому что там храниться структура.

Вот теперь разберёмся с кодом, который получает данные из буфера обмена. Взгляни на процедуру PasteFromClipboard:

procedure TLineClipboard.PasteFromClipboard;

var Data:THandle; DataPtr:Pointer;

begin Data:=ClipBoard.GetAsHandle(CF_PERSONDATA); if Data=0 then exit;

DataPtr:=GlobalLock(Data);

Move(DataPtr^, LineData, SizeOf(TLineData));

GlobalUnlock(Data); end;

В первой строке кода я пытаюсь получить данные из буфера обмена с помощью функции GetAsHandle. Этой функции нужно передать формат, в котором мы хотим получить данные. Если значение, которое нам вернула GetAsHandle равно нулю, то данных в буфере нет, или они имеют несовместимый формат. В этом случае процедура прерывает своё выполнение.

Если всё нормально, то в переменной Data будет указатель на блок памяти с данными буфера обмена. Для их получения я блокирую память и пользуюсь уже знакомой процедурой Move для копирования данных из памяти буфера обмена (первый параметр) в структуру LineData (второй параметр).

Данные получены, можно разблокировать память с помощью процедуры GlobalUnlock.

Всё, модуль готов. Теперь переходим к написанию основной программы, которая будет использовать созданный нами формат данных для копирования и вставки через буфер обмена. У нас уже создан новый проект, в котором мы написали модуль ClipboardFormatUnit. Перейди в основное окно, и помести на форму следующие компоненты:

1. 1. Две кнопки «Копировать» и «Вставить».

2. 2. Компонент StringGrid. В нём нужно изменить свойство goEditing в разделе Option на true, чтобы мы могли редактировать ячейки в сетке.

3. 3. Memo в котором мы будем отображать содержимое буфера в виде текста.

 

Мою форму ты можешь увидеть на рисунке 23.4.1. Для реализации кнопок я использовал компонент ToolBar, чтобы программа выглядела более эстетично и красиво, но ты можешь поступить и по-другому.

Сразу же добавь в раздел usesнаш модуль ClipboardFormatUnit, чтобы ты мог использовать новый формат из главной формы.

Теперь создадим обработчик события OnClick для кнопки «Копировать» и напишем в нём следующее:

Procedure TForm1.CopyButtonClick(Sender: TObject); var

LineClipboard.LineData.Name:=StringGrid1.Cells[0, StringGrid1.Row]; LineClipboard.LineData.LastName:=StringGrid1.Cells[1, StringGrid1.Row];… LineClipboard.CopyToClipboard; LineClipboard.Free; end;

Procedure TForm1.PasteButtonClick(Sender: TObject); var LineClipboard:TLineClipboard; begin

LineClipboard:=TLineClipboard.Create;

If Clipboard.HasFormat(CF_PERSONDATA) then

end; LineClipboard.Free; Memo1.Lines.Clear; Memo1.PasteFromClipboard; end;

– Конец работы –

Используемые теги: Буфер, обмена, Стандартные, компоненты, Delphi0.084

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Буфер обмена и стандартные компоненты Delphi

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Возрастные особенности белкового, углеводного, жирового обмена и обмена витаминов у детей
Особое значение для детского организма имеет соотношение некоторых аминокислот.В период роста наиболее благоприятным является соотношение: триптофан… Потребность в пищевом белке на 1 кг. веса тела с возрастом постепенно… Потребность в полиненасыщенных жирных кислотах (ПНЖК) определяется по содержанию в пищевом рационе линолевой кислоты:…

Пасивні компоненти. Резистори. Конденсатори. Індуктивні компоненти
Перелік скорочень Вступ Пасивні компоненти... ПЕРЕЛІК СКОРОЧЕНЬ...

Дать содержательную интерпретацию первых двух главных компонент, используя вращение осей координат главных компонент
На сайте allrefs.net читайте: 8.дать содержательную интерпретацию первых двух главных компонент, используя вращение осей координат главных компонент;...

Дать содержательную интерпретацию первых двух главных компонент, используя вращение осей координат главных компонент
На сайте allrefs.net читайте: 8.дать содержательную интерпретацию первых двух главных компонент, используя вращение осей координат главных компонент;...

Компонент Memo обладает рядом типичных для визуальных компонентов свойств
Компонент Memo класс TMemo... Пиктограмма... Компонент Memo представляет собой поле для отображения и редактирования текста Текст можно загрузить из файла...

Тема коллоквиума Введение в обмен веществ. Цепь переноса электронов. Общие пути катаболизма. Обмен углеводов
Кафедра общей и биологической химии... Факультет Общая медицина... Тема коллоквиума Введение в обмен веществ Цепь переноса электронов Общие пути катаболизма Обмен углеводов...

Раздел второй. Экономика Натурального обмена. Глава 5. Чистый обмен и основы разделения труда
Экономика Натурального обмена... Глава Чистый обмен и основы разделения труда...

Компоненты Delphi для работ с БД
Обычно БД создается для хранения и доступа к данным, содержащим сведения о некоторой предметной области, то есть некоторой области человеческой… По своей архитектуре СУБД делятся на автономные, файл - серверные, клиент -… Сеть не используется. Автономные базы данных полезны для развития тех приложений, которые распространены среди многих…

ПАТОФИЗИОЛОГИЯ ВОДНО-СОЛЕВОГО ОБМЕНА
Кафедра патофизиологии... Лечебный и педиатрический факультеты... Зав каф проф В П Михайлов...

ПАТОФИЗИОЛОГИЯ ВОДНО-СОЛЕВОГО ОБМЕНА
Кафедра патофизиологии... Лечебный и педиатрический факультеты... Зав каф проф В П Михайлов...

0.034
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам