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