Разработка структуры класса "Адресное бюро"
Разработка структуры класса "Адресное бюро"
Курсовой проект на тему: Разработка структуры класса "Адресное бюро" Муром 2010 Данный курсовой проект направлен на создание иерархии классов «Адресное бюро», содержащую информацию о частных лицах, предприятиях и их адресах, а также разработку тестирующего приложения, позволяющего быстро и без особых усилий получить данные об интересующем лице. Введение С развитием ЭВМ и информатизацией общества возникает вопрос о компьютеризации большого количества данных, для удобства их использования. К тому же это делает их более доступными и упорядоченными. Данный курсовой проект позволит заменить большое количество бумаг и сделает поиск более удобным и быстрым, тем самым сэкономит время. В связи с этим была определена цель - разработать иерархию классов «Адресное бюро», в которой будет храниться информация о лицах и организациях, а также их адресах. Существует множество специализированных программ, позволяющих компьютеризировать огромное количество данных о лицах, организациях и их адресах. Отличительной особенностью данной программы является простота интерфейса, наглядное отображение данных, быстрый поиск по всем полям записи. Найденные записи отфильтровываются от других. Может использоваться как электронный справочник любой другой информации. Тема курсового проекта является актуальной, потому что данное приложение значительно облегчает работу с большим количеством данных. Основная задача курсового проекта - разработка приложения на основе иерархии классов, для введения данных об адресах частных лиц и предприятий, которое позволит осуществлять мгновенный поиск данных о любых лицах. Анализ технического задания В курсовом проекте поставлена задача создания универсального приложение на основе разработанной иерархии классов. Исходя из основной задачи проекта, были поставлены следующие задачи: - Разработка иерархии классов, которая должна содержать не менее трех уровней; - Разработка структуры каждого класса в отдельности; - С помощью наследования определение базовых и производных классов; Требуется создать программу, которая смогла бы обрабатывать данные независимо от их количества. Данный справочник адресов может применяться в любой справочной системе. Для удобной работы с большим количеством данных необходимо их упорядочить. Для этого следует разбить их на несколько небольших групп с общими свойствами и далее работать с ними отдельно. Необходимо предусмотреть обработку каждой группы данных. Требования, предъявляемые к программе, предполагают использование объектно-ориентированного подхода при разработке программы. Объектно-ориентированный подход делает реализованное приложение более гибким и универсальным. При необходимости возможно дополнять приложение различными свойствами и функциями. Данную программу можно разработать на любом объектно-ориентированном языке программирования. Одним из наиболее распространенных на сегодня объектно-ориентированных языков программирования является C#. Язык C# представляет собой мощный и популярный объектно-ориентированный язык, предназначенный специально для применения вместе с .NET. По сравнению с другими объектно-ориентированными языками С# обладает несколькими особенностями: - Полная поддержка классов и объектно-ориентированного программирования, включая наследование реализации и интерфейсов, виртуальные функции и перегрузку операций. - Согласованный и четко определенный набор базовых типов. - Автоматическая очистка динамически распределяемой памяти. - Полная поддержка библиотеки базовых классов .NET наряду с легким доступом к Windows API - Указатели и прямой доступ в память при необходимости доступны, но язык спроектирован так, что в большинстве случаев без них можно обойтись. В качестве среды разработки была выбрана среда Visual Studio 2010, она является универсальной интегрированной средой разработки, обеспечивающая высокое качество кода. Visual Studio 2010 включает в себя полный набор новых и улучшенных функций, упрощающих все этапы процесса разработки от проектирования до развертывания. Для того чтобы создать тестовую программу необходимо иметь ввиду, что программа создается главным образом для пользователя. В зависимости от этого необходимо создать удобный и понятный пользовательский интерфейс. Также необходимо предусмотреть все возможности управления приложением, чтобы упростить работу пользователя и максимально обеспечить эффективность работы. Кроме того, программа должна правильно добавлять данные, редактировать их и выводить на экран. Также необходимо реализовать поиск записей по имени и по адресу. Найденные записи должны выводиться отдельно от других. Одним из важных показателей качества программного обеспечения является удобство его использования. Оно описывается с помощью таких характеристик: - как понятность пользовательского интерфейса; - легкость обучения работе с ним; - трудоемкость решения определенных задач с его помощью; - производительность работы пользователя с ПО; - частота появления ошибок и жалоб на неудобства. Основные факторы, с помощью которых можно оценить или даже измерить удобство использования программы, следующие: - Адекватность интерфейса. Адекватность пользовательского интерфейса программы -- это его соответствие тем задачам, которые пользователи должны и хотели бы решать с ее помощью. - Производительность работы пользователей. Это количество однотипных реальных задач, которые пользователь может решить с помощью ПО за единицу времени. - Скорость обучения новых пользователей. Это количество задач, выполнению которых новый пользователь самостоятельно обучается за единицу времени. - Эффективность предотвращения и преодоления ошибок пользователей. Этот показатель тем лучше, чем реже пользователи ошибаются при работе с данным интерфейсом и чем меньше времени и усилий требуется для преодоления последствий уже сделанных ошибок. - Правило доступности. Система должна быть настолько понятной, чтобы пользователь, никогда раньше не видевший ее, но хорошо разбирающийся в предметной области, мог без всякого обучения начать ее использовать. - Правило эффективности. Система не должна препятствовать эффективной работе опытных пользователей, работающих с ней долгое время. - Правило непрерывного развития. Система должна способствовать непрерывному росту знаний, умений и навыков пользователя и приспосабливаться к его меняющемуся опыту. - Правило поддержки. Система должна способствовать более простому и быстрому решению задач пользователя. Это означает, прежде всего, что система должна действительно решать задачи пользователя. Кроме того, она должна решать их лучше, проще и быстрее, чем имевшиеся до ее появления инструменты и методы. - Принцип структуризации. Пользовательский интерфейс должен быть целесообразно структурирован. Близкие по смыслу, родственные его части должны быть связаны видимым образом, а независимые -- разделены; похожие элементы должны выглядеть похоже, а непохожие -- различаться. - Принцип простоты. Наиболее распространенные операции должны выполняться максимально просто. При этом должны быть видимые ссылки на более сложные процедуры. - Принцип видимости. Все функции и данные, необходимые для решения определенной задачи, должны быть видны, когда пользователь пытается ее решить. - Принцип обратной связи. Пользователь должен получать сообщения о действиях системы и о важных событиях внутри нее. Сообщения должны быть информативными, краткими, однозначными и написанными на языке, понятном пользователю. Исходя из всего этого, ставятся основные требования к приложению: 1. Удобный пользовательский интерфейс; 2. Обеспечение гибкости программы для добавления новых функций; 3. Надежность программы; Проектирование структуры программы и базовых алгоритмов Анализируя исходные данные к программе, ставится задача создать иерархию классов «Адресное бюро». Базовым классом в иерархии является абстрактный класс Address, который имеет поля: город(), улица(), дом(), корпус(). Также класс Address включает в себя виртуальные методы: задание (города, улицы, дома и корпуса) - Set(), и получение (города, улицы, дома и корпуса) - Get() - которые впоследствии переопределяются в каждом классе. Все остальные классы будут наследоваться от этого класса. В C# существуют два вида наследования: наследование is-a (классическое наследование) и has-a (включение-делегирование). В основном приходится иметь дело с наследованием первого типа. Второй вид встречается крайне редко, но всё же бывает полезен. При классическом наследовании на основе существующих классов создаются новые, более совершенные классы, добавляются новые поля, методы и свойства. Суть наследования включение-делегирование заключается в том, что один класс поглощает другой. Проще говоря - это использование одного класса в другом. В данной курсовой работе используются два вида наследования. От абстрактного класса Address наследуется класс Flat с помощью классического наследования. Таким образом, класс Flat содержат собственные поля - фамилия(), имя(), отчество(), и наследуемые поля - город(), улица(), дом(), корпус(), собственные и наследуемые от базового класса Address методы, впоследствии переопределенные в производном. Аналогично классу Flat наследуется класс Predpriyatiya. Единственное отличие состоит в том, что класс Predpriyatiya содержит в себе класс Podrazdel. Это включение-делегирование. Класс Podrazdel наследуется классически от класса Predpriyatiya. Иерархия классов «Адресное бюро» приведена ниже: Рисунок 1 - Иерархия классов «Адресное бюро» На основе иерархии классов строится алгоритм работы программы: 1) Необходимо выбрать одну из вкладок a) Если выбрана первая вкладка, то работа происходит с классом «Частные квартиры». b) Если выбрана вторая вкладка, то работа происходит с классом «Предприятия». c) Если выбрана третья вкладка, то работа происходит с классом «Подразделения». 2) Необходимо выбрать действие, которое нужно совершить с выбранным классом (добавление, удаление, редактирование, поиск) a) Добавление. Происходит нажатием кнопки «Добавить». 1) Если выбран класс «Частные квартиры», то добавление происходит в него. (1) Для начала необходимо заполнить поля записи: фамилия - textBox1, имя - textBox2, отчество - textBox3, город - textBox4, улица - textBox5, дом - textBox6, корпус - textBox7. (2) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Частные квартиры». (3) Экземпляр класса «Частные квартиры» добавляется в конец контейнера List<> типа «Частные квартиры». 2) Если выбран класс «Предприятия», то добавление происходит в него. (1) Для начала необходимо заполнить поля записи: название предприятия - textBox1, директор предприятия - textBox2, телефон - textBox3, город - textBox4, улица - textBox5, дом - textBox6, корпус - textBox7. (2) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Предприятия». (3) Экземпляр класса «Предприятия» добавляется в конец контейнера List<> типа «Предприятия». (4) Имя предприятия заносится в comboBox. 3) Если выбран класс «Подразделения», то добавление происходит в него. (1) Для начала необходимо выбрать из comboBox-а названия предприятия, для которого будут добавлены подразделения. (2) Заполняются поля записи: название подразделения - textBox1, зав. отделением - textBox2, ф.и.о. - textBox3, город - textBox4, улица - textBox5, дом - textBox6, корпус - textBox7. (3) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Подразделения». (4) Экземпляр класса «Подразделения» добавляется в конец контейнера List<> типа «Подразделения». b) Удаление. Происходит нажатием кнопки «Удалить». 1) Если выбран класс «Частные квартиры», то удаление происходит из него. (1) Если в списке нет записей, программа выдает ошибку. (2) Выбирается строка с необходимой записью. (3) Нажимается кнопка «Удалить». (4) Считывается индекс выбранной строки. (5) Из контейнера выбирается запись с данным индексом (6) Запись удаляется (7) Происходит обновление таблицы (в цикле перебираются все записи и заново отображаются в dataGridView, последняя строчка dataGridView удаляется). 2) Если выбран класс «Предприятия», то удаление происходит из него. (1) Если в списке нет записей, программа выдает ошибку. (2) Выбирается строка с необходимой записью. (3) Нажимается кнопка «Удалить». (4) Считывается индекс выбранной строки. (5) Из контейнера выбирается запись с данным индексом. (6) Запись удаляется. (7) Также удаляются все подразделения этого предприятия. (8) Удаляется имя предприятия из comboBox-а. (9) Происходит обновление таблицы (в цикле перебираются все записи и заново отображаются в dataGridView, последняя строчка dataGridView удаляется). 3) Если выбран класс «Подразделения», то удаление происходит из него. (1) Необходимо выбрать из comboBox-а названия предприятия, из которого будут удалены подразделения. (2) Если в списке нет записей, программа выдает ошибку. (3) Выбирается строка с необходимой записью. (4) Нажимается кнопка «Удалить». (5) Считывается индекс выбранной строки. (6) Из контейнера выбирается запись с данным индексом (7) Запись удаляется (8) Происходит обновление таблицы (в цикле перебираются все записи и заново отображаются в dataGridView, последняя строчка dataGridView удаляется). c) Редактирование. Происходит при двойном клике на выбранной записи. 1) Если выбран класс «Частные квартиры», то происходит редактирование его записей. (1) При двойном клике появляется форма редактирования с текущим состоянием выбранной записи. (2) В textBox1-7 заносится новое значение записи. (3) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Частные квартиры». (4) Поля экземпляра контейнера List<> типа «Частные квартиры» заменяются полями экземпляра класса «Частные квартиры». 2) Если выбран класс «Предприятия», то происходит редактирование его записей. (1) При двойном клике появляется форма редактирования с текущим состоянием выбранной записи. (2) В textBox1-7 заносится новое значение записи. (3) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Предприятия». (4) Поля экземпляра контейнера List<> типа «Предприятия» заменяются полями экземпляра класса «Предприятия». 3) Если выбран класс «Подразделения», то происходит редактирование его записей. (1) Необходимо выбрать из comboBox-а названия предприятия, подразделения которого будут редактированы. (2) При двойном клике появляется форма редактирования с текущим состоянием выбранной записи. (3) В textBox1-7 заносится новое значение записи. (4) После заполнения полей нажимается кнопка «Ок». Заполняется экземпляр класса «Подразделения». (5) Поля экземпляра контейнера List<> типа «Подразделения» заменяются полями экземпляра класса «Подразделения». d) Поиск. Для поиска необходимо выбрать с помощью radioButton-а по каким полям он будет происходить (по имени, по адресу). 1) Если выбран класс «Частные квартиры», то происходит поиск его записей. (1) Переменной типа string присваивается значение textbox-а. (2) В цикле перебираются все записи. (a) Если выбран поиск по имени то сравниваются поля имя, фамилия, отчество. (b) Если выбран поиск по адресу то сравниваются поля город, улица, дом, корпус. (3) Если переменная равна какому-либо полю, то эта запись выводится в dataGridView. 2) Если выбран класс «Предприятия», то происходит поиск его записей. (1) Переменной типа string присваивается значение textbox-а. (2) В цикле перебираются все записи. (a) Если выбран поиск по имени, то сравнивается поле название предприятия. (b) Если выбран поиск по адресу то сравниваются поля город, улица, дом, корпус. (3) Если переменная равна какому-либо полю, то эта запись выводится в dataGridView. Программная реализация разработанной структуры и алгоритмов Для реализации данного приложения было использовано 2 формы: главная форма приложения, где отображаются введенные данные, и осуществляется поиск записей; и форма для добавления и редактирования записей. Для оформления главной формы был использован компонент TabControl, который содержит 3 вкладки (TabPage). На всех трех вкладках располагается DataGridView. Этот компонент удобен тем, что отображает все данные упорядоченно в таблице. В зависимости от выбранной вкладки появляется та или иная таблица с данными. На первой вкладке TabControl-а отображаются данные класса Flat, на второй - класса Predpriyatiya, на третьей - Podrazdel. Добавление в класс осуществляется после нажатия кнопки «Добавить». В форме диалога вызывается вторая форма, на которой находятся 7 текстовых полей - TextBox-ов, в которые пользователи вводят данные о том или ином лице. После заполнения нажимается кнопка «Ок», данные заносятся в экземпляр соответствующего класса, объявленный в этой форме: FlatAdr = new Flat(); FlatAdr.SetLastName(textBox1.Text); FlatAdr.SetFirstName(textBox2.Text); FlatAdr.SetMiddleName(textBox3.Text); FlatAdr.SetTown(textBox4.Text); FlatAdr.SetStreet(textBox5.Text); FlatAdr.SetNumber(Convert.ToUInt32(textBox6.Text)); FlatAdr.SetKorpus(Convert.ToUInt32(textBox7.Text)); Если были заполнены не все поля, программа вызовет MessageBox с ошибкой. Далее данные передаются из формы добавления в главную форму. После добавления данные заносятся в специальный контейнер List<>. В угловых скобках пишется тип данных этого контейнера. В зависимости от того какая вкладка была активной, данные добавляются в соответствующий класс. Функция добавления приведена ниже: switch (tabControl1.SelectedIndex) {case 0: list.Add(form.FlatAdr); dataGridView1.Rows.Add(); dataGridView1.Rows[list.Count - 1].Cells[0].Value = list[list.Count - 1].LastName; dataGridView1.Rows[list.Count - 1].Cells[1].Value = list[list.Count - 1].FirstName; dataGridView1.Rows[list.Count - 1].Cells[2].Value = list[list.Count - 1].MiddleName; dataGridView1.Rows[list.Count - 1].Cells[3].Value = list[list.Count - 1].Town; dataGridView1.Rows[list.Count - 1].Cells[4].Value = list[list.Count - 1].Street; dataGridView1.Rows[list.Count - 1].Cells[5].Value = list[list.Count - 1].Number.ToString(); dataGridView1.Rows[list.Count - 1].Cells[6].Value = list[list.Count - 1].Korpus.ToString(); break;} Для того чтобы удалить запись, нужно выбрать из таблицы необходимую строку. Программа считывает номер активной строки и присваивает его переменной. Затем встроенная функция контейнера Remove() удаляет элемент с указанным индексом. Далее обновляются данные в таблице. Функция удаления приведена ниже: numb = Convert.ToInt32(dataGridView1.CurrentRow.Index); list.Remove(list[numb]); if (list.Count != 0) dataGridView1.Rows.RemoveAt(list.Count - 1); else dataGridView1.Rows.RemoveAt(0); for (int k = 0; k < list.Count; k++) {dataGridView1.Rows[k].Cells[0].Value = list[k].LastName; dataGridView1.Rows[k].Cells[1].Value = list[k].FirstName; dataGridView1.Rows[k].Cells[2].Value = list[k].MiddleName; dataGridView1.Rows[k].Cells[3].Value = list[k].Town; dataGridView1.Rows[k].Cells[4].Value = list[k].Street; dataGridView1.Rows[k].Cells[5].Value = list[k].Number.ToString(); dataGridView1.Rows[k].Cells[6].Value = list[k].Korpus.ToString();} Функция редактирования аналогична функции добавления. Двойным кликом по редактируемой строке вызывается форма Добавления (Редактирования). Этой форме передаются текущее значение данных. Далее данные редактируются и передаются главной форме. Принцип редактирования аналогичен добавления. Из TextBox-ов данные заносятся в экземпляр класса, затем поля записей в контейнере заменяются полями экземпляра класса. Таблица обновляется. Функция редактирования: numb1 = Convert.ToInt32(dataGridView1.CurrentRow.Index); form.textBox1.Text = list[numb1].LastName; form.textBox2.Text = list[numb1].FirstName; form.textBox3.Text = list[numb1].MiddleName; form.textBox4.Text = list[numb1].Town; form.textBox5.Text = list[numb1].Street; form.textBox6.Text = list[numb1].Number.ToString(); form.textBox7.Text = list[numb1].Korpus.ToString(); form.ShowDialog(); list[numb1].LastName = form.FlatAdr.LastName; list[numb1].FirstName = form.FlatAdr.FirstName; list[numb1].MiddleName = form.FlatAdr.MiddleName; list[numb1].Town = form.FlatAdr.Town; list[numb1].Street = form.FlatAdr.Street; list[numb1].Number = form.FlatAdr.Number; list[numb1].Korpus = form.FlatAdr.Korpus; dataGridView1.Rows[numb1].Cells[0].Value = list[numb1].LastName; dataGridView1.Rows[numb1].Cells[1].Value = list[numb1].FirstName; dataGridView1.Rows[numb1].Cells[2].Value = list[numb1].MiddleName; dataGridView1.Rows[numb1].Cells[3].Value = list[numb1].Town; dataGridView1.Rows[numb1].Cells[4].Value = list[numb1].Street; dataGridView1.Rows[numb1].Cells[5].Value = list[numb1].Number.ToString(); dataGridView1.Rows[numb1].Cells[6].Value = list[numb1].Korpus.ToString(); В приложении реализован поиск по имени (radioButton1) или по адресу (radioButton2). Компонент RadioButton позволяет пользователю выбрать единственный вариант из группы доступных, когда используется вместе с другими элементами управления RadioButton. Если необходимо осуществить поиск по имени, то выбирается radioButton1, в TextBox1 вводится информация для поиска, нажимается кнопка «Искать». Информация для поиска заносится в переменную типа string. Затем в цикле перебираются все записи данного класса и сравнивается поле имя, фамилия, отчество (либо только имя) с этой переменной. Поиск по имени выглядит так: if (radioButton1.Checked == true) {for (int i = 0; i < list.Count; i++) {if ((list[i].LastName == search) || (list[i].FirstName == search) || (list[i].MiddleName == search)) {dataGridView1.Rows.Add(); dataGridView1.Rows[k1].Cells[0].Value = list[i].LastName; dataGridView1.Rows[k1].Cells[1].Value = list[i].FirstName; dataGridView1.Rows[k1].Cells[2].Value = list[i].MiddleName; dataGridView1.Rows[k1].Cells[3].Value = list[i].Town; dataGridView1.Rows[k1].Cells[4].Value = list[i].Street; dataGridView1.Rows[k1].Cells[5].Value = list[i].Number.ToString(); dataGridView1.Rows[k1].Cells[6].Value = list[i].Korpus.ToString(); k1++;}}} Поиск по адресу аналогичен поиску по имени, только сравниваются поля город, улица, дом, корпус. Поиск по адресу: if (radioButton2.Checked == true) {for (int i = 0; i < list.Count; i++) {if ((list[i].Town == search) || (list[i].Street == search) || (list[i].Number.ToString() == search) || (list[i].Korpus.ToString() == search)) {dataGridView1.Rows.Add(); dataGridView1.Rows[k1].Cells[0].Value = list[i].LastName; dataGridView1.Rows[k1].Cells[1].Value = list[i].FirstName; dataGridView1.Rows[k1].Cells[2].Value = list[i].MiddleName; dataGridView1.Rows[k1].Cells[3].Value = list[i].Town; dataGridView1.Rows[k1].Cells[4].Value = list[i].Street; dataGridView1.Rows[k1].Cells[5].Value = list[i].Number.ToString(); dataGridView1.Rows[k1].Cells[6].Value = list[i].Korpus.ToString(); k1++;}}} Найденные записи отображаются в таблице отдельно от других записей. Если после поиска необходимо отобразить все записи, нужно нажать кнопку «Все записи». Руководство программиста Приложение «Адресное бюро» предназначено для хранения данных о частных лицах или предприятиях и их адресах, для быстрого их поиска. В данном приложении реализовано добавление, удаление, редактировании и поиск информации. Программа была разработана в интегрированной среде программирования Microsoft Visual Studio 2010. Приложение состоит из исполнимого модуля Kursach.exe, файла главной формы Form.cs, файла формы добавления Added.cs. Данная программа тестировалась на компьютере следующей конфигурации: 1. Процессор Intel(R) Core(TM) i3 CPU M330 @2.13 GHz 2.13 GHz 2. ОЗУ 2.00 ГБ 3. ОС Windows 7 Максимальная 32-разрядная Для выполнения программы необходимо наличие: 1. процессор AMD Athlon 64 или Pentium 2. оперативная память не менее 64 Мб 3. жесткий диск емкостью не менее 1 Гб 4. экран разрешением не менее 800 х 600 точек 5. клавиатура, мышь 6. установленная операционная система , Windows Me, Windows 2000, Windows XP, Windows Vista, Windows 7 + наличие дисковода. Все современные компьютеры удовлетворяют данным требованиям. Программа состоит из трех основных частей: иерархия классов, главная форма, форма добавления. Основу главной формы составляют функции добавления, удаления, редактирования и поиска. Руководство пользователя Для того чтобы запустить приложение, необходимо открыть исполнительный файл Kursach.exe. После этого появится главная форма программы, на которой находятся три вкладки с таблицами, кнопки «Добавить», «Удалить», «Искать» и «Список». Для работы с разными классами необходимо для начала выбрать активной одну из закладок. По умолчанию активной является первая закладка. После того как закладка выбрана можно работать с классами. Для добавления записи необходимо нажать кнопку «Добавить», после чего появится форма добавления. Затем нужно заполнить все поля и нажать кнопку «Ок». Если не заполнены все поля, то программа выдаст сообщение об ошибке и предложит заполнить все поля. При желании возможно отказаться от добавления и нажать кнопку «Отмена». После добавления запись автоматически отображается в таблице. Для удаления записи необходимо выделить строку и нажать кнопку «Удалить». Если записей в таблице нет, то при попытке нажать кнопку «Удалить», программа выдаст сообщение об ошибке. Для того чтобы отредактировать запись, необходимо кликнуть два раза по выбранной строке в таблице. Появится форма, которая будет содержать текущее значение записи. При необходимости можно исправить эту информацию и нажать кнопку «Ок». Данные обновятся в таблице. Для поиска необходимо выбрать, по каким параметрам он будет осуществляться, и ввести информацию в текстовое поле. Найденные записи будут выведены в таблице. При необходимости можно отобразить весь список записей. Для этого нужно нажать кнопку «Все записи».
|