1 .6 1 . Работа стеле фо нным сп ра во чни ко м. Ч ас ть Рис 1 1 .6 2 . Работа стеле фо нным сп ра во чни ко м. Ч ас ть 2
Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 327 Рис 11.63. Работа с телефонным справочником. Часть Листинг 11.11 #pragma once namespace Tel_Sprav2011 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; //using namespace System::IO::File; using namespace System::Text; //using namespace std; /// /// Summary for Form1 /// public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent();
328 Часть II. Приложения Windows Form // //TODO: Add the constructor code here // } protected: /// /// Clean up any resources being used. /// Form1() { if (components) { delete components; } } private: System::Windows::Forms::Label^ label1; protected: private: System::Windows::Forms::ComboBox^ comboBox1; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::Label^ label3; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::CheckedListBox^ checkedListBox1; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::TextBox^ textBox2; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Button^ button3; private: System::Windows::Forms::Label^ label4; private: System::Windows::Forms::Button^ button4; private: /// /// Required designer variable. int fix; StreamWriter ^sw; /// 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->label1 = (gcnew System::Windows::Forms::Label());
332 Часть II. Приложения Windows Form this->Controls->Add(this->label4); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->textBox2); this->Controls->Add(this->textBox1); this->Controls->Add(this->checkedListBox1); this->Controls->Add(this->button1); this->Controls->Add(this->label3); this->Controls->Add(this->label2); this->Controls->Add(this->comboBox1); this->Controls->Add(this->label1); this->Name = L"Form1"; this->Text = L"Form1"; this->Shown += gcnew System::EventHandler(this, &Form1::Form1_Shown); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void comboBox1_Click(System::Object^ sender, System::EventArgs^ e) { Удаление строки из ComboBox по щелчку на ней int i=this->comboBox1->SelectedIndex; if(i== -1) return; this->comboBox1->Items->Remove(this->comboBox1->SelectedItem); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Когда приложение завершается, надо сохранить данные ChekedListBox ив файлах Сохранение checkedListBox // Create a file to write to String^ path = "d:\\for_tel_sprav_chb.txt"; sw = File::CreateText( path ); //StreamWriter ^ String ^s; int y=this->checkedListBox1->Items->Count; for ( this->checkedListBox1->SelectedIndex = 0; this->checkedListBox1-> SelectedIndex < y-1; this->checkedListBox1->SelectedIndex++ ) { s=this->checkedListBox1->Items[this->checkedListBox1->SelectedIndex]-> ToString(); sw->WriteLine(s); }
Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 333 s=this->checkedListBox1->Items[this->checkedListBox1->SelectedIndex]-> ToString(); sw->WriteLine(s); sw->Close(); Сохранение ComboBox path = "d:\\for_tel_sprav_cb.txt"; sw = File::CreateText( path ); //StreamWriter ^ y=this->comboBox1->Items->Count; if(y==0) { sw->Close(); this->Close(); return; } for ( this->comboBox1->SelectedIndex = 0; this->comboBox1-> SelectedIndex < y-1; this->comboBox1->SelectedIndex++ ) { s=this->comboBox1->Items[this->comboBox1->SelectedIndex]->ToString(); sw->WriteLine(s); } s=this->comboBox1->Items[this->comboBox1->SelectedIndex]->ToString(); sw->WriteLine(s); sw->Close(); this->Close(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Добавить в список String^ r = " "; Формирование в строке r данных, введенных в поля ввода для телефона и комментария r=r->Concat(this->textBox1->Text, r); r=r->Insert(35, this->textBox2->Text); состояние = 0 отключен this->textBox1->Text=""; this->textBox2->Text=""; this->textBox1->Focus(); } private: System::Void textBox1_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { if(e->KeyCode == Keys::Enter)
334 Часть II. Приложения Windows Form { this->textBox2->Focus(); } } private: System::Void textBox2_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { if(e->KeyCode == Keys::Enter) { this->button2->Focus(); } } private: System::Void Form1_Shown(System::Object^ sender, System::EventArgs^ e) { Загрузка компонентов из сохраненных от пред. сеанса файлов Ввод первоначальных данных в ComboBox и CheckedListBox Файл из одной строки, т. к. для ввода применен while() Файл должен быть записан ом как текстовый в кодировке Юникод Очистка компонентов this->comboBox1->Items->Clear(); this->checkedListBox1->Items->Clear(); Запись в checkedListBox String^ path = "d:\\for_tel_sprav_chb.txt"; if ( !File::Exists( path ) ) { // Create a file to write to sw = File::CreateText( path ); // StreamWriter^ try { sw->WriteLine( "Hello" ); Это данные для контроля ввода. sw->WriteLine( "And" ); Если читаемый файл не найден, sw->WriteLine( "Welcome" эти данные выведутся } finally { if ( sw ) delete (IDisposable^)(sw); } } // Open the file to read from TextReader ^ sr = File::OpenText( path ); try
Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 335 { String^ s = ""; while ( s = sr->ReadLine() ) { this->checkedListBox1->Items->Add(s); } } finally { if ( sr ) delete (IDisposable^)(sr); } Чтение файла для ComboBox path = "d:\\for_tel_sprav_cb.txt"; if ( !File::Exists( path ) ) { // Create a file to write to sw = File::CreateText( path ); // StreamWriter^ try { sw->WriteLine( "Hello" ); Это данные для контроля ввода. sw->WriteLine( "And" ); Если читаемый файл не найден, sw->WriteLine( "Welcome" эти данные выведутся } finally { if ( sw ) delete (IDisposable^)(sw); } } // Open the file to read from sr = File::OpenText( path ); try { String^ s = ""; while ( s = sr->ReadLine() ) { this->comboBox1->Items->Add(s); } } finally { if ( sr ) delete (IDisposable^)(sr); } }
336 Часть II. Приложения Windows Form private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { // Обработка кнопки "Удалить из списка" if(this->checkedListBox1->SelectedIndex == -1) строку не отметили для удаления { Отметьте строку для удаления, "Приложение Пользователя, MessageBoxButtons::OK,MessageBoxIcon::Asterisk); return; } this->checkedListBox1->Items->Remove(this->checkedListBox1->SelectedItem); } private: System::Void checkedListBox1_ItemCheck(System::Object^ sender, System::Windows::Forms::ItemCheckEventArgs^ e) { Обработка выборки из списка. В зависимости от свойства CheckOnClick состояние флажка меняется либо от одного щелчка, либо от повторного. Здесь установлено, что от одного щелчка. Сюда попадаем, когда щелчком мыши выбираем строку из списка */ String ^str,^tel,^str1; int i=this->checkedListBox1->SelectedIndex; Здесь будет индекс выбранной строки после клика (щелчка) на ней str=dynamic_cast Здесь будет выбранная строка после клика на ней tel=str->Substring(0,str->Length); выделили номер телефона Добавка или удаление номера телефона виз Поиск строки в ComboBox: если она найдена, то удаляется, если не найдена, то после этого блока она добавляется int k=0,j=this->comboBox1->Items->Count; for(int i=0; i < j; i++) { str1=dynamic_cast (this->comboBox1->Items[i]); if(System::String::Compare(str1,tel) != 0) Строки не сравнились continue;
Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 337 else { Object ^str2=dynamic_cast
338 Часть II. Приложения Windows Компоненты и Компоненты расположены в группе Common Controls палитры компонентов. Оба используются как флажки-переключатели для предоставления возможного выбора после их работы — они выдают результат "включен/выключен". Если компонент CheckBox находится в группе себе подобных, то, включив один CheckBox , можно включать и остальные и при этом ни один из них не выключится те. не изменит своего состояния. Компонент RadioButton ведет себя по-другому: когда он находится совместно ста- кими же компонентами водной группе, тоне допускает, чтобы был еще включен какой-то другой RadioButton — он тут же выключается. То есть в группе компонентов может быть включен только один из них, а остальные будут автоматически выключены. Оба этих компонента соответствуют математическим понятиям конъюнкции и дизъюнкции. Когда мы говорим "находится в группе, то имеется ввиду, что у множества таких компонентов один родитель (например, одна панель. Если одно множество RadioButton находится на одной панели, а другое — на своей собственной, то включение такой кнопки на панели Ане повлияет на состояние такой же кнопки на панели B, поскольку у них разные родители. Поэтому если необходимо, чтобы кнопки RadioButton обрабатывали несколько непересекающихся ситуаций, то такие кнопки нужно разместить на разных панелях или в других групповых контейнерах. Перечень свойств CheckBox , отображенных в окне Properties, представлен на риса свойств RadioButton — на рис. 11.65. Рис 11.64. Свойства С
Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 339 Рис 11.65. Свойства Рассмотрим некоторые свойства этих компонентов. Appearance — определяет форму появления компонента (в виде обычного флажка или в виде кнопки. Checked — поэтому свойству в режиме исполнения приложения можно определить, включен или выключен флажок. CheckState — устанавливает трехвидовое состояние Checked — флажок включен Unchecked — флажок выключен Indeterminate — состояние неопределенности (флажок закрашен в серый цвет. ThreeState — задает поддержку двух ( ThreeState = false ) или трех ( ThreeState = true ) состояний. У RadioButton этого свойства, естественно, нет, поскольку этот компонент имеет по определению всего два состояния. Если значение ThreeState установлено в true , то свойство Checked всегда возвращает для любого из состояний Checked или Indeterminate (те. и при значении CheckState = Checked , и при значении CheckState = Indeterminate свойство Checked всегда возвращает true ). FlatStyle — определяет стиль появления компонента (см. CheckedListBox ). CheckAlign — свойство, позволяющее открыть выпадающий список, где можно выбрать схему размещения флажка в поле компонента (его можно разместить в девяти местах окна компонента, но при этом Appearance должно быть не кнопкой.