Главная » C++, C++ Builder » События в страничных диалогах C++ Builder

0

Создать страничный диалог просто. Работать с событиями страничного диалога должно бать так же просто, не так ли? И да и нет. Описать обработчик события для страничного диалога просто, поскольку все обработчики событий содержатся в системе CBuilder. Определить, которое событие вам надо отследить и как его обработать — это отдельная история.

Первое событие в страничном диалоге, которое может иметь для нас какое-нибудь значение, это событие OnTabChanging (при переходе на страницу). Это событие — член объекта формы PageControl. Оно происходит, когда пользователь выбирает новую страницу. Объект PageControl вызывает обработчик события для объекта текущей формы PageControl, чтобы проверить, можно ли уйти с этой формы. В нашем первом примере мы устроим некоторую проверку того, действительно ли можно уйти с текущей страницы и как этого избежать.

На первую страницу добавьте три поля редактирования, а над ними статическое текстовое поле

«Введите текст в одно из нижележащих полей». Установите свойство Text всех трех полей редактирования в пустое значение. Вы можете сделать это быстро, выбрав все три поля редактирования и удалив текст в поле свойства Text в Object Inspector. Находясь в нем, измените названия страниц, выбирая объекты TabSheet и  изменяя их свойство Caption. Первую  страницу озаглавьте Страница 1, вторую — Страница 2, третью — Страница 3. Когда вы закончите, первая страница будет выглядеть, как показано на рис. 4.12.

Рис. 4.12. Первая страница страничного диалога

Добавьте новый обработчик для события OnTabChanging, выбрав PageControl (вы можете это сделать, щелкнув мышью в поле страницы диалога) и обратившись к странице Events в Object Inspector. Озаглавьте новый обработчик события HandlePageChanging. В обработчик HandlePageChanging добавьте следующий код:

void __fastcall TPageDlg::HandlePageChanging(TObject *Sender,

bool &AllowChange)

{

// Если это первая страница, то покинуть ее можно

// только после того, как ввели значение в

// одно из полей редактирования

if ( PageControl->ActivePage == TabSheet1 )

{

if ( Edit1->Text == "" && Edit1->Text == "" && Edit1->Text == "" )

{

MessageBox(NULL, "Вы ДОЛЖНЫ ввести текст!", "Ошибка", MB_OK);

Edit1->SetFocus(); AllowChange = false; return;

}

}

// В противном случае запоминаем активную страницу

FnCurTab = PageControl1->ActivePage->PageIndex;

}

Вам надо добавить описание переменной FnCurTab в заголовочный файл. Следующую строку добавьте в секцию частных объявлений заголовочного файла формы:

int FnCurTab;

Что здесь происходит?

В коде, только что добавленном вами в обработчик, есть пара важных для нас моментов. Первый

— это концепция активной страницы. У каждого объекта PageControl есть единственная активная страница. В случае события OnTabChanging активной страницей будет та, с  которой  мы собираемся уйти, а не та, на которой щелкнул мышью пользователь. Таким образом, событие OnTabChanging используется для проверки ввода, осуществленного в текущей форме.  Свойство ActivePage — это просто указатель на одну из страниц страничного диалога. И в нашей проверке мы выясняем, является ли активная страница (то есть та, с которой мы собираемся уйти) первой. Если да, то мы проверяем, введено ли что-нибудь хотя бы в одно из полей редактирования. Ведь об этом, в конце концов, просит надпись на этой странице.

Если все поля редактирования пусты, то есть если в них ничего не было введено, то программа выводит окно сообщения об ошибке, устанавливает курсор в первое поле редактирования и изменяет значение параметра AllowChange в false. Это удерживает страничный управляющий элемент от перехода  какой бы ни было другой странице.

Если пользователь все же что-то ввел в одно из полей, мы должны позволить ему перейти на другую страницу. В этом случае мы просто оставляем параметр AllowChange без изменений, ведь

его значение по умолчанию есть true. Далее мы запоминаем текущую страницу (ту, которая была отображена) для последующего использования.

Совет

Откуда мы знаем, что AllowChange — выходной параметр метода? В основном CBuilder передает объекты, которые не должны изменяться методом, по значению или по указателю. Параметры же, которые могут быть изменены методом, передаются по ссылке. Ссылка на объект —  это  имя объекта, перед которым стоит символ & (амперсанд), например, bool &AllowChanges, а не bool AllowChanges.

Если вы теперь скомпилируете и запустите приложение, то увидите, что с первой страницы нельзя уйти, не введя чего-нибудь хотя бы в одно поле редактирования. Это не ограничивает вас  от введения значений более, чем в одно поле и никоим образом не проверяет вводимые значения. Просто производится проверка, что какая-то информация введена. Таким же точно образом можно проверить и допустимость вводимых данных, и количество заполненных полей.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии