Текстовой формат данных для Smartdevice. Ввод-вывод в текстовые файлы
Шаг 11. Функция проверки цифровых полей
Для того, чтобы наш калькулятор вычислял цену автомобиля необходимо чтобы пользователь вводил цифры в соответствующие поля. В противном случае программа будет прерываться, генерируя соответствующее исключение. Для проверки правильности ввода и корректировки ошибок создадим функцию Accountest()
private void Accountest() {// проверяем цену продавца if (!char.IsDigit(textBox4.Text[0])) { textBox4.Text = "0"; // корректируем ошибки ввода – вводим в поля нули MessageBox.Show("Введите цену владельца!","Ошибка"); return; } base_acc=int.Parse(textBox4.Text); // проверяем цифры для каждого each foreach (Control NT in this.tabPage2.Controls) if (NT is TextBox) { if (!char.IsDigit(NT.Text.Trim()[0])) { NT.Text = "0"; // корректируем ошибки ввода – вводим в поля нули } } }
Шаг 12. Процедуры пересчета цены
Процедура пересчета цены срабатывает при каждом изменении состояния флажка комплектации – для всех восьми флажков процедуры одинаковые, за исключением привязки к элементам управления. Для первого флажка процедура:
private void checkBox1_CheckStateChanged_1 (object sender, System.EventArgs e) { Accountest(); // вызваем функцию проверки правильности ввода // считываем в переменную предыдущее значение цены комплектации appe_acc=int.Parse(textBox5.Text); if (this.checkBox1.Checked = = false){comp_acc=comp_acc-appe_acc ;} else {comp_acc=comp_acc+appe_acc ;} this.textBox13.Text=comp_acc.ToString(); this.textBox14.Text=(base_acc-comp_acc).ToString(); }
Для второго флажка меняется только строчка:
if (this.checkBox2.Checked = = false){comp_acc=comp_acc-appe_acc ;}
и так далее, до восьмого флажка включительно.
Шаг 13. Защита данных базовой комплектации
Файл price.txt в программе создается по умолчанию и содержит данные базовой комплектации для всех других вариантов файлов. Чтобы каждый раз не создавать данные в случае неквалифицированных или случайных действий пользователей, следует ограничить доступ к данным файла. Для этого всем полям на закладке "Комплектация" (Усилитель руля, Кондиционер, Тонированные стекла, Дисковые тормоза, Сигнализация, Фаркоп, Противотуманные фары, Диски легкосплавные) изначально устанавливается свойство ReadOnly=True. На закладке "Владелец" такое же свойство устанавливается для полей "Комплектация" и "Базовая цена", так как поля являются вычисляемыми и пользователю нет необходимости в доступе к этим полям.
Доступ для редактирования полей закладки "Комплектация" открывается опцией главного меню "Редактор цен", для которой создается процедура:
private void menuItem2_Click_1(object sender, System.EventArgs e) {// блокируем флажки this.checkBox1.Checked=false; this.checkBox2.Checked=false; this.checkBox3.Checked=false; this.checkBox4.Checked=false; this.checkBox5.Checked=false; this.checkBox6.Checked=false; this.checkBox7.Checked=false; this.checkBox8.Checked=false; // прячем флажки this.checkBox1.Visible=false; this.checkBox2.Visible=false; this.checkBox3.Visible=false; this.checkBox4.Visible=false; this.checkBox5.Visible=false; this.checkBox6.Visible=false; this.checkBox7.Visible=false; this.checkBox8.Visible=false; // обнуляем комплектацию comp_acc=0; this.textBox13.Text=comp_acc.ToString(); this.textBox14.Text=(base_acc-comp_acc).ToString(); // показываем кнопку редактора this.button1.Visible=true; //отклываем текстовые поля для редактирования this.textBox12.ReadOnly=false; this.textBox11.ReadOnly=false; this.textBox10.ReadOnly=false; this.textBox9.ReadOnly=false; this.textBox8.ReadOnly=false; this.textBox7.ReadOnly=false; this.textBox6.ReadOnly=false; this.textBox5.ReadOnly=false; }
После того, как данные на закладке "Комплектация" отдедактированы, закрываем к ним доступ кнопкой "ОК":
private void button1_Click_1(object sender, System.EventArgs e) {// делаем кнопку "ОК" невидимой this.button1.Visible=false; // поля - недоступными this.textBox12.ReadOnly=true; this.textBox11.ReadOnly=true; this.textBox10.ReadOnly=true; this.textBox9.ReadOnly=true; this.textBox8.ReadOnly=true; this.textBox7.ReadOnly=true; this.textBox6.ReadOnly=true; this.textBox5.ReadOnly=true; // флажки - показываем this.checkBox1.Visible=true; this.checkBox2.Visible=true; this.checkBox3.Visible=true; this.checkBox4.Visible=true; this.checkBox5.Visible=true; this.checkBox6.Visible=true; this.checkBox7.Visible=true; this.checkBox8.Visible=true; }
Шаг 14. Диалог сохранения файла
Вариантов цен и комплектаций может быть много, поэтому каждый вариант храним в отдельном файле. Для этого пишем процедуру опции "Сохранить как" ( menuItem5_Click ).
private void menuItem5_Click(object sender, System.EventArgs e) {// в качестве имени файла используем значение поля file_name=this.textBox1.Text; saveFileDialog1.FileName=file_name; if (saveFileDialog1.ShowDialog()==DialogResult.OK) { file_name=saveFileDialog1.FileName; FileStream fin_out; try { fin_out=new FileStream(file_name,FileMode.OpenOrCreate); fin_out.Close(); } catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка"); return; } file_write(); // загружаем функцию записи данных в файл } }
Шаг 15. Диалог открытия файла
По умолчанию всегда загружаются данные из файла price.txt – чтобы загрузить данные конкретной комплектации из другого файла создаем процедуру опции главного меню "Открыть" ( menuItem3_Click )
private void menuItem3_Click(object sender, System.EventArgs e){ if (openFileDialog1.ShowDialog()==DialogResult.OK) { file_name=openFileDialog1.FileName; file_read(); // загружаем функцию чтения данных из файла } }
Шаг 16. Закрываем приложение
Одна из особенностей операционной системы для SmartDevice в том, что привычная кнопка закрытия приложения не удаляет программу из оперативной памяти. По сути приложение только сворачивается и делается не видимым. Чтобы освободить память пишем процедуру для опции главного меню "Выход" ( menuItem7_Click )
private void menuItem7_Click(object sender, System.EventArgs e) { Application.Exit(); }
Теперь можно установить свойство для формы Form1 ControlBox=False – выход из программы будет осуществляться использованием опции "Выход"
Шаг 17. Авторские права
Хорошим тоном является авторизация разработки – общественность должна знать своих героев. Пишем процедуру для опции "О программе":
private void menuItem6_Click(object sender, System.EventArgs e){ MessageBox.Show("Калькулятор цены автомобиля \n (C)2006, \n Родигин Л.А.\n Задача: сохранить значения цен комплектующих в файле \n и подсчитать сумму выбранных значений из калькуляции.","Help"); }