Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
Скачать 17.38 Mb.
|
ComboBox будет иметь индекс, равный нулю, вторая — единице и т. д. Если кому не нравится произносить слово "индекс (указатель, то можно назвать его просто номером строки с учетом его отсчета от нуля. Можно программно изменять выбранный из ComboBox элемент, изменять значение SelectedIndex . При этом в списке будет отмечаться новый элемент, соответствующий новому значению Пока ни один элемент из ComboBox не выбран, значение SelectedIndex равно –1. SelectedItem — свойство, сходное со свойством SelectedIndex , только оно возвращает выбранный элемент (обычно это строка. Это свойство не показано в окне Properties. Count — свойство, содержащее количество элементов в списке ComboBox . Расчет количества ведется от 1 (если в списке 10 строк, то Count будет равен 10). Это свойство не показано в окне Properties. DropDownStyle — свойство, задающее стиль вывода данных компонентом. Может принимать значения Simple — в этом случае работает поле редактирования, а кнопка раскрытия списка спрятана (можно только вводить строку данных DropDown — в этом случае стрелка раскрытия списка видна, и с ее помощью можно раскрыть список, выбрать строку, которая попадет в поле редактирования, где ее можно отредактировать, прежде чем использовать далее DropDownList — выборку из списка можно делать, но выбранную строку уже редактировать нельзя. Text — свойство, содержащее значение поля редактирования компонента (те. из списка можно извлекать строку и редактировать ее. DropDownWidth и DropDownHeight — ширина и высота выпадающего списка. Если последнее свойство таково, что окно списка не вмещает весь список, тов окне появится полоса прокрутки. Если же окно по размеру больше списка, то при выводе окно примет размер списка. FlatStyle — стиль окна редактирования. Если задать это свойство в виде PopUp , то при наведении курсора мыши на окно, оно "всплывет, что весьма удобно при контроле за движением курсора мыши. Если свойству придать значение System , то при наведении курсора мыши на окно стрелка, раскрывающая список, изменит цвет. FormatString — с помощью этого свойства можно задавать форматы вывода некоторых типов данных (чтобы задать формат, надо посредством кнопки с многоточием открыть диалоговое окно и выбрать подходящий формат для выводимых Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 301 строк. При этом надо помнить, что элементы списка должны быть соответствующего типа (датами, данными по валюте и т. п. AutoCompleteCustomSource — это свойство совместно со свойствами AutoCompleteMode и AutoCompleteSource обеспечивает подсказку с выбором значения из списка для вводимых строк. События Перечень событий компонента, отображаемых в его окне Properties, показан на рис. 11.51. Рис 11.51. Перечень событий компонента Из всех событий компонента нас в первую очередь интересует то, которое наступает, если в выпадающем списке щелкнуть на выбранной строке. При этом мы должны будем попасть в обработчик этого события, чтобы в нем извлечь из списка нужную нам строку. Это событие — DropDownClosed . Действительно, событие возникает, когда закрывается выпадающий список. А он закрывается именно после щелчка на какой-либо его строке либо после щелчка на поле редактирования (в этом случае никакой выборки не произведено и поэтому свойство SelectedIndex устанавливается в –1, следовательно, эту ситуацию в обработчике тоже надо учитывать. Некоторые методы Компонент имеет большое количество методов, которые можно посмотреть в справочной системе, нажав клавишу Focus() — передает фокус ввода компоненту компонент становится активными с ним можно работать Hide() — делает объект невидимым (прячет его. 302 Часть II. Приложения Windows Чтобы в режиме проектирования добавлять элемент в список, надо воспользоваться свойством Items — при нажатии на кнопку с многоточием в поле этого свойства открывается диалоговое окно для задания множества строк (окно, аналогичное такому же окну для ListBox ). Если же вам потребуется обеспечить автоматическую загрузку поля этого компонента, то следует воспользоваться методами свойства Items , которое само является классом и потому обладает своими методами. После стрелки откроется окно подсказчика. Основные методы, употребляемые для загрузки ComboBox , — следующие (фактически это методы класса Items , в ComboBox вы их не найдете Clear() — очищает поле ComboBox ; Add() — добавляет элемент вконец поля ComboBox ; IndexOf() — выдает индекс строки в поле ComboBox . Строка задается в аргументе метода. Если строка не найдена, то выдается –1; Insert() — вставляет строку в поле ComboBox перед указанным в аргументе индексом. Например, следующие операторы, помещенные в обработчик кнопки, this->comboBox1->Items->Clear(); Строка индекс этой строки равен 0 Строка индекс этой строки равен 1 this->comboBox1->Items->Insert(1,"Insert"); дают такой результат Строка Insert Строка Из примера видно, что индекс в ComboBox изменяется от нуля. Это можно проверить и методом IndexOf() , выполнив после указанных выше операторов оператор Строка Значение i будет равно 0. Remove() — удаляет строку, указанную в аргументе, из поля ComboBox . Например, выполним оператор на множестве трех предыдущих строк this->comboBox1->Items->Remove("Insert"); Получим результат Строка Строка RemoveAt() — удаляет строку из поля ComboBox , индекс которой указан в аргументе. Например, выполним оператор this->comboBox1->Items->RemoveAt(1); Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 303 на множестве трех строк Строка Insert Строка Получим такой результат Строка Строка Для работы с ComboBox широко применяется и свойство Count из Items . В нем всегда находится количество элементов Например, если выполнить оператор int j=this->comboBox1->Items->Count; на множестве строк Строка Строка тов переменной j получим 2. Заметим, что в поле ComboBox можно располагать не только строки, но и другие объекты. Примеры использования Компонент используется для просмотра и выборки элементов. Пример Допустим, что вам требуется каждый раз просматривать сведения об авторах книг в библиотеке. Воспользоваться источником данных, который связывается с базой данных, мы не можем в данной версии среды работа с источником данных отключена. Воспользуемся возможностью работы с файлом данных, которую мы рассматривали при изучении компонента ListBox . На рис. 11.52 показан пример рабо- Рис 11.52. Работа с текстовым файлом 304 Часть II. Приложения Windows тыс внешним файлом, формируемым из вашего приложения, а потом просматриваемым в Текст программы приведен в листинге 11.6. Пояснения — те же, что и для программы по работе Листинг 11.6 #pragma once namespace ComboBox2011 { 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::Text; /// /// Summary for Form1 /// { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // } protected: /// /// Clean up any resources being used. /// Form1() { if (components) { delete components; } } Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 305 private: System::Windows::Forms::ComboBox^ comboBox1; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button1; protected: 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. /// { this->comboBox1 = (gcnew System::Windows::Forms::ComboBox()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // comboBox1 // this->comboBox1->FormattingEnabled = true; this->comboBox1->Items->AddRange(gcnew cli::array< System:: Object^ >(3) {L"111", L"222", L"333"}); this->comboBox1->Location = System::Drawing::Point(13, 13); this->comboBox1->Name = L"comboBox1"; this->comboBox1->Size = System::Drawing::Size(121, 24); this->comboBox1->TabIndex = 0; this->comboBox1->Click += gcnew System::EventHandler(this, &Form1::comboBox1_Click); // // textBox1 // this->textBox1->Location = System::Drawing::Point(13, 63); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(159, 22); this->textBox1->TabIndex = 1; // // button1 // 306 Часть II. Приложения Windows Form this->button1->Location = System::Drawing::Point(13, 101); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(159, 30); this->button1->TabIndex = 2; this->button1->Text = Запись в файл this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(229, 163); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Controls->Add(this->comboBox1); 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 button1_Click(System::Object^ sender, System::EventArgs^ e) { // Create a file to write to if(fix != 1) { String^ path = "d:\\for_write_ListBox.txt"; sw = File::CreateText( path ); //StreamWriter ^ } if(this->textBox1->Text != "#") { sw->WriteLine(this->textBox1->Text); textBox1->Text=""; fix=1; this->textBox1->Focus(); goto m; } else sw->Close(); m:; } Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 307 private: System::Void Form1_Shown(System::Object^ sender, System::EventArgs^ e) { this->textBox1->Focus(); } private: System::Void comboBox1_Click(System::Object^ sender, System::EventArgs^ e) { String^ path = "d:\\for_write_ListBox.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); } } очистка comboBox1: this->comboBox1->Items->Clear(); // Open the file to read from TextReader ^ sr = File::OpenText( path ); try { String^ s = ""; while ( s = sr->ReadLine() ) { this->comboBox1->Items->Add(s); } } finally { if ( sr ) delete (IDisposable^)(sr); } } }; } 308 Часть II. Приложения Windows Пример Допустим, что вы создаете приложение для обработки данных по рекрутингу — набору рабочей силы для предприятий города. Естественно, что нужно обрабатывать анкетные данные клиента, данные предприятий, которые запрашивают помощь в наборе работников. И везде требуется работа со справочными данными. Например, надо выбрать из перечня должностей требуемую должность. Конечно же, такой перечень следует ввести в ComboBox и из него делать выборку. В примере 1 мы научились, как загружать строки из текстового файла (программное формирование свойства Items ). Здесь мы покажем, как выполнять выборку строки засылать выбранную строку в TextBox . Результат работы приложения показан на риса текст программы приведен в листинге 11.7. Рис 11.53. Загрузка текстового файла в ComboBox , выборка строки из ComboBox и пересылка ее в Листинг 11.7 #pragma once namespace ComboBox22011 { 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::Text; /// /// Summary for Form1 /// { public: Form1(void) Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 309 { InitializeComponent(); // //TODO: Add the constructor code here // } protected: /// /// Clean up any resources being used. /// Form1() { if (components) { delete components; } } private: System::Windows::Forms::ComboBox^ comboBox1; protected: private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button1; 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. /// { this->comboBox1 = (gcnew System::Windows::Forms::ComboBox()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // comboBox1 // this->comboBox1->FormattingEnabled = true; 310 Часть II. Приложения Windows Form this->comboBox1->Location = System::Drawing::Point(13, 13); this->comboBox1->Name = L"comboBox1"; this->comboBox1->Size = System::Drawing::Size(121, 24); this->comboBox1->TabIndex = 0; this->comboBox1->DropDownClosed += gcnew System::EventHandler(this, &Form1::comboBox1_DropDownClosed); this->comboBox1->Click += gcnew System::EventHandler(this, &Form1::comboBox1_Click); // // textBox1 // this->textBox1->Location = System::Drawing::Point(13, 68); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(121, 22); this->textBox1->TabIndex = 1; // // button1 // this->button1->Location = System::Drawing::Point(35, 101); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 2; this->button1->Text = Выход this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(153, 136); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Controls->Add(this->comboBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void comboBox1_Click(System::Object^ sender, System::EventArgs^ e) { Засылка строк из текстового файла в ComboBox String^ path = "d:\\for_write_ListBox.txt"; Глава 11. Компоненты, создающие интерфейс между пользователем и приложением 311 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); } } очистка comboBox1: this->comboBox1->Items->Clear(); // Open the file to read from TextReader ^ sr = File::OpenText( path ); try { String^ s = ""; while ( s = sr->ReadLine() ) { this->comboBox1->Items->Add(s); } } finally { if ( sr ) delete (IDisposable^)(sr); } } private: System::Void comboBox1_DropDownClosed(System::Object^ sender, System::EventArgs^ e) { Обработка щелчка на выбранной строке выпадающего меню Выборка из списка и пересылка в TextBox if(this->comboBox1->SelectedIndex == -1) return; this->textBox1->Text=this->comboBox1->Items[this->comboBox1->SelectedIndex]- >ToString(); } 312 Часть II. Приложения Windows Form private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } }; } Пояснения — по тексту программы и остальные — из пояснений к Пример Покажем, как использовать ComboBox для работы не со строками, ас графическими объектами. Предположим, что требуется создать список для выбора уровней опасности, скажем, обстановки в городе. Нам надо будет в поле ComboBox расположить три цветных полосы красную, желтую и зеленую, которые соответствуют высшему, среднему и низкому уровням опасности соответственно. Поэтому надо построить работу с ComboBox так, чтобы при выборе красной полосы в поле редактирования попадало сообщение "Высший уровень опасности, при выборе желтой полосы — "Средний уровень опасности" и т. д. Сам компонент построим в программе, те. создадим его, а затем свойствам присвоим необходимые значения. Как строятся подобные списки Все определяется значением свойства DrawMode (способ рисования элементов ComboBox ). Если значение этого свойства равно Normal , тов качестве объектов рисования служат строки. Примеры работы сними мы рассмотрели. В этом случае среда сама добавляемые элементы переводит в текстовые строки. Если же значение DrawMode неравно, то предполагается, что пользователь те. вы) сам должен написать операторы построения объектов со всеми их характеристиками (например, с цветом, шрифтом и т. п. Причем операторы должны быть помещены в обработчики событий DrawItem (рисование элемента) и размеры элемента. Как это делается, показано в листинге 11.8. На этапе дизайна компонент ComboBox был помещен в форму. Затем его свойствам были установлены значения, приведенные в табл. 11.4. Таблица Значения свойств компонента ComboBox |