Шаг 187.
Microsoft Visual C++ 2010. Язык С/С++. Компоненты Windows Forms. Компонент TabControl. Задача регистрации пользователя в приложении

    На этом шаге мы рассмотрим еще один пример использования этого компонента.

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

    Рассмотрим приложение, в котором в качестве основного компонента используется TabControl. В нем должно разместиться все приложение, начиная со 2-й страницы (а на 1-й странице расположится программа регистрации).


Рис.1. Приложение на этапе разработки

    Если регистрация пройдет успешно, то откроется 2-я страница. Мы специально взяли всего две страницы для примера (в реальной ситуации надо открыть доступ к соответствующим страницам по паролю).

    Уже на первой странице располагаются компоненты: кнопки, TextBox, ListBox. Здесь в режиме дизайна формируются три строки с паролями. Пароль состоит из трех частей, отделенных друг от друга косой чертой: имя пользователя, собственно пароль и дата, до которой действует пароль.

    Свойство Visible ListBox устанавливается в False, чтобы в режиме исполнения он не был виден. Кнопка, разрешающая администратору задачи открывать список паролей для просмотра, тоже заблокирована (становится недоступной для нажатия) - ее свойство Enabled на зтапе проектирована установлено в False.

    У администратора имеется свой пароль (admin), который для простоты "зашит" в программу. Если пользователь наберет имя, соответствующее паролю администратора, кнопка разблокируется и высветится список паролей. При повторном нажатии на эту кнопку список паролей исчезает, и кнопка снова блокируется.

    Во время работы на первой вкладке остальные будут заблокированы. При вводе данных регистрации признаком окончания ввода является нажатие клавиши Enter.

    Форма с компонентами, реализующими регистрацию, представлена на рисунке 1, результаты ее выполнения показаны на рисунке 2. Текст обработчиков приведен ниже.

.    .    .    .    .
		}
#pragma endregion
	private:
		int pos, pos1; //глобальные 
		String^ w, ^us, ^pas;
		String^ key; //ключ открытия 1-й страницы 

// Кнопка "Выход"
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
	 Close();
 }
// Обработчик нажатия клавиши в поле "Логин"
private: System::Void textBox1_KeyDown(System::Object^  sender, 
   System::Windows::Forms::KeyEventArgs^  e) {
	 if(e->KeyCode == Keys::Enter) {
		 //проверка UserName 
		 String^ s = textBox1->Text;
		 int jj = s->Compare(s,"admin"); 
		 if(!jj) //это имя администратора 
		 {
			 button1->Enabled = true; //открывается его кнопка 
			 button1->Focus();
			 textBox2->Text = "";
			 return;
		 }
		 int j = 0, i = 0; 
		 for(i=0; i<listBox1->Items->Count; i++)
		 {
			 w = listBox1->Items[i]->ToString();
			 int pos = w->IndexOf("/");
			 us = w->Substring(0, pos);
			 jj = s->Compare(s, us);
			 if(jj) continue;
			 else
			 {
				 j++;
				 int pos1 = pos + 1; 
				 break;
			 }
		 } //for
		 if (!j)
		 {
			 MessageBox::Show("Ошибка в UserName", 
                                 "Защита логином и паролем",
				 MessageBoxButtons::OK,
				 MessageBoxIcon::Asterisk); 
			 textBox1->Text=""; 
			 textBox1->Focus(); 
			 return;
		 }
		 //Здесь имя пользователя найдено, надо идти на ввод пароля
		 textBox2->Text="";
		 textBox2->Focus();
		 return;
	 } //if  (== Enter) 
 }

// Обработчик нажатия клавиши в поле "Пароль"
private: System::Void textBox2_KeyDown(System::Object^  sender, 
    System::Windows::Forms::KeyEventArgs^  e) {
	 //обработка пароля
	 if(e->KeyCode == Keys::Enter) {
		 String^ s=textBox2->Text;
		 int j=0;
		 int pos = w->IndexOf("/"); //подгонка под начало поиска 1-го
		                            //разделителя после найденного.
		 //1-й всегда найдется, т. к. он нашелся 
		 //при поиске UserName
		 int pos1 = w->IndexOf("/", pos+1); //ищется 2-й разделитель 
		 if(!pos1)
		 {
			 MessageBox::Show("Ошибка в строке паролей", 
				 "Защита логином и паролем",
				 MessageBoxButtons::OK,
				 MessageBoxIcon::Asterisk); 
			 textBox2->Text="";
			 textBox2->Focus(); 
			 return;
		 }
		 pas = w->Substring(pos+1, (pos1 - pos - 1)); 
		 int jj = s->Compare(s,pas);
		 if (jj) 
		 {
			 MessageBox::Show("Ошибка в Password", 
				 "Защита логином и паролем",
				 MessageBoxButtons::OK,
				 MessageBoxIcon::Asterisk); 
			 textBox2->Text=""; 
			 textBox2->Focus(); 
			 return; 
		 }
		 //пароль сравнился. Проверяем дату 
		 pos1 = pos1 + 1; 
		 pas = w->Substring(pos1); 
		 DateTime din, dtek; 
		 dtek = dtek.Today;  //текущая дата
		 din = din.Parse(pas);// =StrToDate(pas);  дата из пароля 
		 if(dtek > din)
		 {
			 key = pas; 
			 return;
		 }
		 textBox1->Text = ""; 
		 textBox2->Text = ""; 
		 tabControl1->SelectedIndex = 1;
	 } // Key== 
}//обработчик

// Обработчик переключения вкладок
private: System::Void tabControl1_SelectedIndexChanged(System::Object^  sender, 
    System::EventArgs^  e) {
	 int i = key->Compare(key, pas);
	 if (!i)
	 {
		 tabControl1->SelectedIndex = 0;
	 }
}
// Обработчик изменения размеров формы
private: System::Void Form1_Resize(System::Object^  sender, System::EventArgs^  e) {
	 textBox1->Focus();  //установка фокуса ввода на UserName
 }

// Обработчик первого отображения формы
private: System::Void Form1_Shown(System::Object^  sender, System::EventArgs^  e) {
	 textBox1->Focus();  //установка фокуса ввода на UserName
 }

// Обработчик кнопки "Администратор"
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	 if (listBox1->Visible == false)
		 listBox1->Show(); 
	 else
	 {
		 listBox1->Hide();
		 button1->Enabled = false;
		 textBox1->Focus();
	 }
 }
Архив проекта можно взять здесь.


Рис.2. Результат работы приложения

    На следующем шаге мы рассмотрим компонент Timer.




Предыдущий шаг Содержание Следующий шаг