Delphi word вставить из буфера
Вообще, копирование пользовательского формата данных в буфер обмена, очень интересная и полезная штука в Ваших собственных приложениях, особенно для тех, в которых необходимо вводить похожие данные. Введя такую функцию в свою программу (сохранение в буфер обмена пользовательского формата данных), Вы бы, может, облегчили работу пользователя по вводу похожих данных, либо еще что-то.
Для этих целей, можно использовать различные временные файлы (.dat, .txt, .ini), это тоже будет правильно, но использование буфера для данных целей, будет более правильно.
Самое что интересное, Вы сможете использовать пользовательский формат данных в буфере обмена и в других своих приложениях, если будете знать название пользовательского формата данных для буфера обмена.
Ну что, давайте приступим. Для начала создадим новый проект и в Uses подключим модуль Clipbrd, который отвечает за работу буфера обмена.
Далее нам необходимо объявить переменную, которая будет отвечать за регистрацию нашего пользовательского формата данных в буфере обмена. У меня выглядит это следующим образом:
Как видите, в данную функцию необходимо передать только один параметр, и этот параметр означает имя нашего пользовательского формата. Если другие приложения будут знать имя или код пользовательского формата данных в буфере обмена, то они также смогут работать с ним.
Поэтому, для того, чтобы зарегистрировать новый формат данных, на событие OnCreate нашей формы напишем следующий код:
У Вас запись может быть любого формата и любого названия, у меня она вышла про студентов:
Далее, нам необходимо объявить два метода, которые будут непосредственно отвечать за копирование нашего пользовательского формата, в буфер обмена, а также за извлечение наших пользовательских данных, из буфера обмена.
Для этого, я в спецификаторе доступа public, объявляю следующие методы:
Это не обязательно делать в спецификаторе доступа public, по Вашему желанию.
Далее, курсором становися на процедуру CopyBuffer и нажимаем сочетание клавиш – Ctrl+Shift+C, в итоге, нам необходимо написать код, для нашей процедуры. Он, у нас будет выглядеть, примерно, следующим образом:
Давайте немного разберемся с ним. Функция GlobalAlloc выделяет некоторую область памяти (размер которой, равен размеру нашей записи), для того, чтобы мы могли записать в нее, пользовательские данные.
С помощью функции GlobalLock, мы фиксируем дискрептор объекта в области памяти и в дальнейшем, данная функция нам возвращает указатель на начальный байт блока памяти объекта.
Далее, мы с помощью Move помещаем содержимое нашей записи в область памяти, которая определена байтом F^ (мы это получили, при помощи функции GlobalLock).
Вот и все. Если Вы это сделаете и нажмете на кнопку копировать и перейдете, например в MS Word или Блокнот, и попробуете вставить туда данные, то у Вас ничего не получится. Как я уже говорил, приложению необходимо знать код пользовательского формата данных, чтобы работать с ним.
Ну, теперь давайте перейдем к вставки данных из буфера обмена. Для этих целей, у нас используется функция LoadBuffer. Поэтому, давайте поставим на нее указатель мыши и нажмем сочетание клавиш Ctrl+Shift+C и начнем писать код, который будет идентичен, только все наоборот.
Ну, давайте посмотрим. Нам необходимо получить дескриптор нашего пользовательского формата данных, затем узнать область памяти, в которой размещаются наши данные и с помощью функции Move из памяти в нашу запись, скопировать данные (при копировании в буфер, мы из записи копировали в буфер обмена, то есть, наоборот). Вот и все, поэтому функция у меня выглядит следующим образом:
Все, теперь нам необходимо лишь написать код для того, чтобы данные записывались в буфер и наоборот, оттуда извлекались.
Давайте на нашей форме разместим 3 компонента TEdit и два TButton. Поэтому на событие кнопки OnClick, которая отвечает за помещение пользовательских данных в буфер обмена, мы напишем следующий код:
Все понятно тут, я думаю, заполняем нашу запись и вызываем процедуру, которая помещает данные в буфер обмена.
Как я говорил раньше, если Вы нажмете кнопку «Копировать» и попробуете вставить, например, в MS Word, у Вас ничего не получится, поэтому давайте на событие OnClick кнопки, которая отвечает за извлечение пользовательских данных из буфера обмена, напишем следующий код:
Тут, тоже должно быть все понятно. Вызываем функцию, которая извлекает пользовательские данные из буфера обмена, а она, как мы помним, возвращает нашу запись, которую потом мы выводим в TEdit. Вот так, выглядит наше приложение:
Заключение
Procedure TForm1.Button1Click(Sender: TObject);
Begin
EnumWindows(@EnumWindowsProc, 1);
wndHandle := -1;
wndField := -1;
If wndHandle > -1 Then
EnumChildWindows(wndJellyHandle, @EnumWindowsProc, 2)
if wndField>-1 then
PostMessage(wndField, WM_PASTE, 0, 0);
End;
вот исходник -
MemoPaste.Lines.LoadFromFile(CurrentDir+"\"+Data[counter].name+".txt");
MemoPaste.SelectAll;
MemoPaste.CopyToClipboard;
SendMessage(GetForeGroundWindow,WM_PASTE,0,0);
В мою программу вставляется если вместо Get. поставить GetFocus() но в ЛЮБОЙ другой (текстовый редактор, к примеру - хренушки)
Надесь на вас, мастера
function GetFromClipBoard : String ; - берём из ClipBoard`а
var HNDl : THandle ;
begin
OpenClipBoard(HW) ; // Отрываем
HNDL := GetClipBoardData(cf_Text) ; // Берем handle данных(текстовых)
Result := PChar(GlobalLock(HNDL)) ; // берём данные по хендлу начиная с первога байта
GlobalUnlock(HNDL) ; // Высвобождаем
EmptyClipBoard ; // очищаем
CloseClipBoard ; // закрываем
end ;
procedure SetToAttached ;
var Wnd : LongWord ; St : String ;
begin
begin
Wnd := GetForeGroundWindow ;
AttachThreadInput(GetWindowThreadProcessID (Wnd,nil),GetCurrentThreadID,true) ; //подключаемся к активному приложению, для получения хендла активного контрола
SendMessage(GetFocus,$0301,0,0) ; //отправляем данные в буффер WM_Copy
St := GetFromClipBoard ; // получаем данные из буффера
. //нужные дейсвия с данными
SendMessage(GetFocus,$0302,0,0) ; //ложим обратно
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),GetCurrentThreadID,false) ; // отключаемся от потока
end ;
Но не желательно так делать. Лучше Использовать WM_CopyData . принцип тот же.
без других процедур копируется содерание TMemo в буфер и вставляется в активное приложение.
Спасибо False_Derilium
Здравствуйте, в этой статье я хотел бы поговорить про то как в своих приложениях можно использовать буфер обмена. Вообще как бы буфер обмена предназначен для временно хранения данных, поэтому в буфер обмена мы можем как записывать информацию, так и получать из него эту самую информацию. Вообще например в нашем случае можно использовать буфер в качестве например программы, которая будет закачивать на сервер какой-нибудь файл. То есть мы выбираем файл и просто выделяем его и нажимаем в 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 формы
А вот теперь можно приступить к работе с буфером, добавляем текст в буфер
РАБОТА С БУФЕРОМ ОБМЕНА
БУФЕР ОБМЕНА С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ
Буфер Обмена — это специальное средство Windows для переноса текста, графики и других данных из окна одного приложения в окно другого. Перенос данных выполняется по инициативе пользователя, поэтому окна, в которых поддерживается работа с Буфером Обмена, имеют в своей строке меню пункт Edit (Правка) со стандартным набором команд:
• Cut (Вырезать) — удаляет выделенный пользователем блок данных в Буфер Обмена;
• Copy (Копировать) — копирует выделенный пользователем блок данных в Буфер Обмена;
• Paste (Вставить) — извлекает блок данных из Буфера Обмена.
Работа с Буфером Обмена происходит по следующей схеме. Сначала пользователь активизирует первое окно, выделяет в нем блок данных (текст или графический образ) и выбирает в меню команду Copy. При этом в Буфере Обмена создается полная копия данных (предыдущие данные из Буфера Обмена удаляются). Затем пользователь акта визирует второе окно и выбирает в меню команду Paste. В результате данные из Буфера Обмена копируются в выбранное место.
МЕТОДЫ КОМПОНЕНТОВ ДЛЯ РАБОТЫ С БУФЕРОМ ОБМЕНА
Некоторые визуальные компоненты Delphi (а именно Edit, Memo, MaskEdit, DBEdit DBMemo, DBImage) имеют специальные методы для работы с Буфером Обмена:
• CutToClipboard — удаляет данные из компонента и помещает их в Буфер Обмена;
• CopyToClipboard — копирует данные в Буфер Обмена;
• PasteFromClipboard — переносит данные из Буфера Обмена в компонент.
Если вы используете один из упомянутых компонентов и перед вами стоит задаче обеспечить работу с Буфером Обмена, то решение состоит в том, чтобы по командам меню Cut, Copy, Paste вызывать соответствующие методы компонента. Поясним сказанное на примере.
Шаг 1. Начните в Delphi новый проект (команда меню File | New Application).
Шаг 2. Поместите на форму компонент Memo (находится в Палитре Компонентов на странице Standard). Установите в компоненте свойство Align в значение alClie nt.
Шаг 3. Поместите на форму компонент MainMenu (находится в Палитре Компонентов на странице Standard). Вызовите у нового компонента Дизайнер Меню и создайте выпадающее меню Edit с пунктами Cut, Copy, и Paste (рис. 8. 17).
Шаг 4. Определите для команд меню следующие обработчики событий OnClick:
procedure TForml. CutlClick ( Sender: TObject);
procedure TFormI. CopylClick (Sender: TObject);
procedure TForml. PastelClick (Sender: TObject);
Шаг 5. Сохраните проект. Главному модулю дайте имя Main. pas, а файлу проекта — Clip. dpr.
Шаг 6. Выполните компиляцию проекта и запустите приложение. Наберите какой-нибудь текст, выделите его и скопируйте в Буфер Обмена. Затем загрузите стандартное приложение Notepad и вставьте текст из Буфера Обмена в позицию курсора. Проделайте то же самое, но с передачей данных из приложения Notepad в свое приложение.
При разработке приложения может оказаться, что компонент не умеет работать с Буфером Обмена. В этом случае вы должны организовать обмен данных сами с помощью объекта Clipboard. Объект Clipboard инкапсулирует Буфер Обмена в Delphi-приложении и объявлен в модуле Clipbrd. Подключив в своей программе модуль Clipbrd,
вы можете использовать свойства и методы объекта Clipboard для обмена данных.
Если вы хотите копировать и вставлять текст, используйте свойство AsText. Например, чтобы скопировать строку текста из компонента Edit1 в Буфер Обмена, запишите:
Clipboard. AsText: = Edit1. Text;
Чтобы извлечь данные, поменяйте местами левую и правую части в операторе присваивания:
Edit1. Text: = Clipboard. AsText ;
Если вы хотите копировать и вставлять картинки или данные объектов, вызывайте метод Assign. Например, чтобы скопировать картинку из компонента Imagel в Буфер Обмена, запишите:
Clipboard. Assign (Imagel. Picture);
Чтобы извлечь данные из Буфера Обмена, просто вызовите тот же метод у объекта:
Imagel. Picture. Assign (Clipboard);
Если в Буфере Обмена находятся данные не того формата, на который вы рассчитываете, то при доступе к ним произойдет исключительная ситуация. Чтобы от нее застраховаться, перед извлечением данных проверьте формат с помощью метода HasFormat. Метод HasFormat принимает код формата в виде положительного целого числа типа Word и возвращает True, если данные с таким форматом существуют в Буфере Обмена. Таким образом, последний оператор правильнее будет записать так::
if Clipboard. HasFormat (CF_PICTURE) then
Imagel. Picture. Assign (Clipboard);
Идентификатор CF_PICTURE — это код формата. Наиболее часто используемые форматы данных имеют зарезервированные коды, описанные в справочнике по Delphi. При необходимости вы можете регистрировать в Windows свои собственные форматы данных с помощью API-функции RegisterClipboardFormat. Функция принимает название формата в виде нуль-терминированной строки и возвращает число типа Word, которое может использоваться в процедурах работы с Буфером Обмена.
Важно понимать, что в Буфере Обмена может находиться несколько блоков данных разного формата. Фактически это одни и те же данные, но представленные в разной форме. Многие приложения, в частности Microsoft Word, помещают данные в Буфер Обмена сразу в нескольких форматах для того, чтобы обеспечить максимальное удобство приложениям, принимающим данные, ведь заранее не известно, какие форматы они поддерживают.
Каждый раз, когда вы помещаете данные в Буфер Обмена, предыдущее содержимое буфера теряется. Когда вы помещаете данные в нескольких форматах, вы должны вызвать метод Open для предотвращения доступа к Буферу Обмена других приложений. Когда операция помещения данных завершена, вы должны вызвать метод Close для того, чтобы другие приложения могли извлечь данные из Буфера Обмена.
Давайте поупражняемся с объектом Clipboard и заменим в предыдущем примере компонент Memo на компонент Image.
Шаг 1. Откройте предыдущий проект и удалите с формы компонент Memo1.
Шаг 2. Поместите на форму компонент Image (находится в Палитре Компонентов на странице Additional). Переведите в компоненте свойство AutoSize в Тше и установите в свойстве Picture какую-нибудь картинку из каталога Delphi 2. 0\Images\Splash\16color (рис. 8. 18).
Шаг 3. Перейдите в Редактор Кода и подключите в секции implementation модуль Clipbrd:
Шаг 4. Перепишите обработчики команд меню:
procedure TFormI. CutlClick (Sender: TObject);
Image1. Picture. Graphic : =nil;
Image1. Height: = 0;
Imagel. Width: = 0;
procedure TFormI. CopylClick (Sender: TObject);
if Imagel.Picture.Graphic <> nil then
Clipboard. Assign (Imagel. Picture);
procedure TFormI. PastelClick ( Sender: TObject);
if Clipboard. HasFormat (CF_PICTURE) then
Imagel. Picture. Assign (Clipboard);
Шаг 5. Выполните компиляцию проекта и запустите приложение. Скопируйте картинку в Буфер Обмена. Затем загрузите графический редактор Paint (стандартное приложение Windows) и вставьте картинку из Буфера Обмена в редактор. Подредактируйте картинку и верните ее в свое приложение через Буфер Обмена.
Читайте также:
- Как почистить историю браузера яндекс на андроиде в телефоне самсунг
- Как установить драйвер qualcomm atheros ar9485wb eg wireless network adapter
- Финансовые функции excel для решения экономических задач
- Как списать ндс с авансов при списании кредиторской задолженности в 1с
- Создание дополнительных потоков команд невозможно 1с