Автор: Пользователь скрыл имя, 10 Ноября 2012 в 20:14, контрольная работа
Основные понятия объективно-ориентированного программирования. Элементы объектно-ориентационного программирования. Инкапсуляция, наследование, полиморфизм. Виртуальное программирование: среда систем, элементы систем (форма, панель свойств, панель инструментов). Компоненты программ. Свойства, события, методы.
Обратите внимание, что функция уже приготовлена для вас, и все, что осталось сделать - это ввести необходимый код. Если вы внимательнее посмотрите на эту функцию, то заметите, что она называется ButtonClick, является членом класса TPMEForm, возвращает void и принимает в качестве аргумента указатель с именем Sender на объект класса TObject. (Я расскажу об аргументе Sender чуть позже.) Все, что осталось сделать - это ввести код, который будет отображать или скрывать компонент Memo при последовательных нажатиях кнопки. Мы заимствуем часть кода из предшествующего обсуждения методов. Отредактируйте функцию ButtonClick в соответствии с образцом:
void __fastcall TPMEForm::ButtonClick(Tobject
*Sender)
{
static bool isVisible;
isVisible = !isVisible;
if(isVisible)Memo->Hide();
else Memo->Show();
}
В этом коде объявляется статическая переменная с именем isVisible.
Статическая переменная (static variable) сохраняет свое значение между вызовами функции.
Статические переменные являются исключением из правила, касающегося неинициализированных переменных - они по умолчанию инициализируются нулем. В данном случае isVisible является булевой переменной и инициализируется значением false.
Вторая строка кода функции
меняет значение булевой переменной
на противоположное, применяя операцию
логического отрицания к
Помните, как вы изменили значение свойства Name компонента Memo1 на Memo? Когда вы делали это, С++Builder работал за кулисами. Сначала он создал новый класс на основе класса ТМеmо. Затем создал динамический экземпляр нового класса и присвоил ему имя Memo1. В нашем коде Memo является указателем на объект. Вот почему доступ p style=strongк функциям Show() и Hide() осуществляется с помощью оператора косвенного доступа.
Вот и все! Но работает ли это? Давайте проверим. Щелкните на кнопке Run оперативной панели. После компиляции программа будет запущена и на экране появится ее окно. Вот и настал момент истины. Щелкните на кнопке, и компонент Memo исчезнет. Щелкните на кнопке еще раз, и он снова появится. Ура! Заработало! Наигравшись с программой, закройте ее (с помощью кнопки Close Program в верхнем левом углу строки заголовка). Вы окажетесь снова в редакторе кода.
Однако все эти манипуляции со статической булевой переменной немного сложноваты. Вернемся назад к обсуждению свойств. Не лучше ли было компоненту Memo иметь специальное свойство, которое позволяло бы узнать, является ли он в данный момент видимым? Конечно, такое свойство есть! Как можно было ожидать, оно называется Visible. Давайте его используем. Отредактируйте функцию еще раз, пока она не будет выглядеть так, как здесь:
void __fastcall TPMEForm::ButtonClick(TObject
*Sender)
{
if(Memo->Visible)Memo->Hide();
else Memo->Show();
}
Снова запустите программу. Кнопка будет работать так, как ей положено. Итак, мы ухитрились использовать свойства, методы и события в одном примере.
Как вы заметили, функция ButtonClick() принимает указатель с именем Sender на объект TObject. Каждая функция-обработчик события будет иметь по крайней мере один аргумент Sender. В зависимости от события, функция может также принимать один или несколько дополнительных аргументов. Например, обработчик события OnMouseDown выглядит следующим образом:
void __fastcall TPMEForm::ButtonMouseDown(
TMouseButton Button, TShiftState Shift, Integer X, Integer Y)
{
}
В данном случае вы получите информацию о том, какая кнопка мыши была нажата, какая при этом была нажата клавиша на клавиатуре и координаты (х,у) курсора во время нажатия кнопки мыши. Функция-обработчик содержит всю информацию, которая необходима для реакции на событие.
Что же представляет собой Sender? Это указатель на компонент, который посылает сообщение обработчику. В нашем примере аргумент Sender является излишним, поскольку мы знаем, что сообщение исходит от кнопки Show/Hide. Вообще, Sender позволяет иметь один обработчик событий для нескольких компонентов. Для иллюстрации, давайте создадим новую кнопку и сделаем одну из кнопок кнопкой Show, а другую - кнопкой Hide.
1. Если редактор кода
находится на переднем плане,
нажмите F12, чтобы переключиться
обратно в редактор форм.
2. Выделите кнопку Show/Hide, щелкнув
на ней мышью. Измените значения свойств Name и Caption на Show.
3. Добавьте к форме новую кнопку справа
от кнопки Show. Если хотите,
выровняйте кнопки, чтобы форма выглядела
лучше.
4. Измените значение свойства Name новой кнопки
на Hide. Значение
свойства Caption также изменится
на Hide после того,
как вы нажмете Enter.
5. Щелкните на кнопке Show, а затем на
вкладке Events инспектора
объектов. Обратите внимание, что для события OnClick теперь указано
имя обработчика ShowClick. Замените
его снова на ButtonClick. (Начальное
имя обработчика устанавливается по умолчанию.
Вы можете изменить его на любое другое.)
6. Щелкните на кнопке Hide и найдите
событие OnClick в окне инспектора
объектов. Справа будет находиться кнопка
со стрелкой. Щелкните на ней и выберите ButtonClick из выпадающего
списка (в нем сейчас должно быть только
одно имя функции).
7. Дважды щелкните на значении ButtonClick. Окно редактора
кода окажется на переднем плане и курсор
будет располагаться в функции ButtonClick(). Измените
код так, чтобы он выглядел следующим образом:
void _fastcall TPMEForm::ButtonClick(Tobject
*Sender)
{
if(Sender == Hide)Memo->Hide();
else Memo->Show();
}
Сейчас ваша форма должны выглядеть как на рисунке 5.4. Откомпилируйте и запустите программу. Щелкните на каждой кнопке и убедитесь, что они работают, как предполагалось.
Итак, мы создали одну функцию, которая обрабатывает события OnClick для обеих кнопок. Мы использовали параметр Sender, чтобы определить, какая кнопка послала сообщение о событии OnClick, и затем скрыть или показать компонент Memo. Мы могли создать отдельные обработчики для каждой кнопки, но тогда код стал бы менее компактным. Кроме того, это хороший пример использования параметра Sender.
Вы могли заметить, что после создания обработчика события OnClick для одного из компонентов, можно связать этот обработчик с событием OnClick любого компонента формы. В дальнейшем я расскажу о событиях подробнее.
Правила работы с событиями