Visual C++: простой список ComboBox с добавлением, удалением, сохранением и загрузкой элементов
В дополнение к развёрнутому примеру на ListBox решим следующую учебную задачу:
Реализовать отсортированный по алфавиту список имён с поддержкой операций добавления и удаления элементов, сохранением списка строк в файл и загрузкой его из файла. Допустимые символы в именах – буквы и цифры.
Задачу можно решать как на основе списочных, так и табличных компонент. Поскольку требуется сортировка данных, удобнее решать на основе какого-либо списка, имеющего встроенное свойство Sorted
. Форма будет иметь следующий вид:
форма приложения
Справа расположена panel1
со свойством Dock = Right
, на ней 4 кнопки button1, …, button4
для выполнения предусмотренных задачей действий. Слева – список comboBox1
со свойством Dock = Fill
.
По загрузке формы настроим список для нашей задачи:
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) { comboBox1->Sorted = true; //список будет сортироваться comboBox1->DropDownStyle = ComboBoxStyle::Simple; //развёрнутый вид списка }
Кнопка 1 будет добавлять запись, если такой же записи ещё нет в списке:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { String ^r = comboBox1->Text; if (comboBox1->FindString(r) == -1) comboBox1->Items->Add(r); }
Кнопка 2 будет удалять выбранный в списке элемент, если таковой есть:
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { if (comboBox1->SelectedIndex != -1) comboBox1->Items->Remove(comboBox1->SelectedItem); }
Кнопка 3 отвечает за загрузку элементов списка из файла, для простоты используем файл с фиксированным именем data.txt
, располагающийся в текущей папке. Однако чтобы можно было закрыть дескриптор файла после чтения данных, применим поточный класс StreamReader
:
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { using namespace System::IO; comboBox1->Items->Clear(); try { StreamReader ^file = gcnew StreamReader("data.txt"); String ^line; while ((line = file->ReadLine()) != nullptr) comboBox1->Items->Add(line); file->Close(); } catch (...) { MessageBox::Show("Не могу открыть data.txt"); } }
Кнопка 4 выполнит аналогичную работу по сохранению файла с использованием поточного класса StreamWriter
:
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { using namespace System::IO; try { StreamWriter ^file = gcnew StreamWriter("data.txt"); for (int i = 0; i < comboBox1->Items->Count; i++) file->WriteLine(comboBox1->Items[i]->ToString()); file->Close(); } catch (...) { MessageBox::Show("Не могу записать data.txt"); } }
Осталось обеспечить ввод только разрешённых символов, для этого достаточно добавить обработчик события KeyPress
для списка comboBox1
:
private: System::Void comboBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) { char c = (char)e->KeyChar; if (Char::IsLetterOrDigit(c) || c == (char)Keys::Back || c == (char)Keys::Enter) return; else e->Handled = true; }
Задача решена полностью, проверено в Visual Studio 2015.
08.12.2015, 12:17 [12405 просмотров]