Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
236
Добавлен:
20.03.2016
Размер:
17.83 Mб
Скачать

Глава 11. Компоненты, создающие интерфейс между пользователем и приложением

377

 

 

 

 

 

 

 

 

Рис. 11.81. Демонстрация работы метода активизации страниц

Листинг 11.20

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

if(i== 0)

{

this->tabControl1->SelectTab(i+1); i=1;

}

else

{

this->tabControl1->SelectTab(i-1); i=0;

}

}

Переменная i объявлена как int i:

private:

///<summary>

///Required designer variable. int i;

Некоторые свойства страницы TabPage

Каждая страница компонента TabControl представляет собой отдельный объект — экземпляр класса TabPage со своими свойствами, методами и событиями.

Перечень некоторых свойств страницы, отображенных в окне Properties, показан на рис. 11.82. Там же приводится измененный стиль окантовки страницы и появление полос прокрутки, которые явились следствием изменения свойств BorderStyle

и AutoScroll.

378

Часть II. Приложения Windows Form

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 11.82. Свойства страницы компонента TabControl

Как защитить страницу от неавторизованного доступа

Бывают случаи, когда требуется защитить информацию, расположенную на странице, от неавторизованного доступа. Например, на странице хранятся сведения, доступ к которым ограничен и может происходить только по паролю. Поэтому разработчик приложения должен уметь отказывать в доступе к странице. Закрыть страницу можно программным способом (в обработчике события SelectedIndexChanged компонента TabControl). Это событие возникает, когда пользователь переключается от одной страницы к другой. Надо проверить права пользователя, принятые для данного приложения, и если прав недостаточно, то закрыть страницу, к которой должен быть переход, выдать пользователю соответствующее сообщение и вернуться на предыдущую страницу.

Рассмотрим такой простой вариан защиты доступа к странице: запишем в ListBox имена закрытых страниц (можно усложнить задание и добавить пароли доступа к странице, по которым они открываются). А в обработчике события SelectedIndexChanged проверять имя открываемой страницы на попадание ее в "черный" список. Если страница присутствует в этом списке, то следует уменьшить ее индекс на единицу и вернуться к предыдущей странице. Пример такого обработчика (без проверки на пароли, т. к. это уже сугубо индивидуальные структуры) приведен в листинге 11.21, а результаты работы — на рис. 11.83 и 11.84. Отметим, что для добавления страницы в компонент на этапе дизайна надо открыть его контекстное меню и выполнить опцию Add Tab. А чтобы установить курсор мыши на TabControl, надо установить его на полосу после последней вкладки.

Глава 11. Компоненты, создающие интерфейс между пользователем и приложением

379

Задание недоступных страниц

Вид формы приложения

Переключение

в ListBox'е

в режиме дизайна

на доступную страницу

 

 

 

Рис. 11.83. Закрытие доступа к некоторым страницам. Часть 1

Рис. 11.84. Закрытие доступа к некоторым страницам. Часть 2

Листинг 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())) //можно

//закрыть страницу таким способом

{

MessageBox::Show("Эта страница для Вас закрыта", "Приложение 66",

MessageBoxButtons::OK,MessageBoxIcon::Asterisk);

380

Часть II. Приложения Windows Form

 

 

//вернуть индекс назад

Int j=this->tabControl1->SelectedIndex -1; this->tabControl1->SelectTab(j);

break;

}

}//for

}

Задача регистрации пользователя в приложении

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

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

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

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

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

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

<Enter>.

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

тинге 11.22.

Глава 11. Компоненты, создающие интерфейс между пользователем и приложением

381

 

 

 

 

 

 

 

 

Рис. 11.85. Регистрация пользователя в приложении. Часть 1

Рис. 11.86. Регистрация пользователя в приложении. Часть 2

382

Часть II. Приложения Windows Form

 

 

Листинг 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:

///<summary>

///Clean up any resources being used.

///</summary>

~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:

///<summary>

///Required designer variable.

//Здесь пользовательская информация int pos,pos1;//глобальные

String ^w,^us,^pas;

String ^key; //ключ открытия 1-й страницы

private: System::Windows::Forms::Label^ label4;

/// </summary> System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

///<summary>

///Required method for Designer support — do not modify

///the contents of this method with the code editor.

///</summary>

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 = L"Регистрация пользователя"; 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 = L"Администратор";

Глава 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 = L"Выход"; 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 = L"Пароль";

//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 = L"Имя пользователя";

//

// label1

//

this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 15.75F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,

static_cast<System::Byte>(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 = L"Т р у д о у с т р о й с т в о";

//

//tabPage2

this->tabPage2->Controls->Add(this->label4); 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 = L"Приложение";

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 = L"Здесь размещаются компоненты приложения";

//

// 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 = L"Городское агентство по трудоустройству";

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;i<this->listBox1->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)

{

MessageBox::Show("Ошибка в 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("/"); //Подгонка под начало поиска 1-го

//разделителя после найденного.

//1-й всегда найдется, т. к. он нашелся

//при поиске UserName

int pos1=w->IndexOf("/",pos+1); //ищется 2-й разделитель if(!pos1)

{

MessageBox::Show("Ошибка в строке паролей", "Приложение

",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)

{

MessageBox::Show("Ошибка в 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;

 

 

 

MessageBox::Show("Срок действия пароля истек", "Приложение

 

",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

}