Кент Рейсдорф. BORLAND C++BUILDER. Раздел 3
Кент Рейсдорф. BORLAND C++BUILDER. Страница 379
Если в буфере обмена находится текст, мы разрешаем доступ к кнопке и пункту меню Paste. Если в буфере обмена нет никакого текста, мы запрещаем доступ к пункту Paste. Еще одна глобальная проблема решена.
Использование функции OnIdle() означает, что наш код управления доступом к команде будет вызываться независимо от того, выделяет ли пользователь текст с помощью мыши, клавиатуры или даже в другом приложении.
Как я уже сказал, мы должны создать обработчик для события Onldle. Эта часть довольно проста, так что сначала сделаем ее:
1. Откройте программу ScratchPad и перейдите в редактор кода.
2. Откройте заголовочный файл модуля главной формы (SPMain.h) и добавьте в начало файла после всех #include следующую строку: iinclude <vcl\Clipbrd.hpp>
3. Добавьте в раздел private объявления класса следующее: void fastcall Onldle(TObject* Sender, bools Done);
4. Теперь перейдите в редакторе кода к файлу SPMain.cpp. Добавьте в конец файла следующую функцию:
void__ fastcall TScratchPad::Onldle(TObject* Sender, bools Done)
{
}
5. Найдите функцию MainFormCreate() и добавьте в нее следующую строку:
Application->OnIdle = sOnldle;
Теперь у вас есть функция, которая будет вызываться каждый раз, когда приложение входит в состояние ожидания. Очевидно, что функция не делает ничего полезного, если в ней нет кода, но мы введем его буквально через минуту. А пока добавим код управления доступом к пунктам меню Save, Save As, Undo и Select All. Для этого мы везде используем Onldle. В листинге 13.2 приведена законченная функция OnIdle().
Листинг 13.2. Функция Onldle() программы Scratchpad
Часть этого кода может выглядеть немного странной, если вы не сталкивались с этим прежде. Посмотрите, например, на строку 8. Здесь значение условного выражения Memo->SelLength > 0 присваивается переменной textSe- lected типа bool. Если значение свойства SelLength компонента memo больше О, переменной textSelected присваивается значение true. Если значение свойства SelLength меньше или равно 0 (это означает, что текст не выделен), то переменной присваивается значение false. Это же значение затем присваивается свойствам Enabled различных пунктов меню и кнопок Cut и Сору. Остальной код функции работает таким же образом. Изучите листинг 13.2 и прочитайте комментарии, чтобы понять, как работает эта функция. Введите этот код в функцию OnIdle() программы Scratchpad и убедитесь, что все работает так, как ожидалось.