Консультация онлайн # 161152

Раздел: С / С++
Автор вопроса: Сергей Черняков
Дата: 22.02.2009, 23:15 Консультация неактивна
Поступило ответов: 2
Здравствуйте!Подскажите,пожалуйста,как сделать в с++ Builder,чтобы программа следила за буфером обмена и,если там окажеться что либо начинающееся с цифр,то помещала содержимое буфера в поле Edit.Заранее огромное спасибо!!
Здравствуйте, Сергей Черняков!
Чтобы следить за буфером обмена надо добавить свое окно в цепочку viewer-ов буфера обмена при помощи функции HWND SetClipboardViewer( HWND hWndNewViewer);
В приложении выдержка из MSDN с описанием того, что должен делать viewer буфера обмена.
Дальше, чтобы реализовать требуемое, отрабатывая сообщение WM_DRAWCLIPBOARD, работаем с буфером обмена: анализируем тип содержимого, анализируем содержимое и т.д.
Не забываем давать сообщение следующему viewer-у в цепочке и удалять себя из цепочки в конце работы.

Приложение:


Лысков Игорь Витальевич

Советник
23.02.2009, 11:21
Нет оценки ответа

Ответ # 2, Андрей Кузнецов aka Dr_Andrew (Старший модератор)

Здравствуйте, Сергей Черняков!
Для работы с буфером обмена в среде разработки Borland C++ Builder предусмотрен класс TClipboard. При инициализации приложения, разработанного в данной среде, создаётся один объект данного класса. Для получения доступа к нему имеется функция Clipboard(), которая возвращает указатель на объект TClipboard*. Подключается функция директивой #include <Clipbrd.hpp>
Как известно, буфер обмена может содержать объекты разных форматов (текст, изображение и т.п.). Для проверки, содержится ли в буфере обмена объект заданного формата, предусмотрена функция HasFormat. Чтобы проверить, содержится ли в буфере обмена текст, нужно сделать следующий вызов:
Код
Clipboard()->HasFormat(CF_TEXT);

Для работы с текстом буфера обмена существует ряд функций, но наиболее удобно работать с ним с помощью свойства объекта класса TClipboard AsText. Это свойство соответствует содержимому буфера обмена в текстовом формате CF_TEXT (приведённому к типу AnsiString). При отсутствии в буфере данных этого формата возвращается пустая строка.
Рассмотрим применение объекта TClipboard относительно Вашей задачи (все названия объектов сохранены в том виде, в котором они по умолчанию генерируются средой разработки). Добавим на заготовку формы объекты классов TTimer и TEdit. Предположим, что нам нужно, чтобы содержимое буфера обмена проверялось каждую минуту. Для этого присвоим свойсву Interval таймера Timer1 значение 60000. В обработчике события срабатывания таймера (TForm1::Timer1Timer(TObject *Sender) - см. приложение) запишем код извлечения текста из буфера обмена:
Код
    AnsiString sClipboardContent; // Строка для хранения текста из буфера
    if(Clipboard()->HasFormat(CF_TEXT)) // Если в буфере текст...
    {
        sClipboardContent = Clipboard()->AsText; // ...копируем его в строку.
    }

После этого извлекаем из строки первый символ и, если он оказывается цифрой, то копируем содержимое буфера в поле ввода Edit1.
Удачи!

Приложение:


Андрей Кузнецов aka Dr_Andrew

Старший модератор
23.02.2009, 15:57
Нет оценки ответа

Мини-форум консультации # 161152


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