1.3 Поиск ошибок и отладка
Последним этапом создания является поиск ошибок и отладка. Для этого необходимо проверить работоспособность форм, всех кнопок. После всех тестов по необходимости провести доработку исходного кода.
2.Архитектура программы
Данная программа обладает достаточно простой навигационной системой.
Для просмотра базы данных необходимо нажать на кнопку «База данных» в главном меню.
Рисунок 2.1 - титульная страница, отражающая назначение.
При нажатии на кнопку «База данных» переходим в базу данных.
Рисунок 2.2 – База данных.
При наведении на клиента он подсвечивается синим цветом, а при щелчке – красным (щелчок на клиенте даёт возможность работать с ним (добавить или просмотреть услуги)).
Каждая страница ИС включает навигационные элементы, охватывающие все разделы программы, причем эти элементы всегда на виду.
Все страницы программы, а также все интегрированные в них графические и интерактивные элементы минимальны по объему.
Весь проект выдержан в одном дизайнерском стиле, яркие, но не дикие цвета приятны для глаз.
Заключение
С первого взгляда понятно чему посвящена программа, дизайн соответствует его назначению. Страницы программы лишены громоздких модулей. Интерфейс получился простым и понятным, с любой страницы программы пользователь сможет вернуться в главное меню. С моей точки зрения программа получилась удобной для пользователей.
Можно считать, что основные цели и задачи работы выполнены.
Список использованных источников:
• http://www.techdays.ru/videos?search=XNA
• Google.com
• И др.
Приложение
Исходные коды программного продукта в электронном варианте.
Таблица 1 (Чтение базы данных)
#region GetDataBase
FileInfo f = new FileInfo("Configs.txt"); StreamReader reader = f.OpenText(); numOfClients= int.Parse(reader.ReadLine()); reader.Close(); #region reading for (int Z = 0; Z < numOfClients; Z++) { FileInfo F = new FileInfo(Z.ToString() + ".txt"); StreamReader READER = F.OpenText(); clients.Add(new Client()); clients[Z].Name = READER.ReadLine(); clients[Z].FamilyName = READER.ReadLine(); clients[Z].Surname = READER.ReadLine(); clients[Z].TelephoneNumber = READER.ReadLine(); clients[Z].bDay = READER.ReadLine(); clients[Z].bMonth = READER.ReadLine(); clients[Z].About = READER.ReadLine(); READER.Close();
FileInfo NOS = new FileInfo(Z.ToString() + "NOS.txt"); StreamReader reader1 = NOS.OpenText(); clients[Z].numofServices = int.Parse(reader1.ReadLine()); reader1.Close();
for (int M = 0; M <= clients[Z].numofServices; M++) { FileInfo Servs = new FileInfo(Z.ToString() + "-SBD-" + M.ToString() + ".txt"); StreamReader reader2 = Servs.OpenText(); int m = int.Parse(reader2.ReadLine()); clients[Z].Pay.Add(m); clients[Z].Zametki.Add(reader2.ReadLine());
int DAY = int.Parse(reader2.ReadLine()); int MONTH = int.Parse(reader2.ReadLine()); int YEAR = int.Parse(reader2.ReadLine()); int HOUR = int.Parse(reader2.ReadLine()); int MINUTE = int.Parse(reader2.ReadLine()); clients[Z].Date.Add(new DateTime(YEAR,MONTH,DAY,HOUR,MINUTE,0)); reader2.Close(); }
} #endregion #endregion |
Таблица 2 (Функции рисования таблицы и маркера клиента)
public void ShowDataBase() { if (ProgramState == 2) {//(Table)*TabC<=clients.Count/TabC if (keyboard.IsKeyDown(Keys.Add)&& prevkeybd.IsKeyUp(Keys.Add)&& clients.Count - Table*TabC >=TabC)// clients.Count>=TabC*(Table+1) { Table++; ClickedInd = 0; } if (keyboard.IsKeyDown(Keys.Subtract) && prevkeybd.IsKeyUp(Keys.Subtract)&&Table>0) {Table--;} int letyoudraw = 1; for (int m = minCind; m < maxCind; m++) { if (letyoudraw==1) { if (maxCind < numOfClients) { spriteBatch.DrawString(Font, clients[m].Name + " " + clients[m].FamilyName + " " + clients[m].Surname, new Vector2(30, 50 + (m - minCind) * 30), Color.Black); } else { for (int t = minCind; t < numOfClients; t++) { spriteBatch.DrawString(Font, clients[t].Name + " " + clients[t].FamilyName + " " + clients[t].Surname, new Vector2(30, 50 + (t - minCind) * 30), Color.Black); } letyoudraw = 0; } }
} spriteBatch.Draw(Content.Load<Texture2D>("Textures/Backward"), new Rectangle(0, (height * 4) / 5, 260, 60), Color.White); } }
public void GetClientIndex() { minCind = Table * TabC; maxCind = (Table+1)*TabC; float MWidth = 0; if (ProgramState == 2) { int cInd = (int)((mouse.Y - 50) / 30); if (cInd >= 0 && cInd + minCind< numOfClients)//for (int m = minCind; m < maxCind; m++) { int g = cInd + minCind; MWidth = (clients[g].Name.Length + clients[g].FamilyName.Length + clients[g].Surname.Length + 1.5f) * 14; if (mouse.X >= 30 && mouse.X <= MWidth && mouse.Y<50+30*(TabC)) { currIndex = cInd; spriteBatch.Draw(marker, new Rectangle(30, 50+cInd*30, (int)MWidth, 30), Color.White);
if (clicking==false){DrawClientIndex(currIndex);}
if (mouse.LeftButton == ButtonState.Pressed && prMouse.LeftButton == ButtonState.Released) {clicking = true; ClickedInd = currIndex;} }
} if (clicking && ClickedInd>=0) { int g = ClickedInd + minCind; if (g <= numOfClients) { spriteBatch.Draw(mClarker, new Rectangle(30, 50 + ClickedInd * 30, (int)((clients[g].Name.Length + clients[g].FamilyName.Length + clients[g].Surname.Length + 1.5f) * 14), 30), Color.White);
// Texture2D Photo = Texture2D.FromFile(GraphicsDevice,ClickedInd.ToString()+".jpg"); //spriteBatch.Draw(Content.Load<Texture2D>(g.ToString() + ".jpg"), new Rectangle(650, 50, 200, 250), Color.White); //spriteBatch.Draw(Photo, new Rectangle(), Color.White); DrawClientIndex(ClickedInd); } } } } |