Министерство образования Республики Беларусь Учреждение образования «Витебский государственный университет имени П. М. Машерова» Институт повышения квалификации и переподготовки кадров Факультет переподготовки кадров КУРСОВАЯ РАБОТА по дисциплине «Средства визуального программирования приложений» ИНФОРМАЦИОННАЯ СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ ТЕЛЕФОННЫХ СОЕДИНЕНИЙ Выполнил: Станкевич Сергей Михайлович, специальность 1-40 01 73 «Программное обеспечение информационных систем», группа Пм-21 Руководитель: Сергеенко Сергей Владимирович, старший преподаватель Витебск, 2016 Содержание Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 База данных телефонных соединений . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1 Описание предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Схема данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Краткая характеристика используемой СУБД . . . . . . . . . . . . . . . . . . . 8 Клиентская часть информационной системы . . . . . . . . . . . . . . . . . . . . . 10 2.1 Проектирование клиентской части информационной системы . . . . . . . . . . 10 2.2 Краткая характеристика используемых инструментов разработки . . . . . . . . 12 2.3 Программирование клиентской части информационной системы . . . . . . . . 14 Работа с информационной системой . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.1 Установка и настройка серверной части . . . . . . . . . . . . . . . . . . . . . . 25 3.2 Установка и настройка клиентской части . . . . . . . . . . . . . . . . . . . . . . 26 3.3 Использование информационной системы . . . . . . . . . . . . . . . . . . . . . 27 Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Список использованных источников . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Приложение А Код SQL для создания базы данных smdr . . . . . . . . . . . . . . . . 33 Приложение Б Исходные коды приложения SMDR Viewer . . . . . . . . . . . . . . . 35 Б.1 Файл wx_testApp.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Б.2 Файл wx_testApp.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Б.3 Файл wx_testMain.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Б.4 Файл wx_testMain.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Б.5 Файл dbDriver.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Б.6 Файл dbDriver.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Б.7 Файл dlgConnect.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Б.8 Файл dlgConnect.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Б.9 Файл dlgTables.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Б.10 Файл dlgTables.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Б.11 Файл dlgFilter.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Б.12 Файл dlgFilter.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Б.13 Файл version.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 1 2 3 Реферат Курсовая работа: 64 с., 12 рис., 20 источников, 2 приложения. ИНФОРМАЦИОННАЯ СИСТЕМА, ТЕЛЕФОННОЕ СОЕДИНЕНИЕ, АТС, СТАТИСТИКА ТЕЛЕФОННЫХ СОЕДИНЕНИЙ, ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ, БАЗА ДАННЫХ, Объект исследования –– автоматическая телефонная станция офисного типа LG LDK–300. Предмет исследования –– детальное протоколирование телефонных соединений. Цель работы –– систематизация знаний и получение первоначального опыта проектирования баз данных и приложений для обработки данных. Методы исследования: информационно-аналитический. Теоретическая и практическая значимость: результаты работы будут применяться в разработке новой версии автоматизированной информационно-аналитической системы «Электронный университет» учреждения образования «Витебский государственный университет имени П. М. Машерова». Введение Целью данной работы является систематизация знаний и получение первоначального опыта проектирования баз данных и приложений для обработки данных. Актуальность работы вытекает из ее целей. Выполнение данной работы позволит всесторонне изучить процесс организации баз данных, разобраться в принципах работы современных СУБД, освоить основы проектирования программных средств для взаимодействия с СУБД. Для достижения поставленной цели необходимо решить следующие задачи: – изучить и проанализировать с точки зрения эффективности автоматизации предметную область; – выбрать систему управления для реализации базы данных; – спроектировать структуру базы данных в рамках выбранной СУБД; – выбрать средства разработки для реализации информационной системы; – спроектировать клиентскую часть информационной системы (приложение для работы с базой данных); – заполнить базу корректными данными; – описать и выполнить контрольные примеры, демонстрирующие работоспособность информационной базы и приложения; – описать процесс установки, настойки и использования разработанного приложения. 3 1 1.1 База данных телефонных соединений Описание предметной области В процессе работы телекоммуникационного оборудования часто возникает задача расчета стоимости телефонных разговоров, отображения суммарного времени телефонных соединений, выбор статистики по конкретному абоненту и т. д. Для решения такого класса задач автоматические телефонные станции (АТС) офисного типа используют детальное протоколирование телефонных соединений (англ. Station Messaging Detail Record, SMDR). Практически любая современная офисная АТС в том или ином виде предлагает SMDR-сервис для получения информации о каждом соединении. Вид этой информации и степень её детализации зависят от типа телекоммуникационного оборудования (модели изделия, его прошивки) и конкретных настроек. Как правило, для каждого состоявшегося звонка SMDR-информация содержит номера вызывающего и вызываемого абонентов, длительность соединения, время его окончания (по часам АТС) и другую сопроводительную информацию. Далее программа тарификации на основе полученных SMDR-данных формирует счета на оплату телефонных переговоров, рассчитывает степень загруженности линий и операторов, активности абонентов и т. д. Для выполнения данной работы в процессе изучения курса «Организация и проектирование баз данных» авторами была проанализирована предметная область с условным названием «Автоматическая телефонная станция организации (учреждения)». В организации (учреждении) существуют определенные подразделения. Каждое подразделение имеет внутренний трехзначный телефонный номер. Посредством этого номера совершаются телефонные вызовы внутри организации. Каждый внутренний номер присоединен к определенной телефонной линии, что позволяет совершать вызовы за пределы организации. Один номер может быть присоединен к нескольким линиям. В этом случае для совершения исходящего вызова автоматическая телефонная станция (АТС) выбирает первую свободную линию. Входящие и исходящие вызовы регистрируются на АТС и для каждого из них записывается определённая информация: порядковый номер вызова, номер принимающего абонента, номер линии, по которой был совершен вызов, время окончания вызова, длительность вызова, дату совершения вызова, тип вызова, исходящий номер. 4 1.2 Схема данных Для удобства дальнейшего изложения введем некоторые определения согласно ГОСТ 34.321– 96. «Информационные технологии. Система стандартов по базам данных. Эталонная модель управления данными» [1]. Информационная система –– это система, которая организует процессы сбора, хранения и обработки информации о проблемной области. Она может быть размещена на одной или нескольких компьютерных системах (в этом случае она называется распределенной). Данные поступают в информационную систему и исключаются из нее, и эти взаимодействия могут осуществляться или людьми, или процессами. Постоянные данные –– это данные, которые хранятся в информационной системе в течение определенного периода времени. Система, которая выполняет функцию организации и управления постоянными данными, называется системой управления данными. Постоянные данные в среде базы данных заключают в себе схему и базу данных. Схема –– это описания содержания, структуры и ограничения целостности, используемые для создания базы данных. База данных –– это набор постоянных данных, определенных с помощью схемы. Система управления данными использует определения данных в схеме, чтобы предоставлять возможность доступа и управлять доступом к данным в базе данных. Независимость данных –– это независимость процессов от объектов данных, которая состоит в том, что объекты данных могут быть изменены без нарушения процессов. Процесс управления данными может быть вызван пользователем, процессами управления данными или другими процессами. Процессы выполняются процессорами, каждый из которых имеет интерфейс. Интерфейс процессора должен быть точно определен. Такие интерфейсы могут быть независимыми от стандартного языка программирования, используемого для определения процесса с использованием интерфейса. В данной работе в процессе проектирования базы данных решались следующие задачи: 1. Выделение основных абстракций (сущность, атрибут, связь) в предметной области и определение их параметров. 2. Проработка списка возможных запросов к базе данных на основе анализа предметной области. 3. Построение концептуальной модели в виде ER-диаграммы. 4. Представление концептуальной модели в терминах реляционной. 5. Описание допустимых множеств значений, которые могут принимать атрибуты (доменов), определение типов соответствующих данных и их характеристик. 6. Определение первичных и внешних ключей. 7. Определение функциональных зависимостей (исходя из возможных значения полей каждой таблицы) и приведение полученной концептуальной модели к третьей нормальной форме. В результате решения вышеуказанных задач была разработана схема (рисунок 1.1) и создана база данных, хранящая данные о совершенных телефонных звонках. Она включает следующие таблицы. 5 Рисунок 1.1 –– Схема данных 1. Таблица depts. В таблице хранятся данные о подразделениях организации: номер, название подразделения, закрепленный номер телефона, номер помещения. MariaDB [smdr]> desc depts; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | sta | int(11) | NO | | 0 | | | caption | varchar(128) | YES | | NULL | | | room | varchar(5) | YES | | NULL | | | NO | MUL | 0 | | | building_id | int(11) +-------------+--------------+------+-----+---------+-------+ Поле building_id является внешним ключом, связывается с полем id таблицы buildings. 2. Таблица buildings. В таблице хранятся данные об адресах подразделений организации: номер корпуса, название корпуса, почтовый адрес. MariaDB [smdr]> desc buildings; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | caption | varchar(50) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 6 3. Таблица calltype. В таблице хранятся данные о возможных типах совершаемых телефонных звонков: аббревиатура, описание. MariaDB [smdr]> desc calltype; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | letter | char(1) | NO | PRI | I | | | | | | caption | varchar(18) | YES | NULL +---------+-------------+------+-----+---------+-------+ 4. Таблица calls. В таблице хранятся данные о совершенных звонках: номер телефона и номер линии вызывающего абонента, дата, время окончания и длительность вызова, исходящий номер абонента. MariaDB [smdr]> desc calls; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | sta | int(11) | YES | | NULL | | | co | int(11) | YES | | NULL | | | clong | time | YES | | NULL | | | ctime | time | YES | | NULL | | | cdate | date | YES | | NULL | | | NO | MUL | I | | | letter_id | char(1) | onum | varchar(25) | NO | | NULL | | | dept_id | int(11) | MUL | NULL | | | YES +-----------+-------------+------+-----+---------+-------+ Поле letter_id является внешним ключом, связывается с полем letter таблицы calltype. Поле dept_id является внешним ключом, связывается с полем id таблицы depts. Полный код операторов SQL, необходимых для создания базы данных, приведен в приложении А. 7 1.3 Краткая характеристика используемой СУБД СУБД MariaDB. MariaDB –– ответвление от системы управления базами данных MySQL, разрабатываемое сообществом под лицензией GNU GPL. Разработку и поддержку MariaDB осуществляет компания MariaDB Corporation Ab и фонд MariaDB Foundation [10]. В дополнении к стандартным механизмам хранения данных, –– MyISAM, Blackhole, CSV, Memory, и Archive, РСУБД MariaDB содержит следующие способы хранения данных [11]: – Aria. – XtraDB (прозрачная замена InnoDB). – PBXT (Доступно в MariaDB 5.1, 5.2 и 5.3. Не поддерживается с версии 5.5). – FederatedX (прозрачная замена Federated). – OQGRAPH — с версии 5.2. – SphinxSE — с версии 5.2. – IBMDB2I. Компания Oracle убрала поддержку этого механизма хранения данных, начиная с версии MySQL 5.1.55, но исходный код сохранен в MariaDB до версии 5.5. – TokuDB. – Cassandra (MariaDB 10.0). – CONNECT (MariaDB 10.0). – SEQUENCE (MariaDB 10.0). – Spider (MariaDB 10.0). Улучшена безопасная и быстрая репликация: групповое завершение(commit) записи для лога транзакций (binary log). Данное новшество позволяет получить двухкратный прирост производительности для инсталляций, использующих репликацию. Улучшена подсистема асинхронного ввода/вывода для механизма хранения данных InnoDB в операционных системах семейства Windows. Индексы для механизма хранения данных MEMORY (HEAP) теперь еще быстрее. Тесты производительности подтверждают 24% рост производительности на операциях вставки (INSERT) данных для целочисленных (integer) индексов, а так же 60% рост производительности для индексов с использованием символьных (CHAR) типов данных. Улучшения в работе CHECKSUM TABLE. Улучшена производительность перекодировки символов (и удалили перекодировку в случаях, когда она на самом деле не нужна). Общий выигрыш производительности достигает 1–5% (по данным mysqlbench), однако, на больших объемах данных выигрыш может быть более существенным для символов, находящихся в промежутке 0x00–0x7f. Пул потоков в MariaDB 5.1 и еще более оптимизированный вариант в MariaDB 5.5. Пул потоков позволяет эффективно использовать MariaDB в задачах с большим числом активных соединений (более 200000) без снижения производительности. Оптимизация отладочного кода MariaDB. Собранная с поддержкой отладочной информации версия может работать быстро, даже если этот функционал не используется. Использование механизма хранения данных Aria (ранее Maria) позволяет выполнять комплексные запросы без использования временных таблиц, создаваемых на устройствах хранения 8 (HDD/SSD/SAS/FC) за счет агрессивных методов кеширования в оперативной памяти. По умолчанию этот механизм хранения включен в состав MariaDB начиная с версии 5.1 и является производительным аналогом MyISAM. Улучшено тестирование. Набор тестов значительно переработан и расширен, а время выполнения уменьшено. Больше тестов в тестовых сериях. Ошибки в исходном коде устраняются при тестировании. Убраны некоторые серии тестов (например, нет необходимости тестировать некий функционал, если этот функционал нигде не используется в тестируемой версии). Весь исходный код MariaDB распространяется под лицензиями GPL, LPGL или BSD. MariaDB не содержит закрытых модулей или компонентов, на подобие тех, что содержатся в Mysql Enterprise Edition. Однако, это не влияет на доступный функционал MariaDB. Все технологии, существующие в закрытой версии MySQL 5.5 Enterprise Edition, в полном объеме представлены и в MariaDB. MariaDB включает тестовые пакеты для всех исправленных ошибок в исходном коде. Компания Oracle в свою очередь не представляет подобных тестовых пакетов для для своих версий продуктов, например, MySQL 5.5. Все планы развития доступны всем желающим. MariaDB разрабатывается open source сообществом. MySQL Workbench. Приложение MySQL Workbench –– это унифицированный инструмент визуального моделирования для разработчиков и администраторов баз данных. Оно обеспечивает полный набор средств для моделирование данных, написания запросов на языке SQL, конфигурирования баз данных, администрирования серверов баз данных и пользователей, резервного копирования и многого другого. Версии приложения MySQL Workbench доступны для операционных систем Microsoft Windows, Linux и MacOS X [20]. С помощью приложения MySQL Workbench разработчик баз данных может визуально разрабатывать сложных ER-модели, создавать базы данных и управлять ими. Приложение MySQL Workbench предоставляет ключевые возможности для выполнения сложных задач управления изменениями и документирования, которые обычно требуют значительного времени и усилий. В состав приложения MySQL Workbench включены инструменты для визуального создания, выполнения и оптимизации запросов SQL. Редактор SQL обеспечивает цветовую подсветку синтаксиса, автоматическое заполнение, повторное использование фрагментов и историю выполнения SQL-запросов. Обозреватель объектов обеспечивает быстрый доступ к схемам баз данных и объектов. Визуальные средства для управления средой MySQL, включенные в приложение MySQL Workbench, могут использоваться разработчиками и администраторами баз данных для настройки сервера баз данных, администрирования пользователей, выполнения операций резервного копирования и восстановления, проверки данных аудита и просмотра журнала производительности. Приложение MySQL Workbench имеет набор средств для повышения производительности приложений на основе MySQL. Администратор может быстро просмотреть ключевые показатели эффективности с помощью специальной панели индикаторов. Отчеты о производительности обеспечивают простую идентификацию и доступ к входным и выходным хотспотам. 9 2 Клиентская часть информационной системы 2.1 Проектирование клиентской части информационной системы Приложение для просмотра статистики телефонных вызовов SMDR Viewer (клиентская часть информационной системы) разрабатывалось с учетом следующих основных требований: – установка и развертывание приложения должны быть максимально просты; – графический интерфейс должен быть интуитивно понятен даже для пользователя, владеющего только первоначальными навыками работы в среде ОС Microsoft Windows. Концептуально в составе приложения SMDR Viewer можно выделить следующие модули. 1. Главная форма (рисунок 2.1). Служит для отображения информации в процессе работы приложения. Содержит инструменты (меню и панель инструментов) для управления приложением. Рисунок 2.1 –– Главная форма 2. Модуль подключения к базе данных (рисунок 2.2). Здесь определяются параметры соединения (хост, порт) и проводится аутентификация пользователя (запрашиваются имя пользователя и пароль). Рисунок 2.2 –– Форма модуля подключения к базе данных 10 3. Модуль отображения таблиц базы данных (рисунок 2.3). Здесь происходит обращение к базе данных посредством специально сформированного запроса SQL. Пользователь может выбрать нужную таблицу в сформированном списке для последующего отображения ее содержимого на главной форме. Рисунок 2.3 –– Форма модуля выбора таблицы для отображения 4. Модуль фильтрации данных (рисунок 2.4). Этот модуль позволяет задать критерии отбора показываемых на главной форме данных. Рисунок 2.4 –– Форма модуля задания критериев отбора данных Все модули связываются между собой посредством драйвера СУБД, написанного с использованием инструмента MariaDB Connector/C, который посредством специальных функций предоставляет доступ к серверу баз данных. 11 2.2 Краткая характеристика используемых инструментов разработки В процессе создания приложения SMDR Viewer были использованы следующие инструменты. IDE Code::Blocks 16.01. Интегрированная среда разработки Code::Blocks –– свободная кроссплатформенная среда разработки. Code::Blocks написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей. Поддерживает языки программирования С, С++, D (с ограничениями), Fortran [12]. Среда разрабатывается для Windows, Linux и Mac OS X. Ее можно собрать из исходников практически под любую Unix-подобную систему, например FreeBSD. Среда Code::Blocks поддерживает многие компиляторы (MinGW/GCC, Intel C++ compiler, Clang и другие), многопрофильные проекты, рабочие пространста, импорт проектов Dev-C++, импорт проектов и рабочих пространств Microsoft Visual Studio. Интерфейс среды поддерживает подсветку синтаксиса, сворачивание блоков кода, автодополнение кода, браузер классов, скриптовый движок Squirrel, планировщик для нескольких пользователей, плагины Devpack (установочные пакеты для Dev-C++), плагин wxSmith (инструмент быстрой разработки приложений (RAD) для wxWidgets), систему проверки правописания (только для комментариев), автоформатирование кода AStyle, настраиваемый Code Style, утилиту для разработки регулярных выражений (использует wxWidgets regexp parser, синтаксис pcre), переименования в файлах проекта (базовая поддержка Refactor->Rename для произвольного идентификатора), DoxyBlocks (плагин для извлечения документации в формате DoxyGen, синтаксис комментариев поддерживается), поиск по проекту с подсветкой найденных совпадений. Также имеются возможности по работе с регулярными выраженими, поиск места декларации или реализации идентификатора (функции, макроса, класса и т. д.) включая подключенные заголовки из внешних библиотек, запуск полученной программы с аргументами (включая аргументы для терминала). wxWidgets 3.0.2. Библиотека инструментов wxWidgets 3.0.2 –– библиотека открытым ис- ходным кодом для разработки кроссплатформенных приложений на уровне исходного кода. Основным применением wxWidgets является построение графического интерфейса пользователя (GUI), однако библиотека включает большое количество других функций и используется для создания весьма разнообразного ПО. wxWidgets выпущена под лицензией, базирующейся на LGPL [13]. Важной особенностью wxWidgets в отличие от некоторых других библиотек (Swing, Qt и др.) является то, что она максимально использует «родные» графические элементы интерфейса операционной системы всюду, где это возможно. Это существенное преимущество для многих пользователей, поскольку они привыкают работать в конкретной среде, и изменения интерфейса программ часто вызывают затруднения в их работе. Также wxWidgets обладает всеми преимуществами, присущими бесплатной свободной платформе: – нулевая стоимость позволяет легко использовать её небогатым малым фирмам и индивидуальным разработчикам и экономить бюджет крупным организациям; 12 – открытый исходный код обеспечивает чрезвычайно долгий срок жизни проекта даже при отходе от него первоначальных создателей, что позволяет гарантировать долгосрочное развитие и всех производных проектов; – открытый код позволяет свободно производить его аудит (что важно для приложений, использующихся в критических сферах) и при необходимости самостоятельно модифицировать с добавлением нужных функций, не полагаясь на добрую волю исходного разработчика. Этот момент особенно важен для внутрикорпоративного применения. Лицензия wxWidgets допускает линковку с несвободными фрагментами кода, что позволяет использовать её и в закрытых коммерческих проектах. MariaDB Connector/C. Данный API поддерживает большой набор функций, которые обеспечивают доступ к СУБД MariaDB из приложений пользователя, независимо от того, запущена ли она в локальной или на удаленной системе. 13 2.3 Программирование клиентской части информационной системы На рисунке 2.5 показаны дерево проекта приложения SMDR Viewer и дерево виджетов. Рисунок 2.5 –– Структура файлов и виджетов проекта SMDR Viewer Большой объем кода приложения не позволяет привести его целиком в рамках данной работы. Поэтому для примера программирования с использованием библиотеки wxWidgets рассмотрим код запуска главной формы приложения SMDR Viewer. Каждое приложение, использующее библиотеку wxWidgets, определяет свой собственный класс-приложение –– разновидность класса wxApp, представляющего собой некоторое обобщенное приложение. В нашем случае класс-приложение называется wx_testApp. Его код представлен в листинге 2.1. 14 Листинг 2.1 –– Файл wx_testApp.h 1 #ifndef WX_TESTAPP_H 2 #define WX_TESTAPP_H 3 4 #include <wx/app.h> 5 6 class wx_testApp : public wxApp 7 { public: 8 virtual bool OnInit(); 9 10 }; 11 12 #endif // WX_TESTAPP_H В программе существует единственный экземпляр этого нового класса –– само запущенное приложение. Класс-приложение объявляет, по крайней мере, одну функцию –– OnInit(), которая вызывается, когда библиотека wxWidgets готова запустить код. Функция OnInit() создает экземпляр формы и отображает форму на экране. Реализация данной функции представлена в в листинге 2.2. Листинг 2.2 –– Файл wx_testApp.cpp 1 #include ”wx_testApp.h” 2 3 //(*AppHeaders 4 #include ”wx_testMain.h” 5 #include <wx/xrc/xmlres.h> 6 #include <wx/image.h> 7 //*) 8 9 IMPLEMENT_APP(wx_testApp) 10 11 bool wx_testApp::OnInit() 12 { 13 //(*AppInitialize 14 bool wxsOK = true; 15 wxInitAllImageHandlers(); 16 wxXmlResource::Get()−>InitAllHandlers(); 17 wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgTables.xrc”)); 18 wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgFilter.xrc”)); 19 if ( wxsOK ) 20 { 21 wx_testFrame* Frame = new wx_testFrame(0); 22 Frame−>Show(); 15 SetTopWindow(Frame); 23 24 } 25 //*) 26 return wxsOK; 27 28 } В файле wx_testApp.cpp производится подключение заголовка wx_testMain.h (см. листинг 2.2). Заголовок содержит объявления класса главной формы приложения, идентификаторов элементов интерфейса и callback-функций для обработки событий главной формы (листинг 2.3). Листинг 2.3 –– Файл wx_testMain.h 1 #ifndef WX_TESTMAIN_H 2 #define WX_TESTMAIN_H 3 4 5 6 //(*Headers(wx_testFrame) 7 #include <wx/menu.h> 8 #include <wx/toolbar.h> 9 #include <wx/frame.h> 10 #include <wx/statusbr.h> 11 //*) 12 13 class wx_testFrame: public wxFrame 14 { 15 public: 16 17 wx_testFrame(wxWindow* parent,wxWindowID id = −1); 18 virtual ~wx_testFrame(); 19 20 // private: 21 22 23 //(*Handlers(wx_testFrame) 24 void OnQuit(wxCommandEvent& event); 25 void OnAbout(wxCommandEvent& event); 26 void OnbtnInfoClick(wxCommandEvent& event); 27 void OnMenuConnectSelected(wxCommandEvent& event); 28 void OnToolBarConnectClicked(wxCommandEvent& event); 29 void OnShowTextOnToolBarButtonsSelected(wxCommandEvent& event); 30 void OnClose(wxCloseEvent& event); 31 void OnToolBarViewTableClicked(wxCommandEvent& event); 32 void OnMenuTableFilterSelected(wxCommandEvent& event); 16 33 void OnToolBarTableFilterClicked(wxCommandEvent& event); 34 void OnMenuViewTableSelected(wxCommandEvent& event); 35 void OnMenuStatisticsSelected(wxCommandEvent& event); 36 //*) 37 38 //(*Identifiers(wx_testFrame) 39 static const long idMenuConnect; 40 static const long idMenuQuit; 41 static const long idViewTable; 42 static const long idMenuTableFilter; 43 static const long idMenuStatistics; 44 static const long idMenuHelpOn; 45 static const long idMenuAbout; 46 static const long ID_STATUSBAR1; 47 static const long ID_TOOLBAR_CONNECT; 48 static const long idToolBarViewTable; 49 static const long idToolBarTableFilter; 50 static const long idToolBarStat; 51 static const long ID_TOOLBAR1; 52 //*) 53 54 //(*Declarations(wx_testFrame) 55 wxMenuItem* MenuConnect; 56 wxMenuItem* MenuTableFilter; 57 wxToolBarToolBase* ToolBarTableFilter; 58 wxMenuItem* MenuStatistics; 59 wxToolBar* ToolBar1; 60 wxMenu* Menu3; 61 wxMenuItem* MenuViewTable; 62 wxToolBarToolBase* ToolBarStat; 63 wxMenuItem* MenuItem3; 64 wxToolBarToolBase* ToolBarViewTable; 65 wxStatusBar* StatusBar1; 66 wxToolBarToolBase* ToolBarConnect; 67 wxMenu* Menu4; 68 //*) 69 DECLARE_EVENT_TABLE() 70 71 }; 72 73 #endif // WX_TESTMAIN_H Реализация этих функций находится в файле wx_testMain.cpp (листинг 2.4). 17 Листинг 2.4 –– Файл wx_testMain.cpp 1 #include ”wx_testMain.h” 2 #include <wx/msgdlg.h> 3 #include <wx/aboutdlg.h> 4 5 6 7 #include ”version.h” 8 #include ”dlgConnect.h” 9 #include ”dlgTables.h” 10 #include ”dlgFilter.h” 11 #include ”dlgStat.h” 12 13 //(*InternalHeaders(wx_testFrame) 14 #include <wx/artprov.h> 15 #include <wx/bitmap.h> 16 #include <wx/icon.h> 17 #include <wx/intl.h> 18 #include <wx/image.h> 19 #include <wx/string.h> 20 //*) 21 22 23 24 25 //const wxString MY_APP_VERSION_STRING = wxT(”0.1 Alpha”); 26 27 //helper functions 28 enum wxbuildinfoformat { short_f , long_f }; 29 30 31 wxString wxbuildinfo(wxbuildinfoformat format) 32 { 33 wxString wxbuild(wxVERSION_STRING); 34 35 if (format == long_f ) 36 { 37 #if defined(__WXMSW__) wxbuild << _T(”−Windows”); 38 39 #elif defined(__UNIX__) wxbuild << _T(”−Linux”); 40 41 #endif 18 42 43 #if wxUSE_UNICODE wxbuild << _T(”−Unicode build”); 44 45 #else wxbuild << _T(”−ANSI build”); 46 47 #endif // wxUSE_UNICODE } 48 49 return wxbuild; 50 51 } 52 53 //(*IdInit(wx_testFrame) 54 const long wx_testFrame::idMenuConnect = wxNewId(); 55 const long wx_testFrame::idMenuQuit = wxNewId(); 56 const long wx_testFrame::idViewTable = wxNewId(); 57 const long wx_testFrame::idMenuTableFilter = wxNewId(); 58 const long wx_testFrame::idMenuStatistics = wxNewId(); 59 const long wx_testFrame::idMenuHelpOn = wxNewId(); 60 const long wx_testFrame::idMenuAbout = wxNewId(); 61 const long wx_testFrame::ID_STATUSBAR1 = wxNewId(); 62 const long wx_testFrame::ID_TOOLBAR_CONNECT = wxNewId(); 63 const long wx_testFrame::idToolBarViewTable = wxNewId(); 64 const long wx_testFrame::idToolBarTableFilter = wxNewId(); 65 const long wx_testFrame::idToolBarStat = wxNewId(); 66 const long wx_testFrame::ID_TOOLBAR1 = wxNewId(); 67 //*) 68 69 BEGIN_EVENT_TABLE(wx_testFrame ,wxFrame) 70 //(*EventTable(wx_testFrame) 71 //*) 72 END_EVENT_TABLE() 73 74 wx_testFrame::wx_testFrame(wxWindow* parent ,wxWindowID id) 75 { 76 //(*Initialize(wx_testFrame) 77 wxMenuItem* MenuItem2; 78 wxMenu* Menu1; 79 wxMenuBar* MenuBar1; 80 wxMenu* Menu2; 81 wxMenuItem* MenuQuit; 82 83 Create(parent , id, _(”SMDR Viewer”), wxDefaultPosition , wxDefaultSize , wxDEFAULT_FRAME_STYLE , _T(”id”)); 19 84 SetClientSize(wxSize(800,600)); 85 SetMinSize(wxSize(320,240)); 86 { 87 wxIcon FrameIcon; 88 FrameIcon.CopyFromBitmap(wxArtProvider::GetBitmap( wxART_MAKE_ART_ID_FROM_STR(_T(”wxART_EXECUTABLE_FILE”)),wxART_FRAME_ICON) ); SetIcon(FrameIcon); 89 90 } 91 MenuBar1 = new wxMenuBar(); 92 Menu1 = new wxMenu(); 93 MenuConnect = new wxMenuItem(Menu1, idMenuConnect , _(”Connect...\tCtrl−N ”), _(”New connection to database”), wxITEM_NORMAL); 94 MenuConnect−>SetBitmap(wxBitmap(wxImage(_T(”rc\\connect.png”)))); 95 Menu1−>Append(MenuConnect); 96 Menu1−>AppendSeparator(); 97 MenuQuit = new wxMenuItem(Menu1, idMenuQuit , _(”Quit\tAlt−F4”), _(”Quit the application”), wxITEM_NORMAL); 98 MenuQuit−>SetBitmap(wxBitmap(wxImage(_T(”rc\\quit.png”)))); 99 Menu1−>Append(MenuQuit); 100 MenuBar1−>Append(Menu1, _(”&File”)); 101 Menu3 = new wxMenu(); 102 MenuViewTable = new wxMenuItem(Menu3, idViewTable , _(”View Table\tCtrl+Q ”), _(”View data on selected table”), wxITEM_NORMAL); 103 MenuViewTable−>SetBitmap(wxBitmap(wxImage(_T(”rc\\tables.png”)))); 104 Menu3−>Append(MenuViewTable); 105 MenuViewTable−>Enable(false); 106 MenuTableFilter = new wxMenuItem(Menu3, idMenuTableFilter , _(”Table Filter...\tCtrl+F”), _(”Find data in the selected table”), wxITEM_NORMAL) ; 107 MenuTableFilter−>SetBitmap(wxBitmap(wxImage(_T(”rc\\filter.png”)))); 108 Menu3−>Append(MenuTableFilter); 109 MenuTableFilter−>Enable(false); 110 MenuStatistics = new wxMenuItem(Menu3, idMenuStatistics , _(”Statistics ...\tCtrl+T”), wxEmptyString , wxITEM_NORMAL); 111 MenuStatistics−>SetBitmap(wxBitmap(wxImage(_T(”rc\\stat.png”)))); 112 Menu3−>Append(MenuStatistics); 113 MenuBar1−>Append(Menu3, _(”&Tables”)); 114 Menu4 = new wxMenu(); 115 MenuBar1−>Append(Menu4, _(”&Settings”)); 116 Menu2 = new wxMenu(); 117 MenuItem3 = new wxMenuItem(Menu2, idMenuHelpOn , _(”Help on SMDR Viewer\ tF1”), _(”Show help for this application”), wxITEM_NORMAL); 20 118 Menu2−>Append(MenuItem3); 119 Menu2−>AppendSeparator(); 120 MenuItem2 = new wxMenuItem(Menu2, idMenuAbout , _(”About...”), _(”Show info about this application”), wxITEM_NORMAL); 121 MenuItem2−>SetBitmap(wxBitmap(wxImage(_T(”rc\\about.png”)))); 122 Menu2−>Append(MenuItem2); 123 MenuBar1−>Append(Menu2, _(”&Help”)); 124 SetMenuBar(MenuBar1); 125 StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1 , 0, _T(”ID_STATUSBAR1”) ); 126 int __wxStatusBarWidths_1[1] = { −1 }; 127 int __wxStatusBarStyles_1[1] = { wxSB_NORMAL }; 128 StatusBar1−>SetFieldsCount(1,__wxStatusBarWidths_1); 129 StatusBar1−>SetStatusStyles(1,__wxStatusBarStyles_1); 130 SetStatusBar(StatusBar1); 131 ToolBar1 = new wxToolBar(this, ID_TOOLBAR1 , wxDefaultPosition , wxDefaultSize , wxTB_HORIZONTAL|wxTB_3DBUTTONS|wxTB_TEXT|wxSIMPLE_BORDER , _T(”ID_TOOLBAR1”)); 132 ToolBar1−>SetToolBitmapSize(wxSize(22,22)); 133 ToolBarConnect = ToolBar1−>AddTool(ID_TOOLBAR_CONNECT , _(”Connect”), wxBitmap(wxImage(_T(”rc\\connect.png”))), wxNullBitmap , wxITEM_NORMAL , _( ”Connect to database”), _(”Connect to database”)); 134 ToolBar1−>AddSeparator(); 135 ToolBarViewTable = ToolBar1−>AddTool(idToolBarViewTable , _(”View Table”) , wxBitmap(wxImage(_T(”rc\\tables.png”))), wxNullBitmap , wxITEM_NORMAL , _ (”View List of Tables”), _(”View Table”)); 136 ToolBarTableFilter = ToolBar1−>AddTool(idToolBarTableFilter , _(”Table Filter”), wxBitmap(wxImage(_T(”rc\\filter.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Table Filter”), _(”Table Filter”)); 137 ToolBarStat = ToolBar1−>AddTool(idToolBarStat , _(”Statistics”), wxBitmap (wxImage(_T(”rc\\stat.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Show Stat Data”), _(”Show Stat Data”)); 138 ToolBar1−>Realize(); 139 SetToolBar(ToolBar1); 140 Center(); 141 142 Connect(idMenuConnect ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction )&wx_testFrame::OnMenuConnectSelected); 143 Connect(idMenuQuit ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& wx_testFrame::OnQuit); 144 Connect(idViewTable ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& wx_testFrame::OnMenuViewTableSelected); 21 Connect(idMenuTableFilter ,wxEVT_COMMAND_MENU_SELECTED ,( 145 wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected); Connect(idMenuStatistics ,wxEVT_COMMAND_MENU_SELECTED ,( 146 wxObjectEventFunction)&wx_testFrame::OnMenuStatisticsSelected); Connect(idMenuAbout ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& 147 wx_testFrame::OnAbout); Connect(ID_TOOLBAR_CONNECT ,wxEVT_COMMAND_TOOL_CLICKED ,( 148 wxObjectEventFunction)&wx_testFrame::OnMenuConnectSelected); Connect(idToolBarViewTable ,wxEVT_COMMAND_TOOL_CLICKED ,( 149 wxObjectEventFunction)&wx_testFrame::OnMenuViewTableSelected); Connect(idToolBarTableFilter ,wxEVT_COMMAND_TOOL_CLICKED ,( 150 wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected); Connect(idToolBarStat ,wxEVT_COMMAND_TOOL_CLICKED ,(wxObjectEventFunction) 151 &wx_testFrame::OnMenuStatisticsSelected); Connect(wxID_ANY ,wxEVT_CLOSE_WINDOW ,(wxObjectEventFunction)&wx_testFrame 152 ::OnClose); 153 //*) 154 MariaDBDriver::Get_inst()−>m_pGrid = new wxGrid(this, wxID_ANY); 155 ToolBarViewTable−>Enable(false); 156 ToolBarTableFilter−>Enable(false); 157 ToolBarStat−>Enable(false); 158 ToolBar1−>Realize(); 159 MariaDBDriver::Get_inst()−>_frame = this; 160 } 161 162 wx_testFrame::~wx_testFrame() 163 { 164 //(*Destroy(wx_testFrame) 165 //*) 166 } 167 168 void wx_testFrame::OnAbout(wxCommandEvent& event) 169 { 170 wxAboutDialogInfo info; 171 wxString desc, version; 172 173 info.SetName(wxT(”Station Messaging Detail Report Viewer (SMDR Viewer)”) ); 174 175 version << AutoVersion::AV_MAJOR << ”.” 176 << AutoVersion::AV_MINOR << ”−” 177 << AutoVersion::AV_STATUS 178 << ”, build ” << AutoVersion::AV_BUILD << ”\n” 22 << wxbuildinfo(long_f); 179 180 info.SetVersion(version); 181 182 info.SetCopyright(wxT(”(C) 2016 С. М. Станкевич <okioup@vsu.by>”)); 183 184 desc << L”\Программаn создана в рамках курсовой работы\n” 185 << L”ИНФОРМАЦИОННАЯ\” СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ ТЕЛЕФОННЫХ 186 СОЕДИНЕНИЙ\”\n” << L”по дисциплине Средства\” визуального программирования 187 приложений\”\n\n” 188 << L”Выполнил: Станкевич Сергей Михайлович,\n” 189 << L”пециальностьc 1−40 01 73 Программное« обеспечение информационных систем», ” 190 << L”группа Пм−21\n\n” 191 << L”Руководитель: ст. преп. кафедры прикладного и системного программирования С. В. Сергеенко”; info.SetDescription(desc); 192 193 wxAboutBox(info); 194 195 } 196 197 void wx_testFrame::OnQuit(wxCommandEvent& event) { this−>Close(); 198 199 } 200 201 void wx_testFrame::OnClose(wxCloseEvent& event) { 202 event.Skip(wxID_YES == wxMessageDialog(NULL, 203 wxT(”Quit? Really?”), 204 wxT(”SMDR Viewer”), 205 wxCENTER | wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT). ShowModal()); 206 } 207 208 void wx_testFrame::OnMenuConnectSelected(wxCommandEvent& event) { 209 dlgConnect dlgConn1(nullptr); 210 dlgConn1.ShowModal(); 211 } 212 213 void wx_testFrame::OnMenuTableFilterSelected(wxCommandEvent& event){ 214 dlgFilter dlgFilter1(nullptr); 215 dlgFilter1.ShowModal(); 216 } 23 217 218 void wx_testFrame::OnMenuViewTableSelected(wxCommandEvent& event) { 219 dlgTables dlgTabs1(nullptr); 220 dlgTabs1.ShowModal(); 221 } 222 223 void wx_testFrame::OnMenuStatisticsSelected(wxCommandEvent& event) { 224 dlgStat dlgStat1(nullptr); 225 dlgStat1.ShowModal(); 226 } 24 3 3.1 Работа с информационной системой Установка и настройка серверной части Установка сервера MariaDB и настройка его начальной конфигурации в среде операционной системы Microsoft Windows описана во многих источниках, например здесь: https://mariadb.com/kb/en/mariadb/installing-mariadb-msi-packages-on-windows/. 25 3.2 Установка и настройка клиентской части Установка клиентской части информационной системы заключается в копировании в один каталог исполняемого файла приложения SMDR Viewer и необходимых для его работы библиотек (рисунок 3.1). Набор библиотек зависит от используемых в приложении инструментов, средств и компонентов библиотеки wxWidgets. Рисунок 3.1 –– Каталог с готовым к запуску приложением В частности, в нашем случае, для работы приложения потребовались следующие файлы: – wx_test.exe –– исполняемый файл; – dlgTables.xrc и dlgFilter.xrc –– файлы описания ресурсов, основанные на XML (располагаются в каталоге проекта); – wxmsw30u_gcc_custom.dll –– динамически подключаемая библиотека wxWidgets (располагается в каталоге .\gcc_dll\ каталога установки wxWidgets); – libmysql.dll –– динамически подключаемая библиотека (располагается в каталоге .\lib\ каталога установки СУБД MariaDB); – в каталоге .\rc\ находятся пиктограммы, отображаемые в меню и на кнопках панели инструментов приложения. 26 3.3 Использование информационной системы Соединение с сервером баз данных. При запуске приложения SMDR Viewer открывается пустое окно с элементами управления. На рисунке 3.2 показан вид окна с информацией о приложении (вызывается через меню Help⇒About…). Рисунок 3.2 –– Окно приложения с информацией о программе После нажатия кнопки Connect или выбора соответствующего пункта меню появляется диалог настройки соединения с сервером баз данных (рисунок 3.3). В нем нужно указать параметры соединения и нажать кнопку Connect!: Рисунок 3.3 –– Настройка соединения с сервером баз данных 27 Рисунок 3.4 –– Информация о результатах соединения с сервером баз данных Об успехе или неудаче соединения подскажет соответствующее информационное окно (рисунок 3.4). Если соединени с сервером успешно, выпадающий список Database заполнится списком баз данных, у которых для пользователя имеются соответствущие привилегии. После выбора требуемой базы данных с помощю кнопки Close диалог закрывается. Отображение таблиц базы данных. Для отображения таблиц на панели инструментов нужно нажать кнопку View Table. В открывшемся окне (рисунок 3.5) выбрать нужную таблицу и нажать кнопку OK. Результат отобразится в главном окне приложения. Рисунок 3.5 –– Окно выбора таблицы базы данных 28 Рисунок 3.6 –– Окно задания условия фильтрации данных Использование фильтра. Для фильтрации таблиц на панели инструментов нужно нажать кнопку Filter. В открывшемся окне (рисунок 3.6) указать требуемое условие и нажать кнопку OK. Результат фильтрации отобразится в главном окне приложения. На приведенном выше рисунке 3.6 показан результат фильтрации по условию –– отображаются только те записи, длительность разговора которых превышает три минуты. 29 Заключение Основные результаты работы заключаются в следующем. 1. Спроектирована база данных, содержащая информацию о телефонных соединениях. 2. Спроектирована клиентская часть информационной системы (приложение для работы с базой данных). 3. Выбраны средства разработки и сторонние компоненты (среды разработки, библиотеки, сервера баз данных) для реализации информационной системы. 4. Дано описание процесса установки, настойки и использования разработанной информационной системы. Правильность и корректность работы созданной информационной системы подтверждается результатами проведённых тестовых прогонов. Результаты данной работы помогут в разработке новой версии автоматизированной информационно-аналитической системы «Электронный университет» учреждения образования «Витебский государственный университет имени П. М. Машерова». 30 Список использованных источников 1. Информационные технологии. Система стандартов по базам данных. Эталонная модель управления данными: ГОСТ 34.321–96. –– Введ. 01.04.2002. –– Минск: Госстандарт, 2001. – 28 с. 2. Липпман, С. Язык программирования С++. Базовый курс : Пер. с англ. / С. Липпман, Ж. Лажойе, Б. Му. –– 5-е изд. –– М.: ООО «И. Д. Вильямс», 2014. –– 1120 с. 3. Прата, С. Язык программирования С++: лекции и упражнения: учебник: Пер. с англ. / С. Прата. –– Москва [и др.]: ДиаСофт, 2005. –– 1104 с. 4. Дейт, К. Дж. Введение в системы баз данных. Восьмое издание : Пер. с англ. / К. Дж. Дейт. –– М.: ООО «И. Д. Вильямс», 2008. –– 1328 с. 5. Коннолли, Т. Базы данных. Проектирование, реализация и сопровождение. Теория и практика / Т. Коннолли, К. Бегг. –– 3-е изд. –– ООО «И. Д. Вильямс», 2003. –– 1436 с. 6. Джексон, Г. Проектирование реляционных баз данных для использования с микроЭВМ / Г. Джексон. –– М.: Мир, 1991. –– 252 с. 7. Швецов, В. И. Базы данных : Учебное пособие / В. И. Швецов, А. Н. Визгунов, И. Б. Мееров. –– Нижний Новгород: Изд-во ННГУ, 2004. –– 217 с. 8. Вайнберг, П. SQL. Полное руководство : Пер. с. англ. / П. Вайнберг, Дж. Грофф. –– ООО «И. Д. Вильямс», 2003. –– 960 с. 9. Нормальная форма [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/Нормальная_форма. –– Дата доступа: 12.11.2016. 10. MariaDB [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/MariaDB –– Дата доступа: 12.11.2016. 11. MariaDB в сравнении с MySQL [Электронный ресурс]. –– Режим доступа: https://mariadb.com/kb/ru/mariadb-vs-mysql-features/ –– Дата доступа: 12.11.2016. 12. Сode::Blocks [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/Code::Blocks. –– Дата доступа: 12.11.2016. 13. WxWidgets [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/WxWidgets. –– Дата доступа: 12.11.2016. 14. Руководство по wxWidgets [Электронный ресурс] / Режим доступа: http://www.sl- alex.com.ua/ru/page/wxwidgets_tutorial_00_introduction. –– Дата доступа: 12.11.2016. 15. Мир лицензий: разбираемся с GNU GPL [Электронный ресурс] –– Режим доступа: https://habrahabr.ru/post/284390/. –– Дата доступа: 12.11.2016. 16. MySQL «на стероидах» [Электронный ресурс] –– Режим доступа: http://blogerator.ru/page/mysqlna-steroidah. –– Дата доступа: 12.11.2016. 17. Smart, J. Cross-Platform GUI Programming with wxWidgets / J. Smart, K. Hock, S. Csomor. — Prentice Hall Ptr, 2005. — 744 p. 18. wxWidgets tutorial [Electronic resource] — Mode of access: http://zetcode.com/gui/wxwidgets/. — Date of access: 11.11.2016. 31 19. MariaDB Knowledgebase [Electronic resource] — Mode of access: http://kb.askmonty.org/v/mariadb. — Date of access: 14.11.2016. 20. MySQL Workbench [Electronic resource] — Mode https://www.mysql.com/products/workbench/. — Date of access: 09.11.2016. 32 of access: Приложение А Код SQL для создания базы данных smdr 1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 2 /*!40101 SET NAMES utf8 */; 3 /*!50503 SET NAMES utf8mb4 */; 4 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS , FOREIGN_KEY_CHECKS=0 */; 5 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE , SQL_MODE=’NO_AUTO_VALUE_ON_ZERO ’ */ ; 6 7 −− Дамп структуры базы данных smdr 8 DROP DATABASE IF EXISTS ‘smdr‘; 9 CREATE DATABASE IF NOT EXISTS ‘smdr‘ /*!40100 DEFAULT CHARACTER SET utf8 */; 10 USE ‘smdr ‘; 11 12 −− Дамп структуры для таблица smdr.buildings 13 DROP TABLE IF EXISTS ‘buildings ‘; 14 CREATE TABLE IF NOT EXISTS ‘buildings ‘ ( 15 ‘id‘ int(11) NOT NULL DEFAULT ’0’, 16 ‘caption ‘ varchar(50) DEFAULT NULL, 17 ‘address ‘ varchar(50) DEFAULT NULL, 18 PRIMARY KEY (‘id‘) 19 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Адреса корпусов’; 20 21 −− Дамп структуры для таблица smdr.calls 22 DROP TABLE IF EXISTS ‘calls ‘; 23 CREATE TABLE IF NOT EXISTS ‘calls‘ ( 24 ‘id‘ int(11) NOT NULL DEFAULT ’0’, 25 ‘sta‘ int(11) DEFAULT NULL, 26 ‘co‘ int(11) DEFAULT NULL, 27 ‘clong‘ time DEFAULT NULL, 28 ‘ctime‘ time DEFAULT NULL, 29 ‘cdate‘ date DEFAULT NULL, 30 ‘letter_id ‘ char(1) NOT NULL DEFAULT ’I’, 31 ‘onum‘ varchar(25) NOT NULL, 32 ‘dept_id ‘ int(11) DEFAULT NULL, 33 PRIMARY KEY (‘id‘), 34 KEY ‘FK_calls_calltype ‘ (‘letter_id ‘), 33 35 KEY ‘FK_calls_depts ‘ (‘dept_id ‘), 36 CONSTRAINT ‘FK_calls_calltype ‘ FOREIGN KEY (‘letter_id ‘) REFERENCES ‘ calltype ‘ (‘LETTER ‘), 37 CONSTRAINT ‘FK_calls_depts ‘ FOREIGN KEY (‘dept_id ‘) REFERENCES ‘depts‘ (‘id‘) ON DELETE SET NULL ON UPDATE CASCADE 38 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Лог SMDR’; 39 40 −− Дамп структуры для таблица smdr.calltype 41 DROP TABLE IF EXISTS ‘calltype ‘; 42 CREATE TABLE IF NOT EXISTS ‘calltype ‘ ( 43 ‘letter‘ char(1) NOT NULL DEFAULT ’I’, 44 ‘caption ‘ varchar(18) DEFAULT NULL, 45 PRIMARY KEY (‘letter ‘) 46 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Типы вызовов’; 47 48 −− Дамп структуры для таблица smdr.depts 49 DROP TABLE IF EXISTS ‘depts ‘; 50 CREATE TABLE IF NOT EXISTS ‘depts‘ ( 51 ‘id‘ int(11) NOT NULL DEFAULT ’0’, 52 ‘sta‘ int(11) NOT NULL DEFAULT ’0’, 53 ‘caption ‘ varchar(128) DEFAULT NULL, 54 ‘room‘ varchar(5) DEFAULT NULL, 55 ‘building_id ‘ int(11) NOT NULL DEFAULT ’0’, 56 PRIMARY KEY (‘id‘), 57 KEY ‘FK_depts_buildings ‘ (‘building_id ‘), 58 CONSTRAINT ‘FK_depts_buildings ‘ FOREIGN KEY (‘building_id ‘) REFERENCES ‘ buildings ‘ (‘id‘) ON UPDATE CASCADE 59 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Кафедры’; 60 61 /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE , ’’) */; 62 /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; 63 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 34 Приложение Б Исходные коды приложения SMDR Viewer Б.1 Файл wx_testApp.h 1 #ifndef WX_TESTAPP_H 2 #define WX_TESTAPP_H 3 4 #include <wx/app.h> 5 6 class wx_testApp : public wxApp 7 { public: 8 virtual bool OnInit(); 9 10 }; 11 12 #endif // WX_TESTAPP_H Б.2 Файл wx_testApp.cpp 1 #include ”wx_testApp.h” 2 3 //(*AppHeaders 4 #include ”wx_testMain.h” 5 #include <wx/xrc/xmlres.h> 6 #include <wx/image.h> 7 //*) 8 9 IMPLEMENT_APP(wx_testApp) 10 11 bool wx_testApp::OnInit() 12 { 13 //(*AppInitialize 14 bool wxsOK = true; 15 wxInitAllImageHandlers(); 16 wxXmlResource::Get()−>InitAllHandlers(); 17 wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgTables.xrc”)); 18 wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgFilter.xrc”)); 35 19 if ( wxsOK ) 20 { 21 wx_testFrame* Frame = new wx_testFrame(0); 22 Frame−>Show(); 23 SetTopWindow(Frame); 24 } 25 //*) 26 return wxsOK; 27 28 } Б.3 Файл wx_testMain.h 1 #ifndef WX_TESTMAIN_H 2 #define WX_TESTMAIN_H 3 4 5 6 //(*Headers(wx_testFrame) 7 #include <wx/menu.h> 8 #include <wx/toolbar.h> 9 #include <wx/frame.h> 10 #include <wx/statusbr.h> 11 //*) 12 13 class wx_testFrame: public wxFrame 14 { 15 public: 16 17 wx_testFrame(wxWindow* parent,wxWindowID id = −1); 18 virtual ~wx_testFrame(); 19 20 // private: 21 22 23 //(*Handlers(wx_testFrame) 24 void OnQuit(wxCommandEvent& event); 25 void OnAbout(wxCommandEvent& event); 26 void OnbtnInfoClick(wxCommandEvent& event); 27 void OnMenuConnectSelected(wxCommandEvent& event); 28 void OnToolBarConnectClicked(wxCommandEvent& event); 29 void OnShowTextOnToolBarButtonsSelected(wxCommandEvent& event); 30 void OnClose(wxCloseEvent& event); 36 31 void OnToolBarViewTableClicked(wxCommandEvent& event); 32 void OnMenuTableFilterSelected(wxCommandEvent& event); 33 void OnToolBarTableFilterClicked(wxCommandEvent& event); 34 void OnMenuViewTableSelected(wxCommandEvent& event); 35 void OnMenuStatisticsSelected(wxCommandEvent& event); 36 //*) 37 38 //(*Identifiers(wx_testFrame) 39 static const long idMenuConnect; 40 static const long idMenuQuit; 41 static const long idViewTable; 42 static const long idMenuTableFilter; 43 static const long idMenuStatistics; 44 static const long idMenuHelpOn; 45 static const long idMenuAbout; 46 static const long ID_STATUSBAR1; 47 static const long ID_TOOLBAR_CONNECT; 48 static const long idToolBarViewTable; 49 static const long idToolBarTableFilter; 50 static const long idToolBarStat; 51 static const long ID_TOOLBAR1; 52 //*) 53 54 //(*Declarations(wx_testFrame) 55 wxMenuItem* MenuConnect; 56 wxMenuItem* MenuTableFilter; 57 wxToolBarToolBase* ToolBarTableFilter; 58 wxMenuItem* MenuStatistics; 59 wxToolBar* ToolBar1; 60 wxMenu* Menu3; 61 wxMenuItem* MenuViewTable; 62 wxToolBarToolBase* ToolBarStat; 63 wxMenuItem* MenuItem3; 64 wxToolBarToolBase* ToolBarViewTable; 65 wxStatusBar* StatusBar1; 66 wxToolBarToolBase* ToolBarConnect; 67 wxMenu* Menu4; 68 //*) 69 DECLARE_EVENT_TABLE() 70 71 }; 72 73 #endif // WX_TESTMAIN_H 37 Б.4 Файл wx_testMain.cpp 1 #include ”wx_testMain.h” 2 #include <wx/msgdlg.h> 3 #include <wx/aboutdlg.h> 4 5 6 7 #include ”version.h” 8 #include ”dlgConnect.h” 9 #include ”dlgTables.h” 10 #include ”dlgFilter.h” 11 #include ”dlgStat.h” 12 13 //(*InternalHeaders(wx_testFrame) 14 #include <wx/artprov.h> 15 #include <wx/bitmap.h> 16 #include <wx/icon.h> 17 #include <wx/intl.h> 18 #include <wx/image.h> 19 #include <wx/string.h> 20 //*) 21 22 23 24 25 //const wxString MY_APP_VERSION_STRING = wxT(”0.1 Alpha”); 26 27 //helper functions 28 enum wxbuildinfoformat { short_f , long_f }; 29 30 31 wxString wxbuildinfo(wxbuildinfoformat format) 32 { 33 wxString wxbuild(wxVERSION_STRING); 34 35 if (format == long_f ) 36 { 37 38 39 40 #if defined(__WXMSW__) wxbuild << _T(”−Windows”); #elif defined(__UNIX__) wxbuild << _T(”−Linux”); 38 41 #endif 42 43 #if wxUSE_UNICODE wxbuild << _T(”−Unicode build”); 44 45 #else wxbuild << _T(”−ANSI build”); 46 47 #endif // wxUSE_UNICODE } 48 49 return wxbuild; 50 51 } 52 53 //(*IdInit(wx_testFrame) 54 const long wx_testFrame::idMenuConnect = wxNewId(); 55 const long wx_testFrame::idMenuQuit = wxNewId(); 56 const long wx_testFrame::idViewTable = wxNewId(); 57 const long wx_testFrame::idMenuTableFilter = wxNewId(); 58 const long wx_testFrame::idMenuStatistics = wxNewId(); 59 const long wx_testFrame::idMenuHelpOn = wxNewId(); 60 const long wx_testFrame::idMenuAbout = wxNewId(); 61 const long wx_testFrame::ID_STATUSBAR1 = wxNewId(); 62 const long wx_testFrame::ID_TOOLBAR_CONNECT = wxNewId(); 63 const long wx_testFrame::idToolBarViewTable = wxNewId(); 64 const long wx_testFrame::idToolBarTableFilter = wxNewId(); 65 const long wx_testFrame::idToolBarStat = wxNewId(); 66 const long wx_testFrame::ID_TOOLBAR1 = wxNewId(); 67 //*) 68 69 BEGIN_EVENT_TABLE(wx_testFrame ,wxFrame) 70 //(*EventTable(wx_testFrame) 71 //*) 72 END_EVENT_TABLE() 73 74 wx_testFrame::wx_testFrame(wxWindow* parent ,wxWindowID id) 75 { 76 //(*Initialize(wx_testFrame) 77 wxMenuItem* MenuItem2; 78 wxMenu* Menu1; 79 wxMenuBar* MenuBar1; 80 wxMenu* Menu2; 81 wxMenuItem* MenuQuit; 82 39 Create(parent , id, _(”SMDR Viewer”), wxDefaultPosition , wxDefaultSize , 83 wxDEFAULT_FRAME_STYLE , _T(”id”)); 84 SetClientSize(wxSize(800,600)); 85 SetMinSize(wxSize(320,240)); 86 { 87 wxIcon FrameIcon; 88 FrameIcon.CopyFromBitmap(wxArtProvider::GetBitmap( wxART_MAKE_ART_ID_FROM_STR(_T(”wxART_EXECUTABLE_FILE”)),wxART_FRAME_ICON) ); SetIcon(FrameIcon); 89 90 } 91 MenuBar1 = new wxMenuBar(); 92 Menu1 = new wxMenu(); 93 MenuConnect = new wxMenuItem(Menu1, idMenuConnect , _(”Connect...\tCtrl−N ”), _(”New connection to database”), wxITEM_NORMAL); 94 MenuConnect−>SetBitmap(wxBitmap(wxImage(_T(”rc\\connect.png”)))); 95 Menu1−>Append(MenuConnect); 96 Menu1−>AppendSeparator(); 97 MenuQuit = new wxMenuItem(Menu1, idMenuQuit , _(”Quit\tAlt−F4”), _(”Quit the application”), wxITEM_NORMAL); 98 MenuQuit−>SetBitmap(wxBitmap(wxImage(_T(”rc\\quit.png”)))); 99 Menu1−>Append(MenuQuit); 100 MenuBar1−>Append(Menu1, _(”&File”)); 101 Menu3 = new wxMenu(); 102 MenuViewTable = new wxMenuItem(Menu3, idViewTable , _(”View Table\tCtrl+Q ”), _(”View data on selected table”), wxITEM_NORMAL); 103 MenuViewTable−>SetBitmap(wxBitmap(wxImage(_T(”rc\\tables.png”)))); 104 Menu3−>Append(MenuViewTable); 105 MenuViewTable−>Enable(false); 106 MenuTableFilter = new wxMenuItem(Menu3, idMenuTableFilter , _(”Table Filter...\tCtrl+F”), _(”Find data in the selected table”), wxITEM_NORMAL) ; 107 MenuTableFilter−>SetBitmap(wxBitmap(wxImage(_T(”rc\\filter.png”)))); 108 Menu3−>Append(MenuTableFilter); 109 MenuTableFilter−>Enable(false); 110 MenuStatistics = new wxMenuItem(Menu3, idMenuStatistics , _(”Statistics ...\tCtrl+T”), wxEmptyString , wxITEM_NORMAL); 111 MenuStatistics−>SetBitmap(wxBitmap(wxImage(_T(”rc\\stat.png”)))); 112 Menu3−>Append(MenuStatistics); 113 MenuBar1−>Append(Menu3, _(”&Tables”)); 114 Menu4 = new wxMenu(); 115 MenuBar1−>Append(Menu4, _(”&Settings”)); 116 Menu2 = new wxMenu(); 40 117 MenuItem3 = new wxMenuItem(Menu2, idMenuHelpOn , _(”Help on SMDR Viewer\ tF1”), _(”Show help for this application”), wxITEM_NORMAL); 118 Menu2−>Append(MenuItem3); 119 Menu2−>AppendSeparator(); 120 MenuItem2 = new wxMenuItem(Menu2, idMenuAbout , _(”About...”), _(”Show info about this application”), wxITEM_NORMAL); 121 MenuItem2−>SetBitmap(wxBitmap(wxImage(_T(”rc\\about.png”)))); 122 Menu2−>Append(MenuItem2); 123 MenuBar1−>Append(Menu2, _(”&Help”)); 124 SetMenuBar(MenuBar1); 125 StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1 , 0, _T(”ID_STATUSBAR1”) ); 126 int __wxStatusBarWidths_1[1] = { −1 }; 127 int __wxStatusBarStyles_1[1] = { wxSB_NORMAL }; 128 StatusBar1−>SetFieldsCount(1,__wxStatusBarWidths_1); 129 StatusBar1−>SetStatusStyles(1,__wxStatusBarStyles_1); 130 SetStatusBar(StatusBar1); 131 ToolBar1 = new wxToolBar(this, ID_TOOLBAR1 , wxDefaultPosition , wxDefaultSize , wxTB_HORIZONTAL|wxTB_3DBUTTONS|wxTB_TEXT|wxSIMPLE_BORDER , _T(”ID_TOOLBAR1”)); 132 ToolBar1−>SetToolBitmapSize(wxSize(22,22)); 133 ToolBarConnect = ToolBar1−>AddTool(ID_TOOLBAR_CONNECT , _(”Connect”), wxBitmap(wxImage(_T(”rc\\connect.png”))), wxNullBitmap , wxITEM_NORMAL , _( ”Connect to database”), _(”Connect to database”)); 134 ToolBar1−>AddSeparator(); 135 ToolBarViewTable = ToolBar1−>AddTool(idToolBarViewTable , _(”View Table”) , wxBitmap(wxImage(_T(”rc\\tables.png”))), wxNullBitmap , wxITEM_NORMAL , _ (”View List of Tables”), _(”View Table”)); 136 ToolBarTableFilter = ToolBar1−>AddTool(idToolBarTableFilter , _(”Table Filter”), wxBitmap(wxImage(_T(”rc\\filter.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Table Filter”), _(”Table Filter”)); 137 ToolBarStat = ToolBar1−>AddTool(idToolBarStat , _(”Statistics”), wxBitmap (wxImage(_T(”rc\\stat.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Show Stat Data”), _(”Show Stat Data”)); 138 ToolBar1−>Realize(); 139 SetToolBar(ToolBar1); 140 Center(); 141 142 Connect(idMenuConnect ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction )&wx_testFrame::OnMenuConnectSelected); 143 Connect(idMenuQuit ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& wx_testFrame::OnQuit); 41 Connect(idViewTable ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& 144 wx_testFrame::OnMenuViewTableSelected); Connect(idMenuTableFilter ,wxEVT_COMMAND_MENU_SELECTED ,( 145 wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected); Connect(idMenuStatistics ,wxEVT_COMMAND_MENU_SELECTED ,( 146 wxObjectEventFunction)&wx_testFrame::OnMenuStatisticsSelected); Connect(idMenuAbout ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)& 147 wx_testFrame::OnAbout); Connect(ID_TOOLBAR_CONNECT ,wxEVT_COMMAND_TOOL_CLICKED ,( 148 wxObjectEventFunction)&wx_testFrame::OnMenuConnectSelected); Connect(idToolBarViewTable ,wxEVT_COMMAND_TOOL_CLICKED ,( 149 wxObjectEventFunction)&wx_testFrame::OnMenuViewTableSelected); Connect(idToolBarTableFilter ,wxEVT_COMMAND_TOOL_CLICKED ,( 150 wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected); Connect(idToolBarStat ,wxEVT_COMMAND_TOOL_CLICKED ,(wxObjectEventFunction) 151 &wx_testFrame::OnMenuStatisticsSelected); Connect(wxID_ANY ,wxEVT_CLOSE_WINDOW ,(wxObjectEventFunction)&wx_testFrame 152 ::OnClose); 153 //*) 154 MariaDBDriver::Get_inst()−>m_pGrid = new wxGrid(this, wxID_ANY); 155 ToolBarViewTable−>Enable(false); 156 ToolBarTableFilter−>Enable(false); 157 ToolBarStat−>Enable(false); 158 ToolBar1−>Realize(); 159 MariaDBDriver::Get_inst()−>_frame = this; 160 } 161 162 wx_testFrame::~wx_testFrame() 163 { 164 //(*Destroy(wx_testFrame) 165 //*) 166 } 167 168 void wx_testFrame::OnAbout(wxCommandEvent& event) 169 { 170 wxAboutDialogInfo info; 171 wxString desc, version; 172 173 info.SetName(wxT(”Station Messaging Detail Report Viewer (SMDR Viewer)”) ); 174 175 version << AutoVersion::AV_MAJOR << ”.” 176 << AutoVersion::AV_MINOR << ”−” 42 177 << AutoVersion::AV_STATUS 178 << ”, build ” << AutoVersion::AV_BUILD << ”\n” 179 << wxbuildinfo(long_f); 180 info.SetVersion(version); 181 182 info.SetCopyright(wxT(”(C) 2016 С. М. Станкевич <okioup@vsu.by>”)); 183 184 desc << L”\Программаn создана в рамках курсовой работы\n” 185 << L”ИНФОРМАЦИОННАЯ\” СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ ТЕЛЕФОННЫХ 186 СОЕДИНЕНИЙ\”\n” << L”по дисциплине Средства\” визуального программирования 187 приложений\”\n\n” 188 << L”Выполнил: Станкевич Сергей Михайлович,\n” 189 << L”пециальностьc 1−40 01 73 Программное« обеспечение информационных систем», ” 190 << L”группа Пм−21\n\n” 191 << L”Руководитель: ст. преп. кафедры прикладного и системного программирования С. В. Сергеенко”; info.SetDescription(desc); 192 193 wxAboutBox(info); 194 195 } 196 197 void wx_testFrame::OnQuit(wxCommandEvent& event) { this−>Close(); 198 199 } 200 201 void wx_testFrame::OnClose(wxCloseEvent& event) { 202 event.Skip(wxID_YES == wxMessageDialog(NULL, 203 wxT(”Quit? Really?”), 204 wxT(”SMDR Viewer”), 205 wxCENTER | wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT). ShowModal()); 206 } 207 208 void wx_testFrame::OnMenuConnectSelected(wxCommandEvent& event) { 209 dlgConnect dlgConn1(nullptr); 210 dlgConn1.ShowModal(); 211 } 212 213 214 void wx_testFrame::OnMenuTableFilterSelected(wxCommandEvent& event){ dlgFilter dlgFilter1(nullptr); 43 dlgFilter1.ShowModal(); 215 216 } 217 218 void wx_testFrame::OnMenuViewTableSelected(wxCommandEvent& event) { 219 dlgTables dlgTabs1(nullptr); 220 dlgTabs1.ShowModal(); 221 } 222 223 void wx_testFrame::OnMenuStatisticsSelected(wxCommandEvent& event) { 224 dlgStat dlgStat1(nullptr); 225 dlgStat1.ShowModal(); 226 } Б.5 Файл dbDriver.h 1 #ifndef DBDRIVER_H_INCLUDED 2 #define DBDRIVER_H_INCLUDED 3 4 #include <wx/grid.h> 5 #include <wx/string.h> 6 #include <wx/arrstr.h> 7 #include <wx/fontmap.h> 8 #include <wx/toolbar.h> 9 #include ”wx_testMain.h” 10 #include <wx/msgdlg.h> 11 #include <mysql/mysql.h> 12 #include ”wx_testMain.h” 13 14 class MariaDBDriver { 15 16 MYSQL* _instance; 17 MYSQL* _conn; 18 MYSQL_RES *_res; 19 MYSQL_ROW *_row; 20 bool table_first; 21 22 wxString _host; 23 long 24 wxString _user; 25 wxString _password; 26 bool _is_connected; _port; 44 27 28 MYSQL_RES *execute_query(const wxString&); 29 void update_all_databases(); 30 void update_all_tables(); 31 void show_calltype(); 32 33 MariaDBDriver(); 34 wxString _curr_table; 35 36 public: 37 wx_testFrame *_frame; 38 wxGrid *m_pGrid; 39 wxString _db; 40 wxArrayString _all_db; 41 wxArrayString _all_tables; 42 43 void _set_curr_table(const wxString &); 44 wxString _get_curr_table(); 45 wxArrayString _get_curr_field(); 46 wxArrayString _get_curr_field_type(); 47 48 static MariaDBDriver * msMariaDBDriver; 49 static MariaDBDriver *Get_inst(); 50 ~MariaDBDriver(); 51 52 bool open_conn(const wxString&, const long&, const wxString&, const 53 wxString&); void set_curr_db(const wxString &); 54 55 56 bool verify_db(const wxString&); 57 bool is_connected(); 58 // void update_show_tables(const wxString &table_name = ””, const wxString &cond = ””); 59 void update_show_tables2(const wxString &in_query = ”show tables”); 60 void create_infotable(MYSQL_RES *); 61 62 inline void error_message_box(MYSQL *e) { 63 wxString err; 64 wxMessageBox((err << mysql_error(e)), wxT(”Error!”), wxCENTER | wxICON_ERROR | wxOK_DEFAULT); 65 } 66 45 template <typename T> inline void info_message_box(const T &val) { 67 68 wxString msg; 69 wxMessageBox((msg << val), wxT(”Information”), wxCENTER | wxICON_INFORMATION | wxOK_DEFAULT); } 70 71 }; 72 73 #endif // DBDRIVER_H_INCLUDED Б.6 Файл dbDriver.cpp 1 #include ”dbDriver.h” 2 3 MariaDBDriver * MariaDBDriver::msMariaDBDriver = nullptr; 4 5 MariaDBDriver::MariaDBDriver() { if(!msMariaDBDriver){ 6 7 table_first = true; 8 _is_connected = false; 9 _instance = mysql_init(NULL); if (!_instance) error_message_box(_instance); 10 } 11 12 } 13 14 MariaDBDriver *MariaDBDriver::Get_inst() { if(!msMariaDBDriver) { 15 msMariaDBDriver=new MariaDBDriver(); 16 17 } 18 return msMariaDBDriver; 19 } 20 21 MariaDBDriver::~MariaDBDriver() { if(_is_connected) mysql_close(_conn); 22 23 } 24 25 bool MariaDBDriver::open_conn(const wxString& host, const long& port, const wxString& user, const wxString& password) { 26 if (_is_connected) mysql_close(_conn); 27 _all_db.Clear(); 28 _is_connected=false; 29 _host = host; 46 30 _port = port; 31 _user = user; 32 _password = password; 33 _conn = mysql_real_connect(_instance , _host, _user, _password , ””, _port , nullptr , 0); if (_conn) { 34 35 info_message_box(”Connection success”); 36 mysql_set_character_set(_instance ,”cp1251”); 37 update_all_databases(); 38 _is_connected=true; 39 return true; 40 } 41 error_message_box(_instance); 42 return false; 43 } 44 45 MYSQL_RES * MariaDBDriver::execute_query(const wxString& q) { if(!mysql_query(_conn, q.c_str())) { 46 return mysql_store_result(_conn); 47 } else { 48 return nullptr; 49 } 50 51 } 52 53 void MariaDBDriver::update_all_databases() { 54 _all_db.Clear(); 55 MYSQL_RES *res = execute_query(”SHOW DATABASES”); 56 if (res) { 57 MYSQL_ROW row; 58 while ((row = mysql_fetch_row(res))) _all_db.Add(row[0]); 59 mysql_free_result(res); 60 delete res; } 61 62 } 63 64 void MariaDBDriver::update_all_tables() { 65 _all_tables.Clear(); 66 MYSQL_RES *res = execute_query(”SHOW TABLES”); 67 if (res) { 68 MYSQL_ROW row; 69 while ((row = mysql_fetch_row(res))) _all_tables.Add(row[0]); 70 mysql_free_result(res); 71 delete res; 47 } 72 73 } 74 75 bool MariaDBDriver::verify_db(const wxString& q) { return (_db == q) ? true : false; 76 77 } 78 79 bool MariaDBDriver::is_connected() { return _is_connected; 80 81 } 82 83 void MariaDBDriver::set_curr_db(const wxString &s) { 84 _db = s; 85 if (mysql_select_db(_instance , _db.c_str())) { 86 error_message_box(_instance); } else { 87 update_all_tables(); 88 89 info_message_box(”Database ’” + _db + ”’ is selected”); 90 _frame−>ToolBarViewTable−>Enable(true); 91 _frame−>ToolBarStat−>Enable(true); 92 _frame−>ToolBar1−>Realize(); 93 _frame−>MenuViewTable−>Enable(true); } 94 95 } 96 97 98 99 void MariaDBDriver::create_infotable(MYSQL_RES *res) { MYSQL_FIELD *fields = mysql_fetch_fields(res); if (table_first) { 100 m_pGrid−>CreateGrid(0,0); 101 m_pGrid−>AutoSize(); 102 m_pGrid−>EnableScrolling(1,1); 103 m_pGrid−>AppendCols(mysql_num_fields(res)); 104 table_first = false; 105 } else { 106 m_pGrid−>DeleteCols(0,m_pGrid−>GetNumberCols()); 107 m_pGrid−>DeleteRows(0,m_pGrid−>GetNumberRows()); 108 m_pGrid−>AppendCols(mysql_num_fields(res)); 109 } 110 for(size_t i = 0; i < mysql_num_fields(res); i++) 111 m_pGrid−>SetColLabelValue(i,fields[i].name); 112 size_t i = 0; 113 MYSQL_ROW row; 114 while ((row = mysql_fetch_row(res))) { 48 115 bool bIns = m_pGrid−>AppendRows(); 116 if (bIns) { for(size_t j = 0; j < mysql_num_fields(res); j++) { 117 118 wxString r(row[j]); 119 m_pGrid−>SetCellValue(i, j, r); 120 } 121 i++; } 122 123 } 124 m_pGrid−>Fit(); 125 mysql_free_result(res); 126 delete res; 127 } 128 129 //void MariaDBDriver::update_show_tables(const wxString &table_name , const wxString &cond) { 130 // if (table_name != ””) _curr_table = table_name; 131 // MYSQL_RES *res = execute_query(”SELECT * FROM ” + _curr_table + cond); 132 // if (res) { 133 // create_infotable(res); 134 // _frame−>ToolBarTableFilter−>Enable(true); 135 // _frame−>ToolBar1−>Realize(); 136 // _frame−>MenuTableFilter−>Enable(true); 137 // 138 // 139 // 140 //} } else { error_message_box(_instance); } 141 142 void MariaDBDriver::update_show_tables2(const wxString &in_query) { 143 144 MYSQL_RES *res = execute_query(in_query); 145 if (res) { 146 create_infotable(res); 147 _frame−>ToolBarTableFilter−>Enable(true); 148 _frame−>ToolBar1−>Realize(); 149 _frame−>MenuTableFilter−>Enable(true); } else { 150 error_message_box(_instance); 151 } 152 153 } 154 155 156 void MariaDBDriver::_set_curr_table(const wxString &t) { _curr_table = t; 49 157 } 158 159 wxString MariaDBDriver::_get_curr_table() { return _curr_table; 160 161 } 162 163 wxArrayString MariaDBDriver::_get_curr_field() { 164 info_message_box(”DESC ” + _curr_table); 165 wxArrayString tmp; 166 MYSQL_RES * res = execute_query(”DESC ” + _curr_table); 167 if (res) { 168 MYSQL_ROW row; 169 while ((row = mysql_fetch_row(res))) { tmp.Add(row[0]); 170 171 } 172 mysql_free_result(res); 173 delete res; } else { 174 error_message_box(_instance); 175 176 } 177 return tmp; 178 } 179 180 wxArrayString MariaDBDriver::_get_curr_field_type() { 181 wxArrayString tmp; 182 MYSQL_RES * res = execute_query(”DESC ” + _curr_table); 183 if (res) { 184 MYSQL_ROW row; 185 while ((row = mysql_fetch_row(res))) { tmp.Add(row[1]); 186 187 } 188 mysql_free_result(res); 189 delete res; 190 } 191 return tmp; 192 } Б.7 Файл dlgConnect.h 1 #ifndef DLGCONNECT_H 2 #define DLGCONNECT_H 50 3 4 #include ”dbDriver.h” 5 6 //(*Headers(dlgConnect) 7 #include <wx/sizer.h> 8 #include <wx/stattext.h> 9 #include <wx/textctrl.h> 10 #include <wx/choice.h> 11 #include <wx/button.h> 12 #include <wx/dialog.h> 13 //*) 14 15 16 17 class dlgConnect: public wxDialog 18 { 19 20 MariaDBDriver *drv; public: 21 22 dlgConnect(wxWindow* parent ,wxWindowID id=wxID_ANY); 23 virtual ~dlgConnect(); 24 25 //(*Declarations(dlgConnect) 26 wxStaticText* StaticText2; 27 wxTextCtrl* txtUser; 28 wxStaticText* StaticText1; 29 wxStaticText* StaticText3; 30 wxTextCtrl* txtHost; 31 wxButton* btnCloseDialog; 32 wxStaticText* StaticText5; 33 wxTextCtrl* txtPassword; 34 wxStaticText* StaticText4; 35 wxChoice* chDatabases; 36 wxButton* btnDoConnect; 37 wxTextCtrl* txtPort; 38 //*) 39 40 protected: 41 42 //(*Identifiers(dlgConnect) 43 static const long ID_STATICTEXT1; 44 static const long ID_TXT_HOST; 45 static const long ID_STATICTEXT2; 51 46 static const long ID_TXT_PORT; 47 static const long ID_STATICTEXT3; 48 static const long ID_TXT_USER; 49 static const long ID_STATICTEXT4; 50 static const long ID_TXT_PASSWORD; 51 static const long ID_BUTTON1; 52 static const long ID_STATICTEXT5; 53 static const long ID_CH_DATABASE; 54 static const long ID_OK; 55 //*) 56 private: 57 58 59 //(*Handlers(dlgConnect) 60 void OnbtnDoConnectClick(wxCommandEvent& event); 61 void OnchDatabasesSelect(wxCommandEvent& event); 62 void OnbtnCloseDialogClick(wxCommandEvent& event); 63 //*) 64 DECLARE_EVENT_TABLE() 65 66 }; 67 68 #endif Б.8 Файл dlgConnect.cpp 1 #include ”dlgConnect.h” 2 3 //(*InternalHeaders(dlgConnect) 4 #include <wx/intl.h> 5 #include <wx/string.h> 6 //*) 7 8 //(*IdInit(dlgConnect) 9 const long dlgConnect::ID_STATICTEXT1 = wxNewId(); 10 const long dlgConnect::ID_TXT_HOST = wxNewId(); 11 const long dlgConnect::ID_STATICTEXT2 = wxNewId(); 12 const long dlgConnect::ID_TXT_PORT = wxNewId(); 13 const long dlgConnect::ID_STATICTEXT3 = wxNewId(); 14 const long dlgConnect::ID_TXT_USER = wxNewId(); 15 const long dlgConnect::ID_STATICTEXT4 = wxNewId(); 52 16 const long dlgConnect::ID_TXT_PASSWORD = wxNewId(); 17 const long dlgConnect::ID_BUTTON1 = wxNewId(); 18 const long dlgConnect::ID_STATICTEXT5 = wxNewId(); 19 const long dlgConnect::ID_CH_DATABASE = wxNewId(); 20 const long dlgConnect::ID_OK = wxNewId(); 21 //*) 22 23 BEGIN_EVENT_TABLE(dlgConnect ,wxDialog) 24 //(*EventTable(dlgConnect) 25 //*) 26 END_EVENT_TABLE() 27 28 dlgConnect::dlgConnect(wxWindow* parent,wxWindowID id) 29 { 30 //(*Initialize(dlgConnect) 31 wxBoxSizer* BoxSizer4; 32 wxBoxSizer* BoxSizer6; 33 wxBoxSizer* BoxSizer5; 34 wxBoxSizer* BoxSizer2; 35 wxGridSizer* GridSizer1; 36 wxBoxSizer* BoxSizer1; 37 wxBoxSizer* BoxSizer3; 38 39 Create(parent , wxID_ANY , _(”Connect to database”), wxDefaultPosition , wxDefaultSize , wxDEFAULT_DIALOG_STYLE , _T(”wxID_ANY”)); 40 SetClientSize(wxSize(300,400)); 41 SetMinSize(wxSize(−1,−1)); 42 SetFocus(); 43 GridSizer1 = new wxGridSizer(7, 1, 5, 0); 44 BoxSizer1 = new wxBoxSizer(wxHORIZONTAL); 45 StaticText1 = new wxStaticText(this, ID_STATICTEXT1 , _(”Host”), wxDefaultPosition , wxSize(50,12), wxALIGN_LEFT , _T(”ID_STATICTEXT1”)); 46 StaticText1−>SetMinSize(wxSize(−1,−1)); 47 StaticText1−>SetMaxSize(wxSize(−1,−1)); 48 BoxSizer1−>Add(StaticText1 , 1, wxALL|wxALIGN_CENTER_VERTICAL , 5); 49 txtHost = new wxTextCtrl(this, ID_TXT_HOST , _(”localhost”), wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_HOST” )); 50 BoxSizer1−>Add(txtHost , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 51 GridSizer1−>Add(BoxSizer1 , 1, wxALL|wxEXPAND , 5); 52 BoxSizer2 = new wxBoxSizer(wxHORIZONTAL); 53 53 StaticText2 = new wxStaticText(this, ID_STATICTEXT2 , _(”Port”), wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT2”)); 54 BoxSizer2−>Add(StaticText2 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 55 txtPort = new wxTextCtrl(this, ID_TXT_PORT , _(”3306”), wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_PORT”)); 56 BoxSizer2−>Add(txtPort , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 57 GridSizer1−>Add(BoxSizer2 , 1, wxALL|wxEXPAND , 5); 58 BoxSizer3 = new wxBoxSizer(wxHORIZONTAL); 59 StaticText3 = new wxStaticText(this, ID_STATICTEXT3 , _(”User”), wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT3”)); 60 BoxSizer3−>Add(StaticText3 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 61 txtUser = new wxTextCtrl(this, ID_TXT_USER , _(”sts”), wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_USER”)); 62 BoxSizer3−>Add(txtUser , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 63 GridSizer1−>Add(BoxSizer3 , 1, wxALL|wxEXPAND , 5); 64 BoxSizer4 = new wxBoxSizer(wxHORIZONTAL); 65 StaticText4 = new wxStaticText(this, ID_STATICTEXT4 , _(”Password”), wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT4”)); 66 BoxSizer4−>Add(StaticText4 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 67 txtPassword = new wxTextCtrl(this, ID_TXT_PASSWORD , _(”123”), wxDefaultPosition , wxDefaultSize , wxTE_PASSWORD , wxDefaultValidator , _T(” ID_TXT_PASSWORD”)); 68 BoxSizer4−>Add(txtPassword , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 69 GridSizer1−>Add(BoxSizer4 , 1, wxALL|wxEXPAND , 5); 70 btnDoConnect = new wxButton(this, ID_BUTTON1 , _(”Connect!”), wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_BUTTON1”) ); 71 GridSizer1−>Add(btnDoConnect , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 72 BoxSizer5 = new wxBoxSizer(wxHORIZONTAL); 73 StaticText5 = new wxStaticText(this, ID_STATICTEXT5 , _(”Database”), wxDefaultPosition , wxSize(69,13), wxALIGN_LEFT , _T(”ID_STATICTEXT5”)); 74 StaticText5−>SetMinSize(wxSize(−1,−1)); 75 StaticText5−>SetMaxSize(wxSize(−1,−1)); 76 BoxSizer5−>Add(StaticText5 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 54 chDatabases = new wxChoice(this, ID_CH_DATABASE , wxDefaultPosition , wxSize 77 (125,21), 0, 0, 0, wxDefaultValidator , _T(”ID_CH_DATABASE”)); 78 chDatabases−>SetMinSize(wxSize(−1,−1)); 79 chDatabases−>SetMaxSize(wxSize(−1,−1)); 80 BoxSizer5−>Add(chDatabases , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| wxALIGN_CENTER_VERTICAL , 5); 81 GridSizer1−>Add(BoxSizer5 , 1, wxALL|wxEXPAND , 5); 82 BoxSizer6 = new wxBoxSizer(wxHORIZONTAL); 83 btnCloseDialog = new wxButton(this, ID_OK, _(”Close”), wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_OK”)); BoxSizer6−>Add(btnCloseDialog , 1, wxALL|wxALIGN_CENTER_HORIZONTAL| 84 wxALIGN_CENTER_VERTICAL , 5); 85 GridSizer1−>Add(BoxSizer6 , 1, wxALL|wxALIGN_RIGHT , 5); 86 SetSizer(GridSizer1); 87 SetSizer(GridSizer1); 88 Layout(); 89 Center(); 90 Connect(ID_BUTTON1 ,wxEVT_COMMAND_BUTTON_CLICKED ,(wxObjectEventFunction)& 91 dlgConnect::OnbtnDoConnectClick); Connect(ID_CH_DATABASE ,wxEVT_COMMAND_CHOICE_SELECTED ,( 92 wxObjectEventFunction)&dlgConnect::OnchDatabasesSelect); Connect(ID_OK,wxEVT_COMMAND_BUTTON_CLICKED ,(wxObjectEventFunction)& 93 dlgConnect::OnbtnCloseDialogClick); //*) 94 95 drv = MariaDBDriver::Get_inst(); 96 if (drv−>is_connected()) { 97 wxArrayString * all_db = &drv−>_all_db; 98 if (all_db−>size()) { 99 chDatabases−>Clear(); 100 for(size_t i = 0; i < all_db−>size(); i++){ 101 102 chDatabases−>Append(all_db−>Item(i)); 103 if (drv−>verify_db(all_db−>Item(i))) chDatabases−>SetSelection(i); 104 } 105 106 } 107 } 108 } 109 110 dlgConnect::~dlgConnect() 111 { 112 //(*Destroy(dlgConnect) 55 //*) 113 114 } 115 116 void dlgConnect::OnbtnDoConnectClick(wxCommandEvent& event) { 117 wxString h, u, ps; 118 h = txtHost−>GetValue(); 119 u = txtUser−>GetValue(); 120 ps = txtPassword−>GetValue(); 121 long p; 122 (txtPort−>GetValue()).ToLong(&p); 123 if (drv−>open_conn(h, p, u, ps)) { 124 wxArrayString * all_db = &drv−>_all_db; 125 if(all_db−>size()){ 126 chDatabases−>Clear(); 127 for(size_t i = 0; i < all_db−>size(); i++){ 128 129 chDatabases−>Append(all_db−>Item(i)); 130 if (drv−>verify_db(all_db−>Item(i))) chDatabases−>SetSelection(i); 131 } 132 } 133 } else { 134 this−>Close(); 135 } 136 137 } 138 139 void dlgConnect::OnchDatabasesSelect(wxCommandEvent& event) { drv−>set_curr_db(chDatabases−>GetString(chDatabases−>GetSelection())); 140 141 } 142 143 144 void dlgConnect::OnbtnCloseDialogClick(wxCommandEvent& event) { this−>Close(); 145 146 } Б.9 Файл dlgTables.h 1 #ifndef DLGTABLES_H 2 #define DLGTABLES_H 3 4 #include ”dbDriver.h” 56 5 6 //(*Headers(dlgTables) 7 #include <wx/listbox.h> 8 #include <wx/button.h> 9 #include <wx/dialog.h> 10 //*) 11 12 13 class dlgTables: public wxDialog 14 { MariaDBDriver *drv; 15 public: 16 17 18 dlgTables(wxWindow* parent); 19 virtual ~dlgTables(); 20 21 //(*Declarations(dlgTables) 22 wxListBox* lstTables; 23 wxButton* dtnOK; 24 //*) 25 protected: 26 27 28 //(*Identifiers(dlgTables) 29 //*) 30 private: 31 32 33 //(*Handlers(dlgTables) 34 void OndtnOKClick(wxCommandEvent& event); 35 //*) 36 DECLARE_EVENT_TABLE() 37 38 }; 39 40 #endif Б.10 Файл dlgTables.cpp 1 #include ”dlgTables.h” 2 57 3 4 5 //(*InternalHeaders(dlgTables) 6 #include <wx/xrc/xmlres.h> 7 //*) 8 9 10 //(*IdInit(dlgTables) //*) 11 12 BEGIN_EVENT_TABLE(dlgTables ,wxDialog) 13 //(*EventTable(dlgTables) 14 //*) 15 END_EVENT_TABLE() 16 17 18 dlgTables::dlgTables(wxWindow* parent) { 19 //(*Initialize(dlgTables) 20 wxXmlResource::Get()−>LoadObject(this,parent,_T(”dlgTables”),_T(”wxDialog” )); 21 lstTables = (wxListBox*)FindWindow(XRCID(”ID_LISTBOX1”)); 22 dtnOK = (wxButton*)FindWindow(XRCID(”ID_BUTTON1”)); 23 24 Connect(XRCID(”ID_BUTTON1”),wxEVT_COMMAND_BUTTON_CLICKED ,( wxObjectEventFunction)&dlgTables::OndtnOKClick); 25 //*) 26 27 SetTitle(wxT(”Список таблиц”)); 28 29 drv = MariaDBDriver::Get_inst(); 30 if(drv−>is_connected()){ wxArrayString * tmp = &drv−>_all_tables; 31 if(tmp−>size()){ 32 lstTables−>Clear(); 33 34 for(size_t i = 0; i < tmp−>size(); i++){ 35 lstTables−>Append(tmp−>Item(i)); 36 if (drv−>verify_db(tmp−>Item(i))) lstTables−>SetSelection(i); 37 } 38 } 39 40 } else { 41 drv−>info_message_box(”Connection failed!”); 42 this−>Close(); 43 } 58 44 } 45 46 47 dlgTables::~dlgTables() { 48 49 50 //(*Destroy(dlgTables) 51 //*) 52 } 53 54 void dlgTables::OndtnOKClick(wxCommandEvent& event) { if (lstTables−>GetSelection() != −1) { 55 drv−>_set_curr_table(lstTables−>GetString(lstTables−>GetSelection()) 56 ); drv−>update_show_tables2(”SELECT * FROM ” + lstTables−>GetString( 57 lstTables−>GetSelection())); this−>Close(); 58 } else { 59 drv−>info_message_box(wxT(”Укажите желаемую таблицу!”)); 60 } 61 62 } Б.11 Файл dlgFilter.h 1 #ifndef DLGFILTER_H 2 #define DLGFILTER_H 3 4 #include ”dbDriver.h” 5 6 //(*Headers(dlgFilter) 7 #include <wx/textctrl.h> 8 #include <wx/button.h> 9 #include <wx/dialog.h> 10 #include <wx/combobox.h> 11 //*) 12 13 class dlgFilter: public wxDialog 14 { 15 16 MariaDBDriver *drv; public: 17 59 18 dlgFilter(wxWindow* parent); 19 virtual ~dlgFilter(); 20 21 //(*Declarations(dlgFilter) 22 wxComboBox* cmbOp; 23 wxButton* btnOK; 24 wxComboBox* cmbField; 25 wxTextCtrl* TextCtrl1; 26 //*) 27 protected: 28 29 30 //(*Identifiers(dlgFilter) 31 //*) 32 private: 33 34 35 //(*Handlers(dlgFilter) 36 void OnComboBox2Selected(wxCommandEvent& event); 37 void OnbtnOKClick(wxCommandEvent& event); 38 //*) 39 DECLARE_EVENT_TABLE() 40 41 }; 42 43 #endif Б.12 Файл dlgFilter.cpp 1 #include ”dlgFilter.h” 2 3 //(*InternalHeaders(dlgFilter) 4 #include <wx/xrc/xmlres.h> 5 //*) 6 7 //(*IdInit(dlgFilter) 8 //*) 9 10 BEGIN_EVENT_TABLE(dlgFilter ,wxDialog) 11 //(*EventTable(dlgFilter) 12 //*) 60 13 END_EVENT_TABLE() 14 15 dlgFilter::dlgFilter(wxWindow* parent) 16 { 17 //(*Initialize(dlgFilter) 18 wxXmlResource::Get()−>LoadObject(this,parent,_T(”dlgFilter”),_T(”wxDialog” )); 19 cmbField = (wxComboBox*)FindWindow(XRCID(”ID_COMBOBOX1”)); 20 cmbOp = (wxComboBox*)FindWindow(XRCID(”ID_COMBOBOX2”)); 21 TextCtrl1 = (wxTextCtrl*)FindWindow(XRCID(”ID_TEXTCTRL1”)); 22 btnOK = (wxButton*)FindWindow(XRCID(”ID_BUTTON1”)); 23 Connect(XRCID(”ID_BUTTON1”),wxEVT_COMMAND_BUTTON_CLICKED ,( 24 wxObjectEventFunction)&dlgFilter::OnbtnOKClick); 25 //*) 26 drv = MariaDBDriver::Get_inst(); 27 wxArrayString tmp = drv−>_get_curr_field(); 28 for(size_t i = 0; i < tmp.size(); i++){ cmbField−>Append(tmp.Item(i)); 29 } 30 31 } 32 33 dlgFilter::~dlgFilter() 34 { 35 //(*Destroy(dlgFilter) 36 //*) 37 } 38 39 40 void dlgFilter::OnbtnOKClick(wxCommandEvent& event) { 41 wxString tmp = TextCtrl1−>GetValue(); 42 wxArrayString tmp2 = drv−>_get_curr_field_type(); 43 if (tmp2.Item(cmbField−>GetSelection()) == ”time” || tmp2.Item(cmbField−>GetSelection()) == ”date”) { 44 45 tmp = ”\”” + tmp + ”\””; 46 47 } 48 49 switch(cmbOp−>GetSelection()){ 50 case 1: 51 case 2: 52 case 3: 53 case 4: 61 case 5: 54 55 TextCtrl1−>Enable(true); 56 TextCtrl1−>Refresh(); 57 break; 58 case 6: 59 case 7: 60 TextCtrl1−>Enable(true); 61 tmp = ”\”%” + tmp + ”%\””; 62 break; 63 case 8: 64 case 9: 65 TextCtrl1−>Enable(false); 66 TextCtrl1−>Refresh(); 67 tmp = ””; 68 break; } 69 70 71 wxString q; 72 q << (”SELECT * FROM ” + drv−>_get_curr_table() + ” WHERE ” + 73 cmbField−>GetString(cmbField−>GetSelection()) + 74 ” ” + 75 cmbOp−>GetString(cmbOp−>GetSelection()) + 76 ” ” + 77 tmp); 78 drv−>info_message_box(q); 79 drv−>update_show_tables2(q); 80 this−>Close(); 81 } Б.13 Файл version.h 1 #ifndef VERSION_H 2 #define VERSION_H 3 4 namespace AutoVersion{ 5 6 //Date Version Types 7 static const char AV_DATE[] = ”26”; 8 static const char AV_MONTH[] = ”11”; 9 static const char AV_YEAR[] = ”2016”; 10 static const char AV_UBUNTU_VERSION_STYLE[] = 62 ”16.11”; 11 12 //Software Status 13 static const char AV_STATUS[] = 14 static const char AV_STATUS_SHORT[] = ”Release Candidate”; ”rc”; 15 16 //Standard Version Type 17 static const long AV_MAJOR = 1; 18 static const long AV_MINOR = 6; 19 static const long AV_BUILD = 16; 20 static const long AV_REVISION = 0; 21 22 //Miscellaneous Version Types 23 static const long AV_BUILDS_COUNT 24 #define AV_RC_FILEVERSION 1,6,16,0 25 #define AV_RC_FILEVERSION_STRING ”1, 6, 16, 0\0” 26 static const char AV_FULLVERSION_STRING [] = ”1.6.16.0”; = 876; 27 //These values are to keep track of your versioning state, don’t modify 28 them. static const long AV_BUILD_HISTORY 29 = 4; 30 31 32 } 33 #endif //VERSION_H 63