Объект clipboard visual basic
Наиболее часто эти свойства как раз и используются с объектом Clipboard для операций вставки и вырезания. Причем установка.SelLenght меньше нуля приводит к ошибке выполнения. Изменение .SelStart устанавливает .SelLength в значение ноль. Если установить .SelLength больше, чем длина текста, то оно автоматически станет равной длине текста. Установка .SelText в новое значение устанавливает .SelLength в ноль.
Ну вот, теперь можно двигать дальше.
Объект Clipboard
С системным буфером обмена данных Clipboard мы сталкиваемся постоянно. Именно в него помещаются данные приложения при использовании операций Cut (Вырезать) и Copy (Копировать) и из него берутся при операции Paste (Вставить) в меню Edit, которое есть в практически любой виндусовой программе. Буфер обмена представляет своего рода промежуточное место для хранения данных, которое позволяет, не устанавливая связь между приложениями, тем не менее, переносить данные одного типа из одной программы в другую.
Буфер обмена для всего Windows один. Забрав в буфер данные одного приложения, а затем другого, мы обнаружим, что в буфере хранятся лишь данные последней операции Cut или Copy. Это вызвано тем, что в большинстве случаев, чтобы в буфере не хранилось данных разных приложений, перед загрузкой данных в буфер программа-донор обычно производит его очистку. Посмотреть содержимое буфера можно с помощью утилиты CLIPBRD. EXE, которая обычно имеется в директории C:WindowsSystem32 или аналогичной (в зависимости от Windows, установленной на твоем компьютере). В буфер обмена можно забрать и текст и картинку, потому что он поддерживает разные форматы данных.
Из VB доступ к буферу организуется с помощью объекта Clipboard. Методы объекта практически те же, что и разобранные нами в главе 19 с объектом DataObject, однако повторенье — мать ученья (банальность). Они представлены в нижеследующей таблице:
Методы объекта Clipboard |
||
Clipboard. SetText data, format |
Помещает текстовые данные в буфер обмена, |
Значение format для текстовых данных может принимать следующие значения: vbCFLink (&HBF00) — Диалоговая информация DDE |
Clipboard. GetText (format) |
Возвращает текстовые данные из буфера обмена. Необязательный. Если ожидаемого формата в буфере нет, то возвращается пустая строка. |
|
Clipboard. SetData data, format |
Помещает графические данные в буфер обмена, |
Значение format для графических данных может принимать следующие значения: vbCFBitmap (2) — Растр (.bmp-файлы) |
Clipboard. GetData (format) |
Возвращает графические данные из буфера обмена. Если значение format опущено, то подбирается подходящий формат. Если графический формат не соответствует ожидаемому, то ничего не возвращается. |
|
Clipboard. GetFormat (format) |
Возвращает логические True или False, в зависимости от содержащихся в буфере данных. Для проверки более чем одного метод вызывается повторно. |
Значение format может принимать следующие значения: vbCFLink (&HBF00) — Диалоговая информация DDE |
Clipboard. Clear |
Очищает содержание системного буфера обмена. |
Использовать эти методы очень просто. Для примера создадим новый exe-проект и положим на него два TextBox’а и два PictureBox’а. В качестве управления нашими процессами с помощью Редактора меню создадим простое меню Edit. Подробно о создании меню написано в Главе 9.
Имя нашего меню будет mnuEdit, а строками
mnuCut — Вырезать
mnuCopy — Копировать
mnuPaste — Вставить
mnuDelate — Удалить
Вообще-то у TextBox’а есть свое контекстное меню, но мы сделаем свое общее.
Ну сперва в процедуре Form_Load загрузим в Text1 и Picture1 данные, чтобы нам было с чем работать. В примере я использовал маленькую картинку P00027.jpg. (Кстати поставь свойства TextBox’ов Multiline=True)
Option Explicit ‘хоть у нас и не будет ни одной переменной, но дело принципа Private Sub Form_Load()
Text1 = "Проще Visual Basic ничего нету"
Picture1 = LoadPicture(App. Path & "P00027.jpg") End Sub
Начнем с процедуры для первого пункта подменю "Вырезать" — mnuCut, которая должна копировать данные в буфер и затем очищать объект (Text или Picture):
Private Sub mnuCut_Click()
Сперва нам надо очистить буфер, чтобы в нем не осталась другая информация. Используя метод .Clear это предельно просто.
Clipboard. Clear
Далее мы будем использовать свойство .ActiveControl объекта Screen. С его помощью мы легко затащим в буфер содержимое объекта, которое в настоящий момент активно, т. е. по которой мы щелкнули мышью. Но сперва нам надо определить, а какой это объект, ведь для текста используется метод .SetText, а для графики — .SetData. Здесь мы снова, как и в Главе 18 используем ключевое слово TypeOf, которое поможет определить тип элемента управления, а значит и тип данных.
‘итак, если это текст If TypeOf Screen. ActiveControl Is TextBox Then ‘забираем выделенный текст в буфер
Clipboard. SetText Screen. ActiveControl. SelText ‘а затем удаляем этот выделенный текст из TextBox’а
Screen. ActiveControl. SelText = "" ‘а теперь пишем ветвь, если это картинка ElseIf TypeOf Screen. ActiveControl Is PictureBox Then ‘забираем картинку из активного элемента в буфер
Clipboard. SetData Screen. ActiveControl. Picture ‘и удаляем картинку
Screen. ActiveControl. Picture = LoadPicture() End If
End Sub
Готово, наши данные в буфере обмена. Если у тебя открыт CLIPBRD. EXE, то ты можешь видеть, что творится в буфере. Теперь напишем процедуру для копирования mnuCopy. Единственное, чем она отличается от вырезания, так это тем, что мы не очищаем Text или Picture от копируемых данных.
Private Sub mnuCopy_Click() ‘Очищаем буфер
Clipboard. Clear ‘проверяем тип данных ‘если если это текст If TypeOf Screen. ActiveControl Is TextBox Then ‘забор текста в буфер
Clipboard. SetText Screen. ActiveControl. SelText ‘если это картинка ElseIf TypeOf Screen. ActiveControl Is PictureBox Then ‘забор картинки в буфер
Clipboard. SetData Screen. ActiveControl. Picture End If
End Sub
Теперь нам хорошо-бы из буфера вставить данные в элемент управления. Для этого пишем процедуру Вставить — mnuPaste.
Private Sub mnuPaste_Click() ‘Ну сперва, конечно, проверяем тип, куда мы хотим запихнуть содержимое буфера и если это текст If TypeOf Screen. ActiveControl Is TextBox Then ‘но все равно сразу не пихаем. А вдруг даные были забраны из PictureBox, поэтому мы еще и проверяем ‘с помощью метода GetFormat, а текстовой ли тип в буфере If Clipboard. GetFormat(vbCFText) Then ‘вот если да, то тогда уж вставляем без сомнения
Screen. ActiveControl. SelText = Clipboard. GetText End If ‘а теперь проверка для графических данных ElseIf TypeOf Screen. ActiveControl Is PictureBox Then ‘и здесь мы проверяем тип данных буфера If Clipboard. GetFormat(vbCFDIB) Then ‘и если совпадает, то вставляем
Screen. ActiveControl. Picture = Clipboard. GetData End If
End If
End Sub
Ну и для пущего сходства с приложениями Windows напишем еще процедурку для удаления данных — mnuDelate. Здесь все предельно просто, Мы ведь в буфер ничего на забираем, а проверяем наш активный элемент и очищаем его тем или иным методом. Кстати, пардон, за ошибку в слове mnuDelate (я просто не люблю это слово), но уж исправлять поздно, она в исходнике примера.
Private Sub mnuDelate_Click() ‘проверяем тип данных
‘если это текст If TypeOf Screen. ActiveControl Is TextBox Then ‘удаление выделенного текста
Screen. ActiveControl. SelText = "" ElseIf TypeOf Screen. ActiveControl Is PictureBox Then ‘удаление картинки
Screen. ActiveControl. Picture = LoadPicture() End If
End Sub