Разработка электронного органайзера

МИНИСТЕРСТВО ОБРАЗОВАНИЯ  И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ  УНИВЕРСИТЕТ 

 

 

 

 

 

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОМУ ПРОЕКТУ

 

по дисциплине «Системное программное обеспечение»

 

на тему: «Разработка электронного органайзера»

 

 

 

 

 

 

 

 

Выполнил: студент группы 10ЗВОЗ1  

Долгушев А.В.

Проверил: Убиенных

 

 

 

 

 

 

 

 

 

 

 

Пенза 2012

 

Задание

 

Создать приложение «Органайзер», предназначенное для помощи в организации и планировании деловой жизни и объединяющее в себе функции записной книжки, календаря и микрокалькулятора. Приложение должно быть предназначено для работы в среде Windows XP. При разработке воспользоваться средой Microsoft Visual C++.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Содержание

 

 

 

Введение

 

 

При современном темпе  жизни и объеме информации, которую  всегда нужно держать под рукой, органайзер – одна из самых необходимых вещей любого современного человека. И неважно, кто он по профессии - главный директор крупной компании или обычный студент. А если учесть , что возрастает процент людей, занятых в сфере информационных технологий, классический органайзер оказывается не таким удобным, как электронный.  Электронный органайзер – очень полезная утилита, которая должна включаться в набор стандартных программ операционной систему.

Электронный органайзер  должен содержать в себе некоторые базовые функции. Как и классический органайзер, он может использоваться в качестве записной книжки для заметок, в качестве календаря для планирования праздников и важных деловых событий. По этим причинам его можно назвать электронным ежедневником, содержащим удобный планировщик событий и блокнот.

Также в классический органайзер обычно включают такое устройство, как калькулятор. В органайзере-программе он тоже должен присутствовать, что завершит его логически-единую  часть базового функционала.

 

1. Анализ требований

 

По рекомендациям на выполнение курсового  проекта разработку программной системы следует проводить на основе спиральной модели жизненного цикла. На каждом витке спирали следует проходить стандартные этапы разработки. Начнем с анализа требований к программной системе.

Обычно выделяют несколько  категорий требований:

    • функциональные требования;
    • пользовательские требования;
    • требования к среде разработки.

Проанализируем все  вышеперечисленные категории требований в приведенном порядке.

 

1. 1. Функциональные  требования к программной системе.

Об этом уже велась речь во введении. Перечислим задачи, которые должен выполнять электронный органайзер, в более строгой форме.

Итак, электронный органайзер должен включать в себя функции:

    1. записной книжки,
    2. планировщика заданий (календаря),
    3. калькулятора.

Модуль записной книжки должен предоставлять функции добавления новой записи, удаления записей и редактирования существующих записей.

Календарь должен обладать функциональностью, подобной функциям записной книжки, с тем отличием, что должно поддерживаться задание  дат событий. Т. о. в календаре нужно реализовать добавление события, удаление события и изменение текста (имени) события.

Подсистема калькулятора обладает достаточно тривиальными функциями: калькулятор должен поддерживать основные арифметические операции: сложение, вычитание, умножение и деление. Также можно реализовать вычисление процентов и сохранение значения в памяти.

В рекомендациях к  выполнению задания также говорится  об использовании UML в процессе разработки программы. Это не совсем обоснованно, поскольку приложение не обладает большой функциональностью, однако приведем пример диаграммы вариантов использования, на которой изображены пользователи (в нашем случае один) и прецеденты, т. е. множества последовательностей действий, выполняемых системой для того, чтобы пользователь мог получить определенный результат. Диаграмма приведена в Приложении А.

 

1. 2. Пользовательские требования к программной системе.

Естественно, что приложение должно быть основано на формах, поскольку  пользователю неудобно работать с консолью, где нужно вводить команды с клавиатуры. Более того, приложение, основанное на формах, красивее и привычнее для любого пользователя.

Условимся, что программная  система должна состоять из одной  формы с несколькими вкладками. На каждой из вкладок будет отображаться интерфейс определенных выше подсистем.

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

Рис. 1. Аналог разрабатываемого электронного органайзера.

Программа, интерфейс  которой приведен на рис. 1, представляет собой простой планировщик заданий. Его функциональность этим и ограничена. Однако нас в данном пункте больше интересует интерфейс приложения. Условимся, что он должен быть похож на интерфейс «Планировщика». Однако внесем некоторые изменения: меню в виде выпадающих списков не так удобно, как простые кнопки. Этот факт будем иметь в виду при реализации системы.

 

1. 3. Требования к среде разработки

Итак, средой разработки выбрана система  Microsoft Visual Studio 2008, причем язык, на котором будет написана программа,  – C++ . Выбор обусловлен несколькими причинами.

Во-первых, Visual C++ поддерживает разработку приложений как на Managed C++ и C++/CLI, так и на обычном C++, и тем самым позволяет генерировать код как для платформы .NET Framework, так и для исполнения в среде «чистой» Windows, что и является основным требованием.

Во-вторых, Visual Studio 2008 предоставляет удобные средства проектирования визуальных компонентов приложения и некоторую генерацию кода.

 

2. Проектирование программной системы

 

В данном пункте опишем источники данных, приведем пример интерфейса приложения и определимся с технологией реализации программной системы. Также в этом разделе приведем описание возможных UML-диаграмм.

2.1 Проектирование данных

Т. к. приложение должно работать с долгосрочными данными (календарь подразумевает, что планируемое событие может произойти и через год). Это означает, что данные, вносимые пользователем, нужно хранить во внешнем источнике. Можно, конечно, использовать текстовый или бинарный файл, однако тогда придется дополнительно заботиться о поддержании его структуры. Поэтому лучше предпочесть небольшую базу данных.

Что касается выбора СУБД, то здесь всё очевидно: остановимся  на довольно распространенной MS Access.

 Рис. 2. Схема данных в MS Access.

Выбор можно объяснить, во-первых тем, что она включается чуть ли не в базовый пакет MS Office, который установлен практически на каждой машине, где операционной системой является Windows.

Во-вторых, среда разработки и СУБД являются детищами одного поставщика ПО, поэтому можно не бояться за совместимость и интеграцию.

На рис. 2. приведем схему  БД, которая предполагается в многопользовательской  операционной системе, где несколько  человек могут работать с одним  и тем же приложением. Однако условимся, что в нашем случае будет один пользователь, что упростит разработку, поскольку ненужно будет программировать систему разграничения доступа.

Кратко опишем приведенные  таблицы.

Таблица Users хранит имена пользователей (user) и их пароли (password). В нашей версии программной системы будет отсутствовать.

Sheduler – это записная книжка. В ней хранится идентификатор записи (id_task), текст записи (text_task), статус записи, т. е. «выполнено»/«невыполнено», он будет отображаться во второй версии системы (status_task) и внешний ключ (user).

Calendar – таблица планировщика заданий. В ней хранится идентификатор события (id_event), комментарий к нему (text_event), который в первой версии приложения будет отсутствовать, дата события (date_event), являющаяся обязательным атрибутом для всех событий,  и внешний ключ (user), обеспечивающий разграничение событий пользователей.

 

2.1 Проектирование интерфейса и реализации

Программу планируется  построить на основе прообраза MVC. Model-view-controller («Модель-представление-поведение») – схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента. Подчеркнем, что это будет именно прообраз MVC, поскольку прослойка, отвечающая за поведение системы будет очень тесно связана с интерфейсом, т. е. за поведение будут отвечать обработчики событий, генерируемых пользователем.

В целом же приложение будет представлять один класс-форму. Поэтому нецелесообразно проектировать диаграмму классов. Что же касается прочих диаграмм, то можно ограничиться диаграммой состояний. Эту диаграмму приведем только для подсистемы «записная книжка». Календарь очень практически идентичен в состояниях и возможных переходах, поэтому нет смысла приводить ещё одну похожую диаграмму. Калькулятор же представляет собой тривиальную подпрограмму, он в принципе не нуждается в проектировании.  Диаграмма состояний приведена в Приложении Б.

Завершением данного  пункта будет проектирование интерфейса системы. На рис. 3. изображена первая версия интерфейса приложения.

Рис. 3. Интерфейс электронного органайзера.

 

3. Программная реализация и тестирование системы

 

В этом разделе опишем архитектуру приложения и технологию доступа к данным. Также приведем примеры кода программной системы и результаты тестирования.

 

3. 1. Кодирование

Технология  реализации системы и язык программирования уже были описаны выше. Теперь затронем немного другие аспекты реализации – модель событий и технологию доступа к данным.

Событие – это реакция объекта совершения над ним действия: например, наведения или щелчок мыши, ввод с клавиатуры. Событие призвано уведомить класс, другой объект или пользователя об этом действии. С точки зрения программы событие представляет собой блок кода, который будет выполняться при совершении определенного действия. Этот код будет называться обработкой события.

Создавая Windows-приложения, постоянно приходится сталкиваться с обработкой событий, связанных с элементами формы. Например, при щелчке на кнопке «Добавить» в модуле «Записная книжка» добавляется новая строка в dataGridView1 и соответствующая ячейка переходит в режим редактирования:

private: System::Void b_new_task_Click(System::Object^  sender, System::EventArgs^  e)

{

  dataGridView1->Rows->Add();

  dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[1]->Value="Введите задание";

  dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[1]->Selected=true;

  addFlag = 1;

  dataGridView1->BeginEdit(true);

}

Что касается Технологии доступа к данным, в программе используется технология OLE DB. Остановимся на ней подробнее.

OLE DB (Object Linking and Embedding Database) – набор интерфейсов, основанных на COM, которые позволяют приложениям обращаться к данным, хранимым в разных источниках информации или хранилищах данных с помощью унифицированного доступа.

OLE DB является API, разработанной Microsoft для доступа к различным типам данных, которые хранятся в единой форме. OLE DB отделяет хранилище данных от приложения, которое должно иметь доступ к нему через набор абстракций, которые включают DataSource, сессию, командную строку.

OLE DB использует различных провайдеров для разных источников данных. Для доступа к используемой нами MS Access (и других локальных баз данных) используется Jet OLE DB.

Провайдер Jet 4.0 OLE DB поддерживает работу с Access 97, Access 2000 (и выше). Механизм Jet удобно использовать для импорта и экспорта данных. Для экспорта необходимо  предать специальной функции строку соответствующего SQL-запроса. Ниже приведен код, добавляющий записи в таблицу Calendar или изменяющий их:

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ Query;

if (addFlag == 3)

{

Query = "INSERT INTO Calendar (date_event, name_event, text_event) VALUES ('";

Query += monthCalendar1->SelectionStart.Date.ToShortDateString() + "', '" + textBox_name->Text + "', '" + richTextBox1->Text->ToString() + "')";

}

else if (addFlag == 4)

{

Query = "UPDATE Calendar SET name_event = '" + textBox_name->Text + "', text_event = '" + richTextBox1->Text->ToString() + "' WHERE id_event = " + idEvent.ToString();

}

OleDbCommand^ Command = gcnew OleDbCommand(Query, conn);

Command->ExecuteNonQuery();

conn->Close();

deactivate();

addFlag = 0;

Аналогичным образом происходит извлечение данных из таблиц БД. Добавляется лишь один объект – DataReader, который предоставляет интерфейс для работы с извлеченными данными.

Код программы  представлен в Приложении В.

3. 2. Тестирование

Тестирование неотрывно от разработки приложений. Оно бывает разных видов: модульное, интегративное и проч. Однако в создании электронного органайзера эти виды тестирования нецелесообразны, поскольку размер программной системы невелик, следовательно и вероятность ошибок мала. А если ошибки и будут присутствовать в программе их будет легко найти, просмотрев код.

Применительно к реализуемому проекту можно говорить не о тестировании, а об отладке, когда сам программист  исправляет ошибки, обнаруженные на этапе  компиляции. Приводить пример отладки не имеет смысла. То, что достойно внимания в этом проекте, – это пользовательское тестирование.

Пользовательское тестирование – процесс, при котором некий  пользователь работает с готовым  приложением, пытаясь найти ошибки. На рис. 4 изображен «Электронный органайзер» версии номер один.

Рис. 4. Пользовательское тестирование органайзера.

В заключение отметим, что пользовательское тестирование не выявило ошибок в  логике и сбоев приложения.

 

5. Создание очередной версии приложения

 

Итогом первых четырех разделов стало вполне работоспособное приложение. Однако следуя современном концепции программирования, создадим еще одну версию электронного органайзера. В ней модифицируем калькулятор (добавив некоторые операции) и модуль записной книжки (в нем добавим возможность помечать записи).

На рис. 5. Изображена окончательная  версия электронного органайзера.

Рис. 5.  Окончательная  версия приложения.

 

Заключение

 

В результате выполнения задания курсового проекта была написана программа «Электронный эквалайзер», состоящая из нескольких подсистем. Также были получены знания о технологии обработки событий и о технологии доступа к данным OLE DB. Полученные знания были применены на практике разработки программной системы. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список использованных источников

  1. Вендров А.М. Проектирование программного обеспечения экономических информационных систем: Учебник. – 2-е изд. – М.: Финансы и статистика, 2006. – 544 с.
  2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами на C++, 2-е изд.. – М.: «Издательство Бином», СПб.: «Невский проспект», 1998. – 560 с
  3. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руководство пользователя. – М.: ДМК, 2000. – 432 с.
  4. Павловская Т. C/C++. Программирование на языке высокого уровня: Уч. для вузов. – СПб.: Питер, 2003. – 464 с.
  5. C++. Объектно-ориентированное программирование: Практикум/ Павловская Т.А., Щупак Ю.А. – СПб.: Питер, 2004. – 265 с. – (Учеб. пособие).
  6. Арчер Т., Уайтчепел Э. Visual C++.NET. Библия пользователя. – М.: Издательский дом "Вильямс", 2005. – 1216 с.
  7. С/С++ и MS Visual C++ 2008 для начинающих. – СПб.: БХВ-Петербург, 2009. – 624 с.
  8. http://wikipedia.org – интернет-энциклопедия
  9. http://msdn.microsoft.com – официальный сайт Microsoft Developer Network

 

Приложения

 

Приложение А

 

Диаграмма вариантов  использования

 

 

 

 

 

 

 

Приложение  Б

 

Диаграмма состояний

 

Подсистема  «Записная книжка»

 

Приложение В

 

Код программной системы

 

 

double operand1;

double operand2;

double memory;

double result;

Operations flag;

bool first;

int addFlag;

int idEvent;

String^ tmp_id;

 

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {

taskLoad();

eventLoad(monthCalendar1->SelectionStart.Date);

}

// Калькулятор

private: System::Void button7_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "7";

 else

textBox1->Text = "7";

first = false;

}

private: System::Void button8_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "8";

 else

textBox1->Text = "8";

first = false;

}

private: System::Void button9_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "9";

 else

textBox1->Text = "9";

first = false;

}

private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "4";

 else

textBox1->Text = "4";

first = false;

}

private: System::Void button5_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "5";

 else

textBox1->Text = "5";

first = false;

}

private: System::Void button6_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "6";

 else

textBox1->Text = "6";

first = false;

}

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "1";

 else

textBox1->Text = "1";

first = false;

}

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "2";

 else

textBox1->Text = "2";

first = false;

}

private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "3";

 else

textBox1->Text = "3";

first = false;

}

private: System::Void button0_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox1->Text != "0" && first != true)

textBox1->Text += "0";

 else

textBox1->Text = "0";

first = false;

}

private: System::Void button_sign_Click(System::Object^  sender, System::EventArgs^  e) {

if (textBox1->Text->Substring(0,1) != "-")

  textBox1->Text = "-" + textBox1->Text;

else

  textBox1->Text = textBox1->Text->Substring(1, textBox1->Text->Length - 1);

}

private: System::Void button_mem_add_Click(System::Object^  sender, System::EventArgs^  e) {

memory = Double::Parse(textBox1->Text);

label2->Text = textBox1->Text;

}

private: System::Void button_mem_sub_Click(System::Object^  sender, System::EventArgs^  e) {

 if (!Double::IsNaN(memory)) {

textBox1->Text = label2->Text;

memory = Double::NaN;

label2->Text = "";

}

}

private: System::Void button_back_Click(System::Object^  sender, System::EventArgs^  e) {

 int index = textBox1->Text->Length;

 if (index == 1)

textBox1->Text = "0";

 else if (index == 2 && textBox1->Text->Substring(0, 1) == "-")

textBox1->Text = "0";

 else

textBox1->Text = textBox1->Text->Substring(0, index - 1);

}

private: System::Void button_point_Click(System::Object^  sender, System::EventArgs^  e) {

 if (!textBox1->Text->Contains(","))

textBox1->Text += ",";

}

private: System::Void button_clear_Click(System::Object^  sender, System::EventArgs^  e) {

textBox1->Text = "0";

operand1 = Double::NaN;

operand2 = Double::NaN;

memory = Double::NaN;

 label2->Text = "";

}

 private: double Calculate (Operations e, double x, double y){

  double res = Double::NaN;

  switch (e) {

  case Operations::ADD:

  res = x + y; break;

  case Operations::SUB:

  res = x - y; break;

  case Operations::MUL:

  res = x * y; break;

  case Operations::DIV:

  if (y != 0)

  res = x / y;

  else

  res = Double::NaN;

  break;

  case Operations::POW:

  res = pow(x, y); break;

  }

  return res;

}

private: System::Void button_add_Click(System::Object^  sender, System::EventArgs^  e) {

first = true;

 if (flag == Operations::NO) {

operand1 = Double::Parse(textBox1->Text);

flag = Operations::ADD;

}

 else if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::ADD;

}

}

private: System::Void button_sub_Click(System::Object^  sender, System::EventArgs^  e) {

first = true;

 if (flag == Operations::NO) {

operand1 = Double::Parse(textBox1->Text);

flag = Operations::SUB;

}

 else if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::SUB;

}

}

private: System::Void button_mul_Click(System::Object^  sender, System::EventArgs^  e) {

first = true;

 if (flag == Operations::NO){

operand1 = Double::Parse(textBox1->Text);

flag = Operations::MUL;

}

 else if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::MUL;

}

}

private: System::Void button_deg_Click(System::Object^  sender, System::EventArgs^  e) {

  first = true;

 if (flag == Operations::NO) {

operand1 = Double::Parse(textBox1->Text);

flag = Operations::POW;

}

 else if (flag != Operations::NO){

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::POW;

}

}

private: System::Void button_equal_Click(System::Object^  sender, System::EventArgs^  e) {

  first = true;

 if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::NO;

}

}

private: System::Void button_percent_Click(System::Object^  sender, System::EventArgs^  e) {

first = true;

if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

 switch (flag) {

 case Operations::ADD:

operand1 += operand1*operand2/100;  break;

 case Operations::SUB:

operand1 -= operand1*operand2/100;  break;

 case Operations::MUL:

operand1 *= operand1*operand2/100;  break;

 case Operations::DIV:

 if(operand2 != 0)

operand1 = 100/operand2;

 else

operand1 = Double::NaN; break;

 default:

 break;

}

textBox1->Text = operand1.ToString();

flag = Operations::NO;

}

 

}

private: System::Void button_div_Click(System::Object^  sender, System::EventArgs^  e) {

first = true;

 if (flag == Operations::NO) {

operand1 = Double::Parse(textBox1->Text);

flag = Operations::DIV;

}

 else if (flag != Operations::NO) {

operand2 = Double::Parse(textBox1->Text);

operand1 = Calculate(flag, operand1, operand2);

textBox1->Text = operand1.ToString();

flag = Operations::DIV;

}

}

// Записная  книжка

private: System::Void b_new_task_Click(System::Object^  sender, System::EventArgs^  e) {

dataGridView1->Rows->Add();

dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[1]->Value = "Введите задание...";

dataGridView1->Rows[dataGridView1->RowCount - 1]->Cells[1]->Selected = true;

addFlag = 1;

dataGridView1->BeginEdit(true);

}

private: System::Void b_remove_task_Click(System::Object^  sender, System::EventArgs^  e) {

if (dataGridView1->CurrentRow) {

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ DeleteQuery = "DELETE FROM Scheduler WHERE id_task = " + dataGridView1->CurrentRow->Cells[2]->Value;

OleDbCommand^ Command = gcnew OleDbCommand(DeleteQuery, conn);

Command->ExecuteNonQuery();

conn->Close();

dataGridView1->Rows->Remove(dataGridView1->CurrentRow);

}

}

private: System::Void b_modify_task_Click(System::Object^  sender, System::EventArgs^  e) {

if (dataGridView1->CurrentRow)

{

dataGridView1->CurrentRow->Cells[1]->Selected = true;

addFlag = false;

tmp_id = dataGridView1->CurrentRow->Cells[2]->Value->ToString();

addFlag = 2;

dataGridView1->BeginEdit(true);

}

}

private: void taskLoad () {

String^ dbname = "dbOrganizer.mdb";

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbname);

conn->Open();

String^ SelectQuery = "SELECT * FROM Scheduler";

OleDbCommand^ Command = gcnew OleDbCommand(SelectQuery, conn);

OleDbDataReader^ Reader = Command->ExecuteReader();

while (Reader->Read()){

dataGridView1->Rows->Add(Reader->GetBoolean(2), Reader->GetString(1), Reader->GetInt32(0));

}

Reader->Close();

conn->Close();

}

private: System::Void dataGridView1_CellMouseClick(System::Object^  sender, System::Windows::Forms::DataGridViewCellMouseEventArgs^  e) {

if (dataGridView1->CurrentCell->OwningColumn == dataGridView1->Columns[0]) {

 bool status = Boolean::Parse(dataGridView1->CurrentCell->Value->ToString());

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ UpdateQuery = "UPDATE Scheduler SET status_task = " + (!status).ToString() + " WHERE id_task = " + dataGridView1->CurrentRow->Cells[2]->Value;

OleDbCommand^ Command = gcnew OleDbCommand(UpdateQuery, conn);

Command->ExecuteNonQuery();

conn->Close();

}

}

private: System::Void dataGridView1_CellEndEdit(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e) {

 if (dataGridView1->CurrentCell) {

 if (addFlag == 1) {

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ InsertQuery = "INSERT INTO Scheduler (text_task) VALUES ('" + dataGridView1->CurrentRow->Cells[1]->Value + "')";

OleDbCommand^ Command = gcnew OleDbCommand(InsertQuery, conn);

Command->ExecuteNonQuery();

conn->Close();

dataGridView1->Rows->Clear();

taskLoad();

}

 else if (addFlag == 2) {

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ UpdateQuery = "UPDATE Scheduler SET text_task = '" + dataGridView1->CurrentCell->Value + "' WHERE id_task = " + tmp_id;

OleDbCommand^ Command = gcnew OleDbCommand(UpdateQuery, conn);

Command->ExecuteNonQuery();

conn->Close();

}

 addFlag = 0;

}

}

// Календарь

private: void eventLoad(DateTime date) {

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ SelectQuery = "SELECT * FROM Calendar WHERE date_event = '" + monthCalendar1->SelectionStart.Date.ToShortDateString() + "'";

OleDbCommand^ Command = gcnew OleDbCommand(SelectQuery, conn);

OleDbDataReader^ Reader = Command->ExecuteReader();

 while (Reader->Read()) {

dataGridView2->Rows->Add();

dataGridView2->Rows[dataGridView2->RowCount - 1]->Cells[0]->Value = Reader->GetInt32(0);

dataGridView2->Rows[dataGridView2->RowCount - 1]->Cells[1]->Value = Reader->GetString(2);

dataGridView2->Rows[dataGridView2->RowCount - 1]->Selected = false;

}

conn->Close();

}

private: System::Void monthCalendar1_DateChanged(System::Object^  sender, System::Windows::Forms::DateRangeEventArgs^  e) {

dataGridView2->Rows->Clear();

eventLoad(monthCalendar1->SelectionStart.Date);

}

private: System::Void dataGridView2_CellClick(System::Object^  sender, System::Windows::Forms::DataGridViewCellEventArgs^  e) {

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ SelectQuery = "SELECT text_event FROM Calendar WHERE id_event = " + dataGridView2->CurrentRow->Cells[0]->Value;

OleDbCommand^ Command = gcnew OleDbCommand(SelectQuery, conn);

OleDbDataReader^ Reader = Command->ExecuteReader();

 while (Reader->Read()) {

richTextBox1->Text = Reader->GetValue(0)->ToString();

}

conn->Close();

}

 

private: void deactivate () {

dataGridView2->Rows->Clear();

eventLoad(monthCalendar1->SelectionStart.Date);

dataGridView2->Visible = true;

label_name->Visible = false;

textBox_name->Visible = false;

button_save->Visible = false;

button_cancel->Visible = false;

 

monthCalendar1->Enabled = true;

but_add_event->Enabled = true;

but_modify_event->Enabled = true;

but_remove_event->Enabled = true;

richTextBox1->Clear();

richTextBox1->ReadOnly = true;

}

 private: void activate () {

dataGridView2->Visible = false;

label_name->Visible = true;

textBox_name->Visible = true;

button_save->Visible = true;

button_cancel->Visible = true;

 

monthCalendar1->Enabled = false;

but_add_event->Enabled = false;

but_modify_event->Enabled = false;

but_remove_event->Enabled = false;

richTextBox1->Clear();

richTextBox1->ReadOnly = false;

textBox_name->Focus();

}

private: System::Void but_add_event_Click(System::Object^  sender, System::EventArgs^  e) {

activate();

addFlag = 3;

}

private: System::Void button_cancel_Click(System::Object^  sender, System::EventArgs^  e) { deactivate(); }

private: System::Void button_save_Click(System::Object^  sender, System::EventArgs^  e) {

 if (textBox_name->Text != "")

{

OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbOrganizer.mdb");

conn->Open();

String^ Query;

 if (addFlag == 3) {

Query = "INSERT INTO Calendar (date_event, name_event, text_event) VALUES ('" + monthCalendar1->SelectionStart.Date.ToShortDateString() + "', '" + textBox_name->Text + "', '" + richTextBox1->Text->ToString() + "')";

}

 else if (addFlag == 4) {

Query = "UPDATE Calendar SET name_event = '" + textBox_name->Text + "', text_event = '" + richTextBox1->Text->ToString() + "' WHERE id_event = " + idEvent.ToString();

}

OleDbCommand^ Command = gcnew OleDbCommand(Query, conn);

Command->ExecuteNonQuery();

conn->Close();

deactivate();

Разработка электронного органайзера