Properties, показан на рис. 11.82. Там же приводится измененный стиль окантовки страницы и появление полос прокрутки, которые явились следствием изменения свойств
BorderStyle и
AutoScroll
378 Часть II. Приложения Windows Рис 11.82. Свойства страницы компонента Как защитить страницу от неавторизованного доступа
Бывают случаи, когда требуется защитить информацию, расположенную на странице, от неавторизованного доступа. Например, на странице хранятся сведения, доступ к которым ограничен и может происходить только по паролю. Поэтому разработчик приложения должен уметь отказывать в доступе к странице. Закрыть страницу можно программным способом (в обработчике события
SelectedIndexChanged компонента
TabControl
). Это событие возникает, когда пользователь переключается от одной страницы к другой. Надо проверить права пользователя, принятые для данного приложения, и если прав недостаточно, то закрыть страницу, к которой должен быть переход, выдать пользователю соответствующее сообщение и вернуться на предыдущую страницу. Рассмотрим такой простой вариан защиты доступа к странице запишем в
ListBox имена закрытых страниц (можно усложнить задание и добавить пароли доступа к странице, по которым они открываются. А в обработчике события
SelectedIndexChanged проверять имя открываемой страницы на попадание ее в "черный" список. Если страница присутствует в этом списке, то следует уменьшить ее индекс на единицу и вернуться к предыдущей странице. Пример такого обработчика (без проверки на пароли, т. к. это уже сугубо индивидуальные структуры) приведен в листинге 11.21, а результаты работы — на рис. 11.83 и 11.84. Отметим, что для добавления страницы в компонент на этапе дизайна надо открыть его контекстное меню и выполнить опцию Add Tab. А чтобы установить курсор мыши на
TabControl
, надо установить его на полосу после последней вкладки.
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
379 Задание недоступных страниц в е Вид формы приложения в режиме дизайна Переключение на доступную страницу Рис 11.83. Закрытие доступа к некоторым страницам. Часть Рис 11.84. Закрытие доступа к некоторым страницам. Часть Листинг 11.21
private: System::Void tabControl1_SelectedIndexChanged_1(System::Object^ sender, System::EventArgs^ e)
{
String ^s=this->tabControl1->SelectedTab->Name; for(int i=0; i < this->listBox1->Items->Count; i++)
{ if(!s->Compare(s,this->listBox1->Items[i]->ToString())) можно
закрыть страницу таким способом
{
Эта страница для Вас закрыта, "Приложение 66",
MessageBoxButtons::OK,MessageBoxIcon::Asterisk);
380 Часть II. Приложения Windows Form вернуть индекс назад
Int j=this->tabControl1->SelectedIndex -1; this->tabControl1->SelectTab(j); break;
}
}//for
} Задача регистрации пользователя
вприложенииКогда разработанное приложение сдается в эксплуатацию, первое, на что обращает внимание заказчик, это то, как осуществлена защита приложения от постороннего вмешательства. На основе уже знакомых нам компонентов рассмотрим простейшую задачу защиты — задачу регистрации пользователя в приложении.
Здесь имеется ввиду тот факт, что для входа в приложение пользователь должен, как и во всех порядочных системах, зарегистрироваться, те. набрать свое имя и пароль. Если все, что он набрал, верно, то доступ к приложению открыт. Рассмотрим приложение, в котором в качестве основного компонента используется
TabControl
. В нем должно разместиться все приложение, начиная со й страницы а на й странице расположится программа регистрации. Если регистрация пройдет успешно, то откроется я страница. Мы специально взяли всего две страницы для примера (в реальной ситуации надо открыть доступ к соответствующим страницам по паролю. Уже на первой
странице располагаются компоненты кнопки,
TextBox и Здесь в режиме дизайна формируются три строки с паролями. Пароль состоит из трех частей, отделенных друг от друга косой чертой имя пользователя, собственно пароль и дата, до которой действует пароль. Свойство
Visuble
ListBox устанавливается в false
, чтобы в режиме исполнения он не был виден. Кнопка, разрешающая администратору задачи открывать список паролей для просмотра, тоже заблокирована (становится недоступной для нажатия ее свойство
Enabled на этапе проектирования установлено в У администратора имеется свой пароль (admin), который для простоты "зашит" в программу. Если пользователь наберет имя,
соответствующее паролю администратора, кнопка разблокируется и высветится список паролей. При повторном нажатии на эту кнопку список паролей исчезает, и кнопка снова блокируется. Вовремя работы на первой вкладке остальные будут заблокированы. При вводе данных регистрации признаком окончания ввода является нажатие клавиши
. Форма с компонентами, реализующими регистрацию, а также результаты ее выполнения показаны на рис. 11.85 и 11.86. Текст приложения приводится в листинге Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
381 Рис 11.85. Регистрация пользователя в приложении. Часть Рис 11.86. Регистрация пользователя в приложении. Часть 2
382 Часть II. Приложения Windows Листинг 11.22
#pragma once namespace TabControl3_User_Reg2011 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public ref class Form1 : public System::Windows::Forms::Form
{ public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
/// Clean up any resources being used.
///
Form1()
{ if (components)
{ delete components;
}
} private: System::Windows::Forms::TabControl^ tabControl1; protected: private: System::Windows::Forms::TabPage^ tabPage1; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::TabPage^ tabPage2; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::TextBox^ textBox2; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Label^ label3; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::ListBox^ listBox1; private: System::Windows::Forms::Button^ button2;
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
383
private:
///
/// Required designer variable. Здесь пользовательская информация int глобальные
String ^w,^us,^pas;
String ^key; ключ открытия й страницы private: System::Windows::Forms::Label^ label4;
///
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
///
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// void InitializeComponent(void)
{ this->tabControl1 = (gcnew System::Windows::Forms::TabControl()); this->tabPage1 = (gcnew System::Windows::Forms::TabPage()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button1 = (gcnew System::Windows::Forms::Button()); this->textBox2 = (gcnew System::Windows::Forms::TextBox()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->label3 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->label1 = (gcnew System::Windows::Forms::Label()); this->tabPage2 = (gcnew System::Windows::Forms::TabPage()); this->label4 = (gcnew System::Windows::Forms::Label()); this->tabControl1->SuspendLayout(); this->tabPage1->SuspendLayout(); this->tabPage2->SuspendLayout(); this->SuspendLayout();
//
// tabControl1
// this->tabControl1->Controls->Add(this->tabPage1); this->tabControl1->Controls->Add(this->tabPage2); this->tabControl1->Location = System::Drawing::Point(16, 15); this->tabControl1->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->tabControl1->Name = L"tabControl1"; this->tabControl1->SelectedIndex = 0;
384 Часть II. Приложения Windows Form
this->tabControl1->Size = System::Drawing::Size(537, 337); this->tabControl1->TabIndex = 0; this->tabControl1->SelectedIndexChanged += gcnew
System::EventHandler(this, &Form1::tabControl1_SelectedIndexChanged);
//
// tabPage1
// this->tabPage1->Controls->Add(this->listBox1); this->tabPage1->Controls->Add(this->button2); this->tabPage1->Controls->Add(this->button1); this->tabPage1->Controls->Add(this->textBox2); this->tabPage1->Controls->Add(this->textBox1); this->tabPage1->Controls->Add(this->label3); this->tabPage1->Controls->Add(this->label2); this->tabPage1->Controls->Add(this->label1); this->tabPage1->Location = System::Drawing::Point(4, 25); this->tabPage1->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->tabPage1->Name = L"tabPage1"; this->tabPage1->Padding = System::Windows::Forms::Padding(4, 4, 4, 4); this->tabPage1->Size = System::Drawing::Size(529, 308); this->tabPage1->TabIndex = 0; this->tabPage1->Text = Регистрация пользователя this->tabPage1->UseVisualStyleBackColor = true;
//
// listBox1
// this->listBox1->FormattingEnabled = true; this->listBox1->ItemHeight = 16; this->listBox1->Items->AddRange(gcnew cli::array< System::Object^ >(3)
{L"us1/pas1/02.02.2012", L"us2/pas2/15.07.2012",
L"us3/pas3/31.12.2012"}); this->listBox1->Location = System::Drawing::Point(19, 186); this->listBox1->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(457, 116); this->listBox1->TabIndex = 7; this->listBox1->Visible = false;
//
// button2
// this->button2->Enabled = false; this->button2->Location = System::Drawing::Point(441, 22); this->button2->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(36, 146); this->button2->TabIndex = 6; this->button2->Text = Администратор
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
385
this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this,
&Form1::button2_Click);
//
// button1
// this->button1->Location = System::Drawing::Point(8, 22); this->button1->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(25, 146); this->button1->TabIndex = 5; this->button1->Text = Выход this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click);
//
// textBox2
// this->textBox2->Location = System::Drawing::Point(160, 118); this->textBox2->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->textBox2->Name = L"textBox2"; this->textBox2->PasswordChar = '*'; this->textBox2->Size = System::Drawing::Size(132, 22); this->textBox2->TabIndex = 4; this->textBox2->KeyDown += gcnew
System::Windows::Forms::KeyEventHandler(this, &Form1::textBox2_KeyDown);
//
// textBox1
// this->textBox1->Location = System::Drawing::Point(160, 73); this->textBox1->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->textBox1->Name = L"textBox1"; this->textBox1->PasswordChar = '*'; this->textBox1->Size = System::Drawing::Size(132, 22); this->textBox1->TabIndex = 3; this->textBox1->KeyDown += gcnew
System::Windows::Forms::KeyEventHandler(this, &Form1::textBox1_KeyDown);
//
// label3
// this->label3->Location = System::Drawing::Point(43, 122); this->label3->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); this->label3->Name = L"label3"; this->label3->Size = System::Drawing::Size(65, 28); this->label3->TabIndex = 2; this->label3->Text = Пароль
//
// label2
//
386 Часть II. Приложения Windows Form
this->label2->Location = System::Drawing::Point(43, 73); this->label2->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(109, 49); this->label2->TabIndex = 1; this->label2->Text = Имя пользователя
//
// label1
// this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif",
15.75F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, static_cast(204))); this->label1->Location = System::Drawing::Point(47, 22); this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(411, 28); this->label1->TabIndex = 0; this->label1->Text = Трудоустройство this->tabPage2->Location = System::Drawing::Point(4, 25); this->tabPage2->Margin = System::Windows::Forms::Padding(4, 4, 4, 4); this->tabPage2->Name = L"tabPage2"; this->tabPage2->Padding = System::Windows::Forms::Padding(4, 4, 4, 4); this->tabPage2->Size = System::Drawing::Size(529, 308); this->tabPage2->TabIndex = 1; this->tabPage2->Text = Приложение this->tabPage2->UseVisualStyleBackColor = true;
//
// label4
// this->label4->Location = System::Drawing::Point(155, 94); this->label4->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); this->label4->Name = L"label4"; this->label4->Size = System::Drawing::Size(197, 47); this->label4->TabIndex = 0; this->label4->Text = Здесь размещаются компоненты приложения
//
// Form1
// this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(548, 348); this->Controls->Add(this->tabControl1); this->Margin = System::Windows::Forms::Padding(4, 4, 4, 4);
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
387
this->Name = L"Form1"; this->Tag = L""; this->Text = Городское агентство по трудоустройству this->Shown += gcnew System::EventHandler(this, &Form1::Form1_Shown); this->Resize += gcnew System::EventHandler(this, &Form1::Form1_Resize); this->tabControl1->ResumeLayout(false); this->tabPage1->ResumeLayout(false); this->tabPage1->PerformLayout(); this->tabPage2->ResumeLayout(false); this->ResumeLayout(false);
}
#pragma endregion private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e)
{ this->Close();
} private: System::Void textBox1_KeyDown(System::Object^ sender,System::Windows::Forms::KeyEventArgs^ e)
{ if(e->KeyCode == Keys::Enter)
{
проверка UserName
String ^s; int jj; s=this->textBox1->Text; jj=s->Compare(s,"admin"); if(!jj) это имя администратора
{ this->button2->Enabled=true; открывается его кнопка this->button2->Focus(); this->textBox2->Text=""; return;
} int j=0,i=0; for(i=0;ilistBox1->Items->Count; i++)
{ w=this->listBox1->Items[i]->ToString(); int pos=w->IndexOf("/"); us=w->Substring(0,pos); jj=s->Compare(s,us); if(jj) continue; else
{ j++;
388 Часть II. Приложения Windows Form int pos1=pos+1; // break;
}
} //for if(!j)
{
Ошибка в UserName", "Приложение
67",MessageBoxButtons::OK,MessageBoxIcon::Asterisk); this->textBox1->Text=""; this->textBox1->Focus(); return;
}
Здесь имя пользователя найдено, надо идти на ввод пароля this->textBox1->Text=""; this->textBox2->Text=""; this->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=this->textBox2->Text; int j=0; int pos=w->IndexOf("/"); Подгонка под начало поиска го
разделителя после найденного.
й всегда найдется, т. кон нашелся
при поиске UserName int pos1=w->IndexOf("/",pos+1); ищется й разделитель if(!pos1)
{
Ошибка в строке паролей, "Приложение ",MessageBoxButtons::OK,MessageBoxIcon::Asterisk); this->textBox2->Text=""; this->textBox2->Focus(); return;
} pas=w->Substring(pos+1, (pos1 — pos -1)); int jj=s->Compare(s,pas); if(jj)
{
Ошибка в Password", "Приложение ",MessageBoxButtons::OK,MessageBoxIcon::Asterisk);
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
389
this->textBox2->Text=""; this->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;
Срок действия пароля истек, "Приложение ",MessageBoxButtons::OK,MessageBoxIcon::Asterisk); this->textBox2->Text=""; this->textBox2->Focus(); return;
} return; this->textBox1->Text=""; this->textBox2->Text=""; this->tabControl1->SelectedIndex=1;
}//if Key== обработчик
//------------------------------------------------------------------ private: System::Void tabControl1_SelectedIndexChanged(System::Object^ sender,System::EventArgs^ e)
{ int i=key->Compare(key,pas); if(!i)
{ this->tabControl1->SelectedIndex =0;
}
} private: System::Void Form1_Resize(System::Object^ sender,
System::EventArgs^ e)
{ this->textBox1->Focus(); установка фокуса ввода на UserName
} private: System::Void Form1_Shown(System::Object^ sender,System::EventArgs^ e)
{ this->textBox1->Focus(); установка фокуса ввода на UserName
}
390 Часть II. Приложения Windows Formprivate: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e)
{ if(this->listBox1->Visible==false) this->listBox1->Show(); else
{ this->listBox1->Hide(); this->button2->Enabled=false; this->textBox1->Text=""; this->textBox1->Focus();
}
}
}; класс
}//namespace Компонент Компонент находится в списке