БлогNot. Visual C++: простой список ComboBox с добавлением, удалением, сохранением и загр...

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 [12041 просмотр]


теги: учебное список c++/cli

К этой статье пока нет комментариев, Ваш будет первым