WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     || 2 |

2. ТЕКСТОВОЙ ФОРМАТ ДАННЫХ ДЛЯ SMARTDEVICE

Для доступа к данным в текстовом файле используется поставщик OLE DB Jet, который загружает содержимое текстового файла в локальную таблицу и отображает ее содержимое в специально предназначенном элементе экранной формы. Локальные таблицы могут быть организованы поразному, поэтому невозможно определить все характеристики текстового файла через строку подключения. Для решения этой проблемы используется дополнительный, расположенный в том же каталоге, что и текстовой файл, файл *.ini в котором отражается следующая информация о локальной таблице текстового файла:

Имя файла:

Формат файла;

Имена полей, их длина и тип данных;

Кодировка символов;

Специальные преобразования типов данных Отметим, что в строке (записи) файла *.ini «Формат файла» указываются разделители полей: запятая; нестандартный разделитель определенный пользователем; фиксированная длина поля или табулятор.

Что касается элементов экранных форм, предназначенных для отражения данных, то их существует несколько вариантов, привязку данных к которым рассмотрим ниже.

2.1. Вводвывод в текстовые файлы Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих загрузку данных из текстового файла в форму для редактирования, изменение и сохранение данных в текстовом файле. Разработка: Приложение «Калькулятор цены автомобиля» для автоматического подсчета цены автомобиля в зависимости от комплектации.

Состав выполняемых функций:

Файловые операции: открыть, сохранить, сохранить как, закрыть Алгоритмы: калькулятор цены автомобиля, редактор цен Информационносправочные: О программе Наращивание функциональности не предусматривается.

Защита данных предусматривается только от неквалифицированных действий пользователей.

В качестве входных данных используется отдельный текстовой файл по каждой марке автомобиля, структура данных включает одно поле, набор из 22 записей, тип данных определяется программно. Выходные данные программы – графическое отображение результатов в виде набора текстовых полей экранных форм для SmartDevice.

Шаг 1. Структура данных В программе используется фиксированный набор данных текстовых полей (textBox), которые имеют следующие обозначения (label):

Владелец автомобиля Телефон владельца Цена владельца Комплектация Базовая цена Усилитель руля Кондиционер Тонированные стекла Дисковые тормоза Сигнализация Фаркоп Противотуманные фары Диски легкосплавные Марка автомобиля Шаг 2. Разработка графического интерфейса Используется только одна форма Form1 (свойство Text = Урок 1. Калькулятор). В форме, в связи с ограниченностью экрана, размещается набор закладок tabControl1 с двумя закладками tabPage1 и tabPage2. Примерный дизайн закладок приведен на рис.6 и 7.

На закладке «Комплектация» (рис.1) размещаются 8 флажков (checkBox) маркировки состава комплектующих (изначально свойство флажка Checked = False) и кнопка (button) «ОК», видимая только в режиме «Редактора» (изначально свойства кнопки Visible = False, Text = OK).

Рис. Рис. Невидимыми элементами управления графического интерфейса являются Диалоги открытия (openFileDialog1) и сохранения (saveFileDialog1) файла, Главное меню (mainMenu1), горизонтальная линейка которого имеет два пункта – «Файл» и «О программе» (видно на рис.1 и 2). Набор опций меню «Файл» включает: Открыть, Сохранить, Сохранить как, Редактор цен и Выход. Пункт меню «О программе» опций не имеет. Шаг 3. Расширяем состав системных библиотек using System;

using System.Drawing;

using System.Collections;

using System.Windows.Forms;

using System.Data;

// Добавляем библиотеку работы с файлами using System.IO;

Шаг 4. Включаем переменные для хранения результатов вычислений в public class Form1 : System.Windows.Forms.Form string file_name; // переменная хранения имени файла с данными int appe_acc=0; // переменная редактируемой цены комплектации int base_acc=0; // переменная базовой цены автомобиля int comp_acc=0; // переменная цены комплектации автомобиля Шаг 5. Загружаем данные из файла (по умолчанию) public Form1() { // Required for Windows Form Designer support InitializeComponent();



file_name="price.txt"; // имя файла, загружаемого по умолчанию file_read(); // вызываем функцию чтения данных из файла } Шаг 6. Создаем функцию чтения данных из текстового файла private void file_read() { FileStream fin; try { /* если файл доступен для чтения, то определяем переменную, в которой задаем имя открываемого файла */ fin=new FileStream(file_name,FileMode.Open);

} catch (IOException exc) { MessageBox.Show ("Невозможно открыть файл \n"+ file_name,"Ошибка");

return;

} Рис. На этом шаге можно закрыть функцию фигурной скобкой «}» и откомпилировать программу. При запуске откомпилированной программы, так как файл price.txt не существует, то должно срабатывать исключение IOException и выдаваться сообщение – рис. Шаг 7. Создаем процедуру сохранения файла Опция «Сохранить» (в нашем примере menuItem4_Click) главного меню предназначена для сохранения данных в файле price.txt – создаем код процедуры:

private void menuItem4_Click(object sender, System.EventArgs e) { file_name="price.txt"; // задаем имя файла по умолчанию file_write(); // вызываем функцию записи данных в файл } Шаг 8. Создаем функцию записи структуры данных в файл private void file_write() {// задаем поток StreamWriter fin_out;

try {// проверяем доступность файла fin_out=new StreamWriter(file_name);

} catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка");

return;

} // считываем данные текстовых полей формы foreach (Control t in this.Controls) { if (t is TextBox) // условие: если элемент формы – текстовое поле fin_out.Write(t.Text+"\r\n"); // пишем значения полей в файл } fin_out.Close(); // закрываем файл На этом шаге можно закрыть функцию фигурной скобкой «}» и откомпилировать программу. При запуске откомпилированной программы, активизировав опцию меню «Сохранить», на диске должен быть создан файл price price.txt, содержащий значения текстовых полей формы программы.

Щаг 9. Добавляем в функцию file_write() данные состояния флажков checkbox Перед закрывающей функцию file_write() фигурной скобкой пишем:

//Теперь открываем файл для добавления try{ fin_out=new StreamWriter(file_name,true);

} catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка");

return;

} // пишем состояние всех восьми флажков string h1=this.checkBox1.CheckState.ToString();

fin_out.Write(h1.ToString()+"\r\n"); // дописываем в файл string h2=this.checkBox2.CheckState.ToString();

fin_out.Write(h2.ToString()+"\r\n");

string h3=this.checkBox3.CheckState.ToString();

fin_out.Write(h3.ToString()+"\r\n");

string h4=this.checkBox4.CheckState.ToString();

fin_out.Write(h4.ToString()+"\r\n");

string h5=this.checkBox5.CheckState.ToString();

fin_out.Write(h5.ToString()+"\r\n");

string h6=this.checkBox6.CheckState.ToString();

fin_out.Write(h6.ToString()+"\r\n");

string h7=this.checkBox7.CheckState.ToString();

fin_out.Write(h7.ToString()+"\r\n");

string h8=this.checkBox8.CheckState.ToString();

fin_out.Write(h8.ToString()+"\r\n");

// считываем данные текстовых полей 1й закладки foreach (Control t1 in this.tabPage1.Controls) { if (t1 is TextBox) fin_out.Write(t1.Text.ToString()+"\r\n");

} // считываем данные текстовых полей 2й закладки foreach (Control t2 in this.tabPage2.Controls) { if (t2 is TextBox) fin_out.Write(t2.Text+"\r\n");

} fin_out.Close();// закрываем файл и выводим сообщение MessageBox.Show("Данные сохранены в файле "+file_name,"Запись на диск");

} // закрывающая фигурная скобка Шаг 10. Дописываем функцию file_read() Теперь, когда данные в файле price.txt структурированы, перед закрывающей функцию file_read() фигурной скобкой пишем:

// Считываем значения из файла StreamReader fstr_in=new StreamReader(fin);

string s="0"; // символ в строке int i=0; // номер строки //в переменную s считываются все символы, пока не кончится строка while((s=fstr_in.ReadLine())!=null) { i=i+1;





if (i = = 1){this.textBox1.Text=s;} // Марка автомобиля в textBox1 if (i = = 2) {// первый флажок в checkBox if (s = = "Unchecked") { this.checkBox1.Checked=false;} else {this.checkBox1.Checked=true;} } if (i = = 3) {// второй флажок if (s = = "Unchecked") { this.checkBox2.Checked=false;} else {this.checkBox2.Checked=true;} } if (i = = 4) {// третий флажок if (s = = "Unchecked") { this.checkBox3.Checked=false;} else { this.checkBox3.Checked=true;} } if (i = = 5) {// четвертый флажок if (s = = "Unchecked") { this.checkBox4.Checked=false;} else { this.checkBox4.Checked=true;} } if ( i = = 6) {// пятый флажок if (s = = "Unchecked") { this.checkBox5.Checked=false;} else { this.checkBox5.Checked=true;} } if (i = = 7) {// шестой флажок if (s = = "Unchecked") { this.checkBox6.Checked=false;} else { this.checkBox6.Checked=true;} } if (i = = 8) {// седьмой флажок if (s = = "Unchecked") {this.checkBox7.Checked=false;} else { this.checkBox7.Checked=true;} } if ( i = = 9) {// восьмой флажок if (s = = "Unchecked") { this.checkBox8.Checked=false;} else { this.checkBox8.Checked=true;} } /* Заносим данные в текстовые поля. Отметим, что порядок расположения и обозначения полей зависит от последовательности конструирования графического интерфейса. Поэтому, в нашем примере, обозначения могут не совпадать с автоматически создаваемыми элементами форм редактором Visual Studio */ if (i = = 10) {this.textBox14.Text=s;} if (i = = 11) {this.textBox13.Text=s;

/* преобразуем текстовой формат поля в числовой и заносим значение в переменную цены комплектации автомобиля */ comp_acc=int.Parse(this.textBox13.Text);

} if (i = = 12) {this.textBox4.Text=s;} if (i = = 13) {this.textBox3.Text=s;} if (i = = 14) {this.textBox2.Text=s;} if (i = = 15) {this.textBox12.Text=s;} if (i = = 16) {this.textBox11.Text=s;} if (i = = 17) {this.textBox10.Text=s;} if (i = = 18) {this.textBox9.Text=s;} if (i = = 19) {this.textBox8.Text=s;} if (i = = 20) {this.textBox7.Text=s;} if (i = = 21) {this.textBox6.Text=s;} if (i = = 22) {this.textBox5.Text=s;} }// конец цикла fstr_in.Close();

return; } // закрывающая функцию фигурная скобка Теперь следует удалить или переименовать файл price.txt, откомпилировать и запустить программу. В textBox13 нужно внести цифру, чтобы избежать генерации исключения операционной системой, заполнить остальные поля и сохранить файл. Структуру (одно поле) и данные (22 записи) файла можно просмотреть в режиме блокнота – рис. Рис. Шаг 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_accappe_acc ;} else {comp_acc=comp_acc+appe_acc ;} this.textBox13.Text=comp_acc.ToString();

this.textBox14.Text=(base_acccomp_acc).ToString();

} Для второго флажка меняется только строчка:

if (this.checkBox2.Checked = = false){comp_acc=comp_accappe_acc ;} и так далее, до восьмого флажка включительно.

Pages:     || 2 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.