Кент Рейсдорф. 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 и убедитесь, что все работает так, как ожидалось.

Web-дизайн (с) 2010 All rights reserved