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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1004,5 Кб
  • Опубликовано:
    2013-02-04
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Федеральное государственное образовательное учреждение

среднего профессионального образования

"Сергиево-Посадский киновидеотехнический колледж"

Специальность: "Программное обеспечение вычислительно техники и автоматизированных систем"

Дипломный проект

на тему: "Разработка распределенного программного обеспечения для контроля знаний студентов"

 

 

 

 

Автор ДП: Волков Александр Сергеевич

Руководитель: Захаров Михаил Иванович

Рецензент: Зуденкова Людмила Георгиевна

Консультант: Петрухина Вера Васильевна






Сергиев Посад 2008 г.

Содержание

1. Введение

2. Обзор существующих программ

2.1 Системы контроля знаний

2.1.1 Система контроля знаний knost

2.1.2 Сетевая система контроля знаний на основе объектно-ориентированного подхода

2.1.3 Анализ существующих систем контроля знаний

2.2 Исследование методов проектирования баз данных

2.3 Выбор программно-технических средств для реализации проекта

2.3.1 MySQL

2.3.2 Inter Base

2.3.3 Microsoft SQL Server

2.4 Техническое задание

3. Расчетная часть

3.1 Разработка структурной схемы подсистемы

3.2 Разработка алгоритмического обеспечения

3.2.1 Модуль администратора

3.2.2 Модуль тестирования

3.3 Разработка программного обеспечения

3.3.1 Установка MySQL

3.4 Разработка интерфейса пользователя

3.4.1 Разработка интерфейса Модуля администратора

3.4.2 Разработка интерфейса Модуля тестирования

3.5 Разработка инструкции пользователя

4. Технологический раздел

4.1 Технология разработки элементов базы данных

4.1.1 Создание базы данных

4.1.2 Создание таблиц базы данных

4.2 Технология разработки программных модулей

4.3 Технология разработки интерфейса пользователя

5. Расчет себестоимости

6. Техника безопасности

6.1 Требования по охране труда в соответствии с инструкцией №32-04-Б

6.1.1 Требования безопасности перед началом работы

6.1.2 Требования безопасности во время работы

6.1.3 Требования безопасности после окончания работы

6.2 Вредные факторы

6.2.1 Физические

6.2.2 Химические

6.2.3 Психофизиологические

6.3 Требования по условиям труда

6.4 Требования безопасности в аварийных ситуациях в случае обнаружения аварийной ситуации

Заключение

Список используемых источников

Приложения

1. Введение


По оценке некоторых зарубежных специалистов, трудоемкость может в 10 раз превышать работу, проделанную при написании учебника. Но это лишь на первом этапе. С другой стороны, традиционный способ проверки вообще не выдерживает сравнения с автоматизированным его аналогом, так как носит эпизодический, субъективный и фрагментарный характер. Так, экспериментально установлено, что оптимальным является 6-8 циклов текущего контроля, что обеспечивает высокую успеваемость студентов и достигается лишь с помощью автоматизированных (компьютерных) систем, позволяющих осуществлять более всестороннюю и полную проверку уровня обученности студентов. Кроме того, возникает возможность оперативно обрабатывать результаты контроля без дополнительных затрат времени преподавателя, что обеспечивает рациональное планирование учебного процесса.

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

2. Обзор существующих программ


2.1 Системы контроля знаний


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

2.1.1 Система контроля знаний knost

Система контроля знаний knost предназначена для создания тестов в электронном виде, для тестирования и для просмотра результатов тестирования. Она может применяться в учебных заведениях, а также на предприятиях с целью контроля уровня знаний персонала.

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

–       вопрос - многострочный текст, длина которого ограничена величиной 2 Гбайта

–       картинку

–       список вариантов ответа

У каждого вопроса может быть своё количество вариантов ответа. Максимальное число вариантов ответа на один вопрос составляет примерно 2 млрд. Каждому варианту ответа ставится в соответствие количество баллов, которое даётся за данный вариант ответа. "Правильным" считается тот вариант ответа, которому соответствует максимальный балл. В частности, может быть несколько вариантов правильного ответа.

Система состоит из двух программ: модуль администратора и модуль тестирования. Основные функции системы:

а) создание теста;

б) Тестирование локальное (одиночное);

в) Тестирование удалённое;

г) Просмотр результатов тестирования.

В модуле администратора создаётся тест, который сохраняется в файле с расширением *. knt. В этом же модуле можно затем и протестироваться чтобы посмотреть, как работает созданный тест и исправить возможные ошибки.

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

Удаленное тестирование применяется при тестировании группы студентов. Каждый тестируемый запускает модуль тестирования, выбирает режим удалённого тестирования, вводит своё имя, имя компьютера преподавателя (или его IP-адрес) и нажимает кнопку "Готов!". В свою очередь преподаватель запускает модуль администратора, выбирает режим удалённого тестирования и выбирает тест и место (каталог), куда записывать результаты тестирования. В таблице будет видно, какие студенты подключены. Преподаватель может указать ограничение по времени тестирования. После нажатия на кнопку "Пуск", на клиентских компьютерах начинает выполняться тест, и завершается или по истечении времени тестирования, или при досрочном завершении теста студентом, или - же при нажатии преподавателем кнопки "Стоп". В последнем случае тест завершится на всех подключённых компьютерах.

Для просмотра результатов тестирования в модуле администратора открывается файл результатов тестирования (с расширением *. knt). При этом можно видеть, какой вариант ответа выбирал тестируемый на каждый вопрос и сколько баллов он набрал. В программе рассчитывается "коэффициент знаний", который представляет собой результат деления числа баллов, набранных тестируемым, на максимально возможное количество баллов в этом тесте. То есть, этот коэффициент может принимать значение от нуля до единицы. Оценка по пятибалльной шкале считается как округлённое значение произведения коэффициента знаний на 5.

Удобный и наглядный интерфейс программы. Программа занимает мало места и абсолютно не требовательна к ресурсам компьютера и сети. К недостаткам можно отнести то, что бесплатная версия не позволяет тестировать в сети более трех человек. [20]

2.1.2 Сетевая система контроля знаний на основе объектно-ориентированного подхода

Данная система имеет трехзвенную архитектуру. Целью этой технологии является снижение требований к клиентским компьютерам, для этого значительная часть программных ресурсов клиента переносится в промежуточное звено - сервер приложений. Сервер приложений располагается на компьютере, где находится БД с тестами или на выделенном сетевом компьютере. Только он с помощью BDE непосредственно взаимодействует с БД, реализуя посредничество между ними и остальными клиентскими местами (Рисунок 2.1).

Рисунок 2.1 - Схема трехзвенной архитектуры

В этой архитектуре клиентское программное обеспечение не обращается к BDE и освобождается от значительного слоя компонентов-источников. В результате получается "облегченный" клиент, который не требует больших ресурсов памяти, существенно снижается сетевой трафик за счет отложенного обновления и регулируемого объемов пакетов данных.

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

Стандартизованный контроль знаний выполняется с помощью тестов. В общем случае, когда проверку результатов теста осуществляет человек, тест - это набор вопросов и правильных ответов к ним (эталонов). Если же определение правильности ответа возлагается на ЭВМ, необходимо включить в тест набор параметров, управляющих алгоритмами проверки выполнения теста.

Если рассматривать отдельный сеанс, то он состоит из трех этапов:

а) подготовка заданий для контроля;

б) проведение опроса;

в) оценка полученных результатов.

Такая система контроля знаний позволяет: проводить групповое компьютерное тестирование по произвольной тематике; вести базу данных проведенных тестирований; производить автоматическое выставление оценок по полученным результатам тестирований; составлять отчёты по результатам тестирований и распечатывать их; быстро и легко разрабатывать новые тесты по произвольной тематике; вести разработку тестов, направленных на достижение объективности оценки знаний.

Система может функционировать в одном из двух режимов: однопользовательский режим (персональное тестирование); многопользовательский режим (групповое тестирование). Многопользовательский режим реализован на базе клиент-серверной технологии с использованием протокола TCP/IP.

Данная система снабжена эффективным, а главное простым механизмом разработки тестов (для этого создана программа Место Разработчика).

Имеется возможность подробно проанализировать результаты всех проведенных сеансов тестирований и сгенерировать ряд необходимых отчетов (для этого создана программа Место Преподавателя).

Таким образом, система для проведения компьютерного тестирования, состоит из трёх, дополняющих друг друга, программных продуктов.

Состав программного пакета: Место Разработчика, Место Пользователя, Место Преподавателя.

Место Разработчика предназначено для создания новых тестов и редактирования старых. Обладает простым и эффективным механизмом для разработки новых тестов.

Место Пользователя служит для проведения тестирований (Рисунок 2.2).

Место Преподавателя используется для выставления оценок за тестирования, составления отчётов по результатам тестирований, настройки Места Пользователя для проведения следующего тестирования, оценки качества тестов.

Созданный сервер занимается обслуживанием тестируемых и преподавателей по сетевому протоколу TCP/IP (протокол обмена информацией в INTERNET) при функционировании пакета в клиент-серверном режиме.

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

Место Пользователя и Место Преподавателя разработаны таким образом, что могут работать, как с локальными данными и пользователями (персональное тестирование), так и с "удаленными" данными и пользователями.

Рисунок 2.2 - Главное окно программы

2.1.3 Анализ существующих систем контроля знаний

Анализ как приведенных выше, так и других доступных систем контроля знаний выявил их следующие недостатки:

а) ограниченное количество ответов. Не во всех системах реализованы даже основные формы представления ответов.

б) отсутствие формальных методов дифференцированной оценки ответов.

в) слабые возможности параметрической настройки теста.

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

д) многие программы или дополнительные модули к ним являются платными.

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

2.2 Исследование методов проектирования баз данных


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

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

В основу проектирования баз данных должны быть положены представления конечных пользователей конкретной организации - концептуальные требования к системе. Именно конечный пользователь в своей работе принимает решения с учетом получаемой в результате доступа к базе данных информации. От оперативности и качества этой информации будет зависеть эффективность работы организации. Данные, помещаемые в базу данных, также предоставляет конечный пользователь. [23]

При рассмотрении требований конечных пользователей необходимо принимать во внимание следующее:

         база данных должна удовлетворять актуальным информационным потребностям организации. Получаемая информация должна по структуре и содержанию соответствовать решаемым задачам;

-        база данных должна обеспечивать получение требуемых данных за приемлемое время, то есть отвечать заданным требованиям производительности;

         база данных должна удовлетворять выявленным и вновь возникающим требованиям конечных пользователей;

         база данных должна легко расширяться при реорганизации и расширении предметной области;

         база данных должна легко изменяться при изменении программной и аппаратной среды;

         загруженные в базу данных корректные данные должны оставаться корректными;

         данные до включения в базу данных должны проверяться на достоверность;

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

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

Этап 1 - проектирование концептуальной модели баз данных:

а) анализ данных: сбор основных данных (например, объекты, связи между объектами);

б) существующие прикладные программы: сбор информации о данных в существующих прикладных программах для определения объектов и их взаимосвязей;

в) потенциально возможные прикладные программы: сбор информации о потенциальных возможностях использования данных.

Этап 2 - проектирование логической модели данных с учетом требований СУБД и определяемых конкретным пакетом СУБД процедур.

Этап 3 - проектирование физической модели базы данных.

Этап 4 - оценка физической модели базы данных (на основе оценки эксплуатационных характеристик прикладных программ с учетом частоты использования приоритетов).

При неудовлетворительных оценках эксплуатационных характеристик - возврат на этапы 2 или 3.

Этап 5 - реализация базы данных

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

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

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

2.3 Выбор программно-технических средств для реализации проекта


Как только мы задумываемся о каком-либо упорядоченном архивировании информации, мы неизбежно приходим к мысли о создании базы данных. Создав её, например, в Microsoft Access, мы, облегчённо вздыхаем и на какое-то время успокаиваемся. Но это спокойствие длится не долго. И вот на нашем горизонте уже маячит следующая задача, продиктованная жизненной необходимостью, - нужно обеспечить доступ к этим данным через Internet с рабочих станций, на которых, вполне возможно установлены, различные ОС. Естественно не мы первые, кому необходимо разрешить задачу подобного рода. Опыта других людей и средств для разрешения этой проблемы довольно много. Мы воспользуемся языком, который позволяет пользователям, знающим один набор команд, использовать их, чтобы создавать, отыскивать, изменять, и передавать информацию, независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции, или на универсальной ЭВМ.символизирует собой структурированный язык pзапросов. Это язык, который дает вам возможность создавать и работать в реляционных базах данных, которые являются наборами связанной информации сохраняемой в таблицах. [23]

2.3.1 MySQL

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

Клиентские программы могут работать не только в режиме командной строки. Есть и графические клиенты, например MySQL GUI, PhpMyAdmin и другие.взаимодействует с базой данных на языке, называемом SQL.предназначен для манипуляции данными, которые хранятся в Системах управления реляционными базами данных (RDBMS). SQL имеет команды, с помощью которых данные можно извлекать, сортировать, обновлять, удалять и добавлять. Стандарты языка SQL определяет ANSI (American National Standards Institute). В настоящее время действует стандарт, принятый в 2003 году (SQL-3).можно использовать с такими RDBMS как MySQL, mSQL, PostgresSQL, Oracle, Microsoft SQL Server, Access, Sybase, Ingres. Эти системы RDBMS поддерживают все важные и общепринятые операторы SQL, однако каждая из них имеет множество своих собственных патентованных операторов и расширений.является общим языком запросов для нескольких баз данных различных типов.- это система управления базами данных. База данных представляет собой структурированную совокупность данных. Эти данные могут быть любыми - от простого списка предстоящих покупок до перечня экспонатов картинной галереи или огромного количества информации в корпоративной сети. Для записи, выборки и обработки данных, хранящихся в компьютерной базе данных, необходима система управления базой данных, каковой и является ПО MySQL. Поскольку компьютеры замечательно справляются с обработкой больших объемов данных, управление базами данных играет центральную роль в вычислениях. Реализовано такое управление может быть по-разному - как в виде отдельных утилит, так и в виде кода, входящего в состав других приложений.- это система управления реляционными базами данных. В реляционной базе данные хранятся в отдельных таблицах, благодаря чему достигается выигрыш в скорости и гибкости. Таблицы связываются между собой при помощи отношений, благодаря чему обеспечивается возможность объединять при выполнении запроса данные из нескольких таблиц. SQL как часть системы MySQL можно охарактеризовать как язык структурированных запросов плюс наиболее распространенный стандартный язык, используемый для доступа к базам данных.

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

Программное обеспечение MySQL является системой клиент-сервер, которая содержит многопоточный SQL-сервер, обеспечивающий поддержку различных вычислительных машин баз данных, а также несколько различных клиентских программ и библиотек, средства администрирования и широкий спектр программных интерфейсов (API).

Система безопасности основана на привилегиях и паролях с возможностью верификации с удаленного компьютера, за счет чего обеспечивается гибкость и безопасность. Пароли при передаче по сети при соединении с сервером шифруются. Клиенты могут соединяться с MySQL, используя сокеты TCP/IP, сокеты Unix или именованные каналы (named pipes, под NT)

Начиная с MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 терабайт. Однако следует заметить, что операционные системы имеют свои собственные ограничения по размерам файлов. Ниже приведено несколько примеров:

         32-разрядная Linux-Intel - размер таблицы 4 Гб;

-        Solaris 2.7 Intel - 4 Гб;

         Solaris 2.7 UltraSPARC - 512 Гб;

         WindowsXP - 4 Гб.

Как можно видеть, размер таблицы в базе данных MySQL обычно лимитируется операционной системой. По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk - dv table_name. Если большая таблица предназначена только для чтения, можно воспользоваться myisampack, чтобы слить несколько таблиц в одну и сжать ее. Обычно myisampack ужимает таблицу по крайней мере на 50%, поэтому в результате можно получить очень большие таблицы. [18], [22]

2.3.2 Inter Base

InterBase - это SQL-сервер, СУБД, отличающаяся маленькими требованиями к ресурсам системы и при этом довольно серьезной производительностью. Разумеется, речь идет в основном про управление базами данных объемом до нескольких гигабайт. В таких ситуациях InterBase является, пожалуй, наилучшим выбором из некоторого числа других серверов.

Что отличает InterBase? Прежде всего, это кросс-платформенность, то есть, переносимость с одной операционной системы на другую. InterBase поддерживает Linux, Windows и значительное количество Unix-платформ. И делает это легко и удобно. Фактически, приложение, которое использует InterBase, не увидит разницы, на какой платформе в данный момент находится сервер. А если вам захочется поменять платформу, то это не потребует переделки базы данных - достаточно лишь проделать операцию резервного копирования на одной платформе и восстановления копии на другой.всегда был инновационным продуктом, если так можно выразиться. Многие технологии, которые сейчас считаются само собой разумеющимися в мире баз данных, впервые появились именно в InterBase. Прежде всего, речь идет о BLOB-полях. Это может звучать удивительно, но именно в InterBase они впервые и появились. Во-вторых, это UDF, то есть, функции, определяемые пользователем. Замечательная возможность расширить набор встроенных функций при помощи любого средства разработки! Сама идеология InterBase - система множественного поколения записей, которая позволяет гарантировать отсутствие блокировок по чтению и быстрое восстановление базы данных при сбоях - это совершенно инновационная технология, которая являлась уникальной с самого начала, да и сейчас, пожалуй, не имеет реальных аналогов. Ну и напоследок, стоит упомянуть каскадные триггеры. Именно этот механизм, позволяющий создавать очереди автоматически запускающихся триггеров на все виды операций с данными, дает нам возможность гибко реализовывать практически сколь угодно сложную бизнес-логику. [25]

2.3.3 Microsoft SQL Server

Microsoft SQL Server 2000 - это реляционная система управления базой данных (СУБД). В реляционных базах данных данные хранятся в таблицах. Взаимосвязанные данные могут группироваться в таблицы, кроме того, могут быть установлены также и взаимоотношения между таблицами. Отсюда и произошло название реляционные - от английского слова relational (родственный, связанный отношениями, взаимозависимый). Пользователи получают доступ к данным на сервере через приложения, а администраторы, выполняя задачи конфигурирования, администрирования и поддержки базы данных, производят непосредственный доступ к серверу. SQL Server является масштабируемой базой данных, это значит, что она может хранить значительные объемы данных и поддерживать работу многих пользователей, осуществляющих одновременный доступ к базе данных.

СУБД SQL Server появилась в 1989 году и с тех пор значительно изменилась. Огромные изменения претерпели масштабируемость продукта, его целостность, удобство администрирования, производительность и функциональные возможности.

Система SQL Server может быть реализована либо как клиент-серверная система, либо как автономная "настольная" система. Тип проектируемой системы зависит от количества пользователей, которые должны одновременно осуществлять доступ к базе данных, и от характера работ, которые должны выполняться. [18], [19], [23]

Это далеко не полный обзор клиент-серверных СУБД. В своем дипломном проекте я использовал систему MySQL. Это обусловлено гибкостью, масштабироемостью, большими возможностями, кросплатформенностью и сравнительно низкими требованиями к программным и аппаратным ресурсам, а также данная СУБД распространяется бесплатно.

 

.4 Техническое задание


Цель дипломного проекта состоит в разработке сетевой системы контроля знаний на основе клиент-серверной модели для Сергиево-Посадского киновидеотехнического колледжа.

Сущность контроля знаний, состоит в том, что пользователю предлагается выборка специальных заданий и по ответам на нее выносится суждение о его знаниях. Стандартизованный методы контроля знаний имеют следующие положительные свойства, определяющие целесообразность их применения:

· кратковременность проверки;

· стандартность проведения проверки

· стандартность анализа результатов;

· возможность представления результатов проверки в числовой форме;

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

База данных для контроля знаний должна иметь возможности создания новых тестов, редактирования уже внесенных. База данных должна позволять проведение тестирования одновременно на 30-ти рабочих местах.

3. Расчетная часть


3.1 Разработка структурной схемы подсистемы


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

Клиент-серверная система может иметь либо двухзвенную установку (two-tier setup), либо трехзвенную установку (three-tier setup). Независимо от варианта установки, программное обеспечение и базы данных MySQL размещаются на центральном компьютере, который называется сервер базы данных (database server). Пользователи работают на отдельных компьютерах, которые называются клиенты (clients). Доступ пользователей к серверу базы данных производится при помощи приложений с их компьютеров-клиентов (в двухзвенных системах (Рисунок 3.1)) либо при помощи приложений, выполняющихся на специально предназначенном для этой цели компьютере, который называется сервер приложений (в трехзвенных системах).

Свое приложение я реализовал с использованием двухзвенной установки.

В двухзвенных системах клиенты реализовывают приложения, осуществляющие доступ к серверу базы данных непосредственно через сеть. Таким образом, компьютеры-клиенты исполняют программный код, соответствующий нуждам предприятия, и код, отображающий для пользователя результаты доступа к базе данных. Такие клиенты называются толстыми (thick client), потому что они выполняют два вида работы. Двухзвенная установка полезна при относительно небольшом количестве пользователей, потому что для соединения с каждым из пользователей расходуются системные ресурсы, такие как память и блокировки (locks). Чем больше будет количество соединений с пользователями, тем хуже будет производительность системы, из-за соперничества за ресурсы. Но так как, база данных для контроля знаний писалась непосредственно для конкретной задачи

Рисунок 3.1 - Двухзвенная клиент-серверная система тестирования студентов Сергиево-Посадского киновидеотехнического колледжа, где есть возможность тестировать одновременно не более 30-ти студентов, то двухзвенная архитектура явилась вполне подходящей.

3.2 Разработка алгоритмического обеспечения


Система состоит из двух программ: модуль администратора и модуль тестирования.

3.2.1 Модуль администратора

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

Модуль подключения (Рисунок 3.2). Первым пунктом идет загрузка данных (пароля и настроек). Далее если пароль и настройки верны, то идет подключение к серверу. Отдельным блоком идет разрыв соединения, который может наступить в любой момент как по желанию пользователя, так и в зависимости от каких-либо обстоятельств.

Рисунок 3.2 - Модуль подключение Модуля администратора

Редактор опросника (Рисунок 3.3).

Рисунок 3.3 - Редакторы тем и вопросов Модуля администратора

Данный этап, как видно из рисунка, состоит из двух частей: реактора тем и редактора вопросов.

Сперва заполняются темы, а уже потом, к каждой теме есть возможность создать вопросы. По умолчанию (как требовалось изначально) создаётся 1 вопрос, но их количество можно менять. Редакторы содержат стандартные функции создания, редактирования и удаления.

Пользователи (Рисунок 3.4).

В данном модуле реализована возможность управления пользователями имеющих доступ к базе данных.

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

Рисунок 3.4 - редактор пользователей Модуля администратора

Студенты (Рисунок 3.5).

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

Рисунок 3.5 - Редактор студентов Модуля администратора

Модуль Оценок (Рисунок 3.6)

Рисунок 3.6 - Модуль Оценки Модуля администратора

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

Модуль Отчетов (Рисунок 3.7).

Рисунок 3.7 - Модуль Отчетов Модуля администратора

Данный модуль состоит из четырех этапов, которые, если объединить второй и третий пункты, можно было бы сократить до трех. Сначала мы берем уже готовые результаты, которые хранятся на сервере. Затем происходит их фильтрование и сортировка по указанным пользователем критериям и запросам. А после этого уже нужные данные можно распечатать в виде отчетов. Модуль обложек (Рисунок 3.8)

В моей программе использован механизм обложек или так называемых "скинов", что позволяет легко и просто менять интерфейс программы т.е. изменять стиль отображения элементов и различных визуальных эффектов. Для разработки обложки используется сторонняя программа, после чего файл обложки загружается в БД и может быть использован.

Рисунок 3.8 - Модуль Обложек Модуля администратора

3.2.2 Модуль тестирования

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

Модуль Аутентификации (Рисунок 3.9)

Рисунок 3.9 - Модуль Аутентификации Модуля тестирования

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

Модуль выбора теста для опроса (Рисунок 3.10)

Рисунок 3.10 - Модуль выбора теста Модуля тестирования

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

Модуль Опроса (Рисунок 3.11)

Рисунок 3.11 - Модуль опроса

В данном модуле, как видно из рисунка, пять этапов. Сперва мы получаем вопросы с сервера, затем тестируемый студент на них отвечает. Предусмотрена возможность пропускать вопросы и возвращаться к ним позже. Также есть возможность менять вариант ответа. Пункты 3, 4 и 5 выполняются по нажатию кнопки Выход. Сперва мы получаем ответы с сервера, затем сравниваем правильные ответы с ответами студента и записываем получение результаты сравнения на сервер. Здесь же высчитывается оценка, которую получил студент.

Модуль Результат (Рисунок 3.12)

Рисунок 3.12 - Модуль Результат Модуля тестирования

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

3.3 Разработка программного обеспечения


Модуль администратора нужен для занесения списка направления тестирования, предметов, вопросов по ним, просмотра оценок, создания отчётов, а так же для формирования списка студентов. Доступ к нему может быть только под учетной записью оператора базы данных, который обладает правами администратора. База данных Модуля администратора ведёт работу с таблицами: Subject (Предмет), Theme (Тема выбранного предмета) и Question (вопрос по дисциплине), Q_Illustration (Иллюстрации к вопросу), Answer (Ответы на вопрос), Test (Перечень всех опросов студентов), Student (Содержит всех студентов подлежащих опросу), User (Список пользователей которым доступны функции администрирования), Skin (Хранит обложки для программы). (Рисунок 3.13)

Рисунок 3.13 - Таблицы базы данных редактора опроса

Как видно из рисунка, целостность таблиц Subject и Theme поддерживается с помощью полей id_subject содержащихся в обоих таблицах, в таблицах Theme и Question с помощью полей id_theme, а в таблицах Question и Q_Illustration целостность потдерживается с помощью полей id_question PK - первичный ключ таблицы, FK фторичный ключ.

Таблицы Модуля тестирования представлены на рисунке 3.14.

Рисунок 3.14 - Таблицы базы данных Модуля тестирования

Как видно из рисунка основных таблиц всего 8, и 2 вспомогательных для хранения списка студентов и обложек. Первая содержит информацию о студенте: его имя, фамилию, номер группы и порядковый номер (всё, что нужно для авторизации). Вторая таблица отвечает за стили отображения кнопок, панелей, меню и прочих элементов программы. Порядковому номеру студента соответствует время, дата тестирования, а так же оценка которые запрашиваются у СУБД, тем самым обеспечивая точное время проведения опроса. Итак, мы определились со структурой программы и таблицами базы данных. По итогам исследовательского раздела, для создания базы данных я буду использовать MySQL Server и Delphi.

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

3.4 Разработка интерфейса пользователя


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

3.4.1 Разработка интерфейса Модуля администратора

Все пользовательские окна имеют минимальное количество окон для упрощения работы с программой. В модуле администратора работа с программой должна начинаться в главном меню, в котором пользователь при помощи вкладок выбирает, то ли ему создать новый тест, толи ему необходимо посмотреть результат, добавить или удалить пользователей, добавить или удалить студентов, толи напечатать результирующую ведомость. В дополнение ко всему есть возможность редактировать интерфейс программы путём применения различных "обложек”. Так как все функции описаны в разных модулях, то соответственно при выборе пользователем одного из действий загружается на исполнение нужный модуль. Данный редактор содержит несколько основных разделов: создание нового теста, просмотр результатов тестирования, вывод результатов.

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

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

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

 

3.4.2 Разработка интерфейса Модуля тестирования

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

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

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

Поскольку на каждую тему количество не закреплено жёстко, то при подсчёте студенту выводится 3 шкалы оценок: от 0 до 100, от 0 до 5 и от 2 до 5.

3.5 Разработка инструкции пользователя


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

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

Таким образом, в данном разделе я перечислил все составные части моей системы и алгоритм их взаимодействия.

4. Технологический раздел


4.1 Технология разработки элементов базы данных


Как уже говорилось выше, для написания дипломного проекта была использована система MySQL Server. Сейчас мы рассмотрим, как создавалась в этой системе база данных, которая ляжет в основу программы тестирования.

После регистрации сервера (его установка подробно описана в исследовательском разделе), для подключения к нему достаточно запустить MySQL Command Line Client. После чего необходимо ввести имя пользователя и пароль (те, которые были заданы при конфигурации сервера)

 

Рисунок 4.1 Программа Command Line Client

Программа Command Line Client (Рисунок 4.1) являтся довольно гибким и удобным приложением для администрирования СУБД MySQL и представляет собой консольное приложение.

4.1.1 Создание базы данных

Для создания новой базы данных пользователь должен иметь права администратора то есть обладать так называемыми root привилегиями.

Как и все операции проводимые с помощью программы Command Line Client операция создания базы данных происходит путём выполнения соответствующей команды.DATABASE [IF NOT EXISTS] db_name

Оператор CREATE DATABASE создает базу данных с указанным именем.

Для создания нужной нам базы данных команда будет выглядеть так:database spkvtk CHARACTER SET "utf8"; Стоит отметить что команду завершает '; ', это указывает СУБД что команда введена полностью и готова для исполнения.

В случае успешного выполнения сервер вернёт данные о времени выполнении команды, иначе выдаст ошибку. (Рисунок 4.2)

Рисунок 4.2 - Пример выполнения запросов

4.1.2 Создание таблиц базы данных

Для создания таблиц необходимо сначала открыть для использования только что созданную базу данных командой use spkvtk;

Затем выполнить команды для создания таблиц.

В общем виде создание таблицы выглядит следующим образом:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [ (create_definition,.)]

[table_options] [select_statement]

Например для таблицы Theme:

/*Таблица содержит перечень тем по мсем предметам*/table theme (_theme int auto_increment,_subject int not null,varchar (255) not null,tinyint default 5,mix_question boolean default true,longblob,key (id_theme),key (id_subject) references subject (id_subject) on delete cascade

);

Данная команда создаёт таблицу с именем theme, в которой содержится 6 полей, один первичный и один внешний ключ (для поддержания целостности). Наряду с этим у полей id_subject, theme задаётся атрибут not null. Это свидетельствует о том, что поля обязательны для заполнения. Так же стоит отметить, что атрибут default используется для заполнения значений полей по умолчанию.

Подобным образом создаются все остальные таблицы.

4.2 Технология разработки программных модулей


Вся оболочка базы данных была написана в Delphi с помощью компонентов для доступа к данным Zeos.

Сперва в служебный файл мы записываем имя пользователя и пароль, для доступа к данным. В unit authentication мы открываем этот файл, берем оттуда данные, заполняем свойства компонента доступа к данным, запускаем процедуру соединения с сервером. Если данные взятые из файла верны, то соединение с сервером будет установлено. Листинг данного модуля, как и всех остальных, приведен в Приложении А._main_manager - Главный модуль, в котором находится перечень большинства настроек и ссылок на другие модули.

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

В этом модуле берутся данные из модуля unit_main_manager о выбранной теме и предмете и выполняется редактирование и заполнение выбранных позиций.

Есть возможность загружать картинки как с жесткого диска, так и с любого другого носителя. В левом верхнем поле печатается вопрос. Если требуется, в левое нижнее поле вставляется иллюстрации или рисунок к вопросу. В правой части заполняются варианты ответа на вопрос. Тут же помечается правильный ответ. Стандартной группой кнопок можно создавать новый вопрос, удалять и редактировать уже созданный. Данные из заполненных полей записываются в таблицы на сервер. Правильные ответы также записываются на сервер. Работа с картинками ведется с помощью стандартных компонент Delphi.

unit_marks_option, unit_marks, unit_marks_subject,_marks_subject_theme, marks_subject_theme_group - Отчеты и оценки.

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

unit_dm - содержится в администраторе и в программе тестирования. Является не визуальным модулем. В нём сосредоточена вся логика работы с сервером баз данных. Данный модуль содержит набор компонентов для связи с БД, а также процедуры и функции для выполнения различных операций для работы с таблицами.

В unit_authentication и unit_start студент заполняет данные о себе (Фамилию, имя и номер группы. Как только данные заполнены и нажата кнопка далее данные посылаются на сервер, где идет проверка этих данных, если студент был зарегистрирован на сервере то процесс тестирования продолжается, иначе же студенту будет отказано в авторизации. Работа идет с таблицами базы данных spkvtk, находящейся на сервере. Доступ к данным, как и во всех остальных модулях, осуществляется с помощью компоненты Zeos.

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

После того, как тема выбран и нажата кнопка далее, начинает работать unit_inquirer. На экране появляются формы теста и студент начинает отвечать на вопросы, отмечая нужные ответы. Есть возможность пропускать вопрос с дальнейшей возможностью вернуться к нему. Также можно менять вариант ответа. Если тестируемый просмотрел все вопросы (даже не обязательно что он дал на них ответы), он нажимает кнопку выход после чего ответы студента отсылаются на сервер и начинается сравнивание ответов. Если ответ правильный, то к значению специально отведенной переменной прибавляется цена вопроса. Если все ответы правильные, то значение данной переменной будет равно 100. Критерии оценки также задаются в этом модуле. Далее происходит диверсификация результатов по 3 шкалам:

- 100

- 5

- 5

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

4.3 Технология разработки интерфейса пользователя


Все пользовательские окна и всю оболочку программы я создавал в Delphi, поэтому окна имеют стандартный оконный интерфейс системы MS Windows. В следствии чего пользователю будет легко привыкнуть к программе.

Модуль администратора выглядит следующим образом. При загрузке программы у нас появляется главное меню (Рисунок 4.13).

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

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

После выхода из главного меню Модуля администратора соединение с сервером у нас разрывается.

Модуль Тестирования выглядит следующим образом. На рисунке 4.10 представлено окно Аутентификации. Здесь всего три поля, в которые тестируемый студент должен занести свою фамилию, имя и номер группы. Для продолжения надо нажать кнопку Далее. Если по каким-либо причинам необходимо прервать тестирование. Нужно лишь закрыть окно.

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

В левой верхней части написан вопрос. Левое нижнее поле предназначено для картинок, которые могут содержаться в вопросе. В правой части расположены поля с вариантами ответов. Чтобы выбрать на ваш взгляд правильный, необходимо нажать на точечку или галочку (в зависимости от того сколько правильных вариантов ответа может быть у вопроса), слева от правильного варианта. Для перехода к следующему, предыдущему, первому или последнему вопросам есть группа кнопок слева. Также есть возможность перейти к какому-то определенному вопросу. После того, как будут стоять ответы на все вопросы, можно закончить тестирование, по нажатию которой проверяется правильность ответов, результаты отсылаются на сервер и записываются там в таблицу.

На последнем этапе на экране появляется окно с результатами тестирования

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

5. Расчет себестоимости


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

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

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

В зависимости от признака, положенного в основу группировки затрат, различают два вида их классификации, которые обуславливают два способа расчета себестоимости:

. по экономическим элементам затрат (смета затрат);

. по калькуляционным статьям расходов.

. При классификации затрат по экономическим элементам не имеет значение, где и с какой целью расходуется тот или иной вид ресурсов, важно лишь, чтобы затраты которые осуществляет предприятие, были однородны по экономическому содержанию. Например, затраты на оплату труда входят в один элемент, независимо оттого, кому они выплачиваются. Однородные по своему экономическому содержанию затраты и называются экономическими элементами* Себестоимость, рассчитанная по экономическим элементам затрат, определяет объем потребляемых ресурсов в целом, вне зависимости от конкретного вида продукции. Расходы по экономическим элементам включают:

. материальные расходы: сырье, материалы, комплектующие изделия, полуфабрикаты, топливо, энергия, вспомогательные материалы и т.д.

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

. амортизация: суммы начисленной амортизации по установленным нормам и амортизационным группам;

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

Технологическая себестоимость

Цеховые расходы



Цеховая себестоимость

Общезаводские расходы



Общезаводская себестоимость

Прочие производственные расходы


Производственная себестоимость

Внепроизводственные расходы

Рисунок 5.1 Последовательность формирования затрат по статьям калькуляции.

Для расчета себестоимости видеопродукции в дипломной работе используем метод по экономическим элементам затрат, то есть смету затрат.

Таблица 5.1 Смета затрат но экономическим элементам.

Наименование элементов затрат

Сумма (руб.)

1

Материальные расходы


2

Затраты на оплату труда


3

Единый социальный налог


4

Амортизация


5

Прочие расходы



Всего: в соответствии с данной таблицей необходимо рассчитать каждую статью сметы.

. Материальные расходы

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

= T x Тст (руб.), где

- зарплата или оплата труда за выполненную работу (руб.)- время, необходимое на весь процесс создания видеопродукции

включает подготовительный период, период съемки, монтажа другие

процессы (час).

Тст - часовая тарифная ставка.

= 2 месяца = 44 дня = 264 часа.

Тст = 50 р/час.

З = 264 * 50 = 13200 р.

. Расходы на оплату труда предполагают начисление единого социального налога (ECH) в размере 26% от зарплаты работника на формирование внебюджетных социальных фондов.

ЕСН = (11200 * 26%) / 100% = 3432 р.

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

рассчитываются по формуле:

А = С x а / 1 00% (руб.); где:

А - амортизационные отчисления (руб.);

С - стоимость оборудования и аппаратуры (руб.);

а - норма амортизации (%), которая по оборудованию: a = 10%;

= (16866р * 10%) / 100% = 1686.6р

Для расчета стоимости оборудования составляется таблица.

Таблица 5.2 Смета затрат на оборудование.

№ п. п.

Наименование оборудования

Стоимость единицы оборудования

Количество единиц оборудования (шт.)

Сумма затрат

1

Системный блок

1100

2

2200

Монитор

6330

2

12660

3

Свитч

1350

1

1350

4

Клавиатура

208

2

416

5

Мышь

120

2

240


Итог суммы затрат составит стоимость оборудования.

Всего 16866 р.

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

способом и составляют 30% от суммы статей 1 - 4 таблицы 1.

Прочие расходы - 10133.73.

Значения рассчитанных элементов расходов переносятся в таблицу 1. Для расчета себестоимости видеопродукции необходимо просуммировать статьи 1-5 таблицы 1.

Наименование элементов затрат

Сумма (руб.)

1

Материальные расходы

16866

2

Затраты на оплату труда

13200

3

Единый социальный налог

3432

4

Амортизация

1686.6

5

Прочие расходы

10555.38


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

6. Техника безопасности


6.1 Требования по охране труда в соответствии с инструкцией №32-04-Б

6.1.1 Требования безопасности перед началом работы

Перед началом работы необходимо:

·        осмотреть и привести в порядок рабочее место;

·        отрегулировать освещенность на рабочем месте, убедиться в достаточности освещенности, отсутствии отражений на экране, отсутствии встречного светового потока;

·        проверить правильность подключения оборудования в электросеть;

·        убедиться в наличии защитного заземления и подключения экранного проводника к корпусу процессора;

·        убедиться в отсутствии дискет в дисководах процессора персонального компьютера;

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

При включении компьютера необходимо соблюдать следующую последовательность включения оборудования:

·        включить блок питания;

·        включить периферийные устройства (принтер, монитор, сканер и дт.);

·        включить системный блок (процессор).

Запрещается приступать к работе при:

·        отключенном заземляющем проводнике защитного фильтра;

·        обнаружении неисправности оборудования;

·        отсутствии защитного заземления устройств ПЭВМ.

6.1.2 Требования безопасности во время работы

Во время работы необходимо:

·        в течение всего рабочего дня содержать в порядке и чистоте рабочее место;

·        держать открытыми все вентиляционные отверстия устройств;

·        при необходимости прекращения работы на некоторое время корректно закрыть все активные задачи;

·        во время перерыва в работе на компьютере отключить питание, если пользователь находится в непосредственной близости (менее 2 метров), в противном случае питание можно не отключать;

·        при работе с текстовой информацией выбирать наиболее физиологический режим представления черных символов на белом фоне;

·        соблюдать установленные режимом рабочего времени регламентированные перерывы в работе; технические перерывы необходимо проводить каждые 45 минут, длительность перерыва должна составлять не менее 5 − 15 минут в зависимости от напряженности рабочего графика;

·        соблюдать правила эксплуатации вычислительной техники в соответствии с инструкциями по эксплуатации;

·        соблюдать расстояние от глаз до экрана в пределах 60-80см;

·        при обнаружении технических неисправностей, которые могут привести к поражению электрическим током, работу немедленно прекратить, отключить ПЭВМ от электрической сети и вызвать обслуживающий технический персонал. До устранения неисправности работу не возобновлять.

Во время работы запрещается:

·        касаться одновременно экрана монитора и клавиатуры;

·        прикасаться к задней панели системного блока (процессора) при включенном питании;

·        загромождать верхние панели устройств бумагами и посторонними предметами;

·        переключать разъемы интерфейсных кабелей периферийных устройств при включенном питании;

·        допускать захламленность рабочего места бумагой в целях недопущения накапливания органической пыли;

·        производить отключение питания во время выполнения активной задачи;

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

·        вскрытие и ремонт оборудования производить самостоятельно;

·        превышать величину количества обрабатываемых символов свыше 30 000. за 4 часа работы.

6.1.3 Требования безопасности после окончания работы

По окончании работ необходимо соблюдать следующую последовательность выключения вычислительной техники:

·        произвести закрытие всех активных задач;

·        убедиться, что в дисководах нет дискет;

·        выключить питание системного блока (процессора);

·        выключить питание всех периферийных устройств;

·        отключить блок питания;

·        осмотреть и привести в порядок рабочее место.

6.2 Вредные факторы


В процессе работы с использованием ПЭВМ на работающих оказывают действие следующие опасные и вредные производственные физические, химические и психофизиологические факторы. Работнику необходимо быть ознакомленным с данными факторами.

6.2.1 Физические

·        повышенные уровни электромагнитного излучения;

·        повышенные уровни рентгеновского излучения,

·        повышенные уровни ультрафиолетового излучения,

·        повышенный уровень инфракрасного излучения,

·        повышенный уровень статического электричества,

·        повышенные уровни запыленности воздуха рабочей зоны,

·        повышенное содержание положительных аэроионов в воздухе рабочей зоны,

·        пониженное содержание отрицательных аэроионов в воздухе рабочей зоны,

·        пониженная или повышенная влажность воздуха рабочей зоны,

·        пониженная или повышенная подвижность воздуха рабочей зоны,

·        повышенный уровень прямой блесткости,

·        повышенный уровень ослепленности,

·        неравномерность распределения яркости в поле зрения,

·        повышенная яркость светового изображения,

·        повышенный уровень пульсации светового потока,

·        повышенное значение напряжения в электрической цепи, замыкание которой может произойти через тело человека.

6.2.2 Химические


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

6.2.3 Психофизиологические

·        напряжение зрения,

·        напряжение внимания, интеллектуальные нагрузки,

·        эмоциональные нагрузки,

·        длительные статические нагрузки,

·        монотонность труда,

·        большой объем информации, обрабатываемой в единицу времени,

·        нерациональная организация рабочего места; биологические:

·        повышенное содержание в воздухе рабочей зоны микроорганизмов.

Чем же вредны эти воздействия? Например, сильный шум вызывает трудности с распознанием цветовых сигналов, снижает быстроту восприятия цвета, остроту зрения, зрительную адаптацию, нарушает восприятие визуальной информации, уменьшает на 5 - 12 % производительность труда. Длительное воздействие шума с уровнем звукового давления 90 дБ снижает производительность труда на 30 - 60 %. Для устранения негативного влияния перечисленных факторов необходимо соблюдать как требования по условиям труда, так и требования по безопасности в аварийных ситуациях.

6.3 Требования по условиям труда


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

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

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

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

При размещении рабочих мест с ПЭВМ расстояние между рабочими столами с видеомониторами (в направлении тыла поверхности одного видеомонитора и экрана другого видеомонитора) должно быть не менее 2м, а расстояние между боковыми поверхностями видеомониторов − не менее 1,2м.

Рабочие места с ПЭВМ при выполнении творческой работы, требующей значительного умственного напряжения или высокой концентрации внимания, должны быть изолированы друг от друга перегородками высотой 1,5 − 2м.

Экран видеомонитора должен находиться от глаз пользователя на расстоянии 600 − 700мм, но не ближе 500мм с учетом размеров алфавитно-цифровых знаков и символов.

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

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

Лица, работающие с ПЭВМ более 50% рабочего времени (профессионально связанные с эксплуатацией ПЭВМ), должны проходить обязательный периодический мед. осмотр согласно приказа Минздравмедпрома от 14.03.96г. №90. Женщины со времени установления беременности должны переводиться на работы, не связанные с использованием ПЭВМ или для них должно ограничиваться время работы с ПЭВМ (не более 3-х часов за рабочую смену) при условии соблюдения установленных гигиенических требований. Немаловажное значение имеет правильная окраска помещений, особо лишенных естественного освещения и зрительной связи с внешней средой. Правильный выбор цвета компенсирует этот недостаток. Яркая окраска оживляет помещение и улучшает психологическое состояние человека. Необходимо учитывать, что цвет является сильным психологическим стимулятором:

1)   красный цвет увеличивает мускульное напряжение;

2)   оранжевый - стимулирует деятельность;

3)   желтый - стимулирует зрение и нервную систему;

4)   зеленый - успокаивает;

5)   голубой - ослабляет мускульное напряжение;

6)   фиолетовый - создает состояние спокойствия.

Наиболее предпочтительный - это зеленый цвет помещения, так как он успокаивающе действует на устающие в процессе работы органы зрения.

6.4 Требования безопасности в аварийных ситуациях в случае обнаружения аварийной ситуации


·        во всех случаях обнаружения обрыва проводов питания, неисправности заземления и других повреждений электрооборудования, появления запаха гари немедленно отключить питание и сообщить об аварийной ситуации руководителю и дежурному электромонтеру;

·        при обнаружении человека, попавшего под напряжение, немедленно освободить его от действия тока путем отключения электропитания и до прибытия врача оказать потерпевшему медицинскую помощь;

·        при любых случаях сбоя в работе технического оборудования программного обеспечения немедленно вызвать работника отдела программного обеспечения завода;

·        в случае появления рези в глазах, резком ухудшении видимости - невозможности сфокусировать взгляд или навести его на резкость, появлении боли в пальцах и кистях рук, усилении сердцебиения немедленно покинуть рабочее место, сообщить о происшедшем руководителю и обратиться к врачу;

·        при возгорании оборудования отключить питание и принять меры к тушению очага пожара имеющимися средствами пожаротушения, вызвать пожарную команду по телефону 01 и сообщить о происшедшем своему непосредственному руководителю;

·        при возникновении пожара в помещении, где установлены ПЭВМ, немедленно прекратить работы, обесточить ПЭВМ, окриком оповестить окружающих, сообщить в пожарную часть по тел.01, сообщить своему непосредственному руководителю о случившемся и приступить к тушению пожара имеющимися средствами пожаротушения. В дальнейшем выполнять все указания руководителя по ликвидации аварийной ситуации.

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

Заключение


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

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

Список используемых источников

1.       Delphi/ Под общ. ред. А.Д. Хомоненко. − СПб.: БХВ-Петербург, 2006. − 1216 с.

2.      Delphi 7: Учебный курс/ Бобровский С.И. - СПб: "Питер", 2005. − 736 с.

.        Введение в SQL для баз данных в архитектуре клиент/сервер/ Туманов В.Е., Гайфуллин Б.Н., Сгибнев В.Я. − М.: Интерфейс Пресс, 2000. − 188 стр.

.        Введение в системы баз данных (7-е издание) / Крис Дейт − М.: Вильямс, 2001. − 1072 с.

.        Основные концепции баз данных/ Фред Роланд − М.: Вильямс, 2002. − 256 с.

.        Рекомендации по подготовке и оформлению курсовых и дипломных работ. - 2 изд., переработанное и дополненное. / В.С. Голодаева. − М.: Издательско-торговая корпорация "Дашков и Кє", 2003. − 44 с.

.        Ингенкамп К. Педагогическая диагностика. - М.: Педагогика, 1991. - 240 c.;

.        Талызина Н.Ф. Методика составления обучающих программ. - М., 1980. - 46 с.

.        Шестоперов С.Б., Капелюш Г.С. Технико-экономическое обоснование дипломных проектов по созданию программных средств ВТ и информатики. Учебное пособие, М: МИП, 1993.

.        Калмыков Ю.В., Уроженке В.В. Структурный или объектно-ориентированный подход в программировании // М.: МИФИ, 2003.

.        В.В. Фаронов Delphi 5 Руководство программиста. // М.: "Нолидж", 2001.

.        Беспалько В.П. Педагогика и прогрессивные технологии обучения. - М.: 1995.

.        Камер Дуглас Э. Компьютерные сети и Internet. Разработка приложений для Internet: Пер. с англ. - М.: Изд. дом "Вильяме", 2002.

14.    Основы SQL Полякова Л.Н.  <http://www.intuit.ru/shop/search.xhtml?sea_author=%CF%EE%EB%FF%EA%EE%E2%E0+%CB.%CD.>

.        Издательство: Интернет-университет информационных технологий - ИНТУИТ. ру " <http://www.intuit.ru/shop/search.xhtml?sea_manufacturer=34941>, БИНОМ. Лаборатория знаний " <http://www.intuit.ru/shop/search.xhtml?sea_manufacturer=36050> Серия: Основы информационных технологий " <http://www.intuit.ru/shop/books/series/it-basics/> Год выпуска: 2007 Объем: 224 стр.

.        Основы проектирования приложений баз данных <http://www.intuit.ru/shop/books/departments/database/sqlserver2000/product.xhtml?id=2460100> Баженова И. Ю.

.        Издательство: Интернет-университет информационных технологий - ИНТУИТ. ру " <http://www.intuit.ru/shop/search.xhtml?sea_manufacturer=34941> Серия: Основы информационных технологий " <http://www.intuit.ru/shop/books/series/it-basics/> Год выпуска: 2006 Объем: 320 стр.

.        Базы данных в Delphi 7. Самоучитель. Понамарев В. А.

.        Википедия - свободная энциклопедия, создаваемая совместными усилиями добровольцев [Электронный реурс] − М., 2007. − www.ru. wikipedia.org <http://www.ru.wikipedia.org>

.        MSDN - http://msdn. microsoft.com/ <http://msdn.microsoft.com/>

.        Система тестирования knost http://www.scorp.ru/knost/kn_download. php? PHPSESSID=73f9bfa7aade1835d9c1738be3a73673 <http://www.scorp.ru/knost/kn_download.php?PHPSESSID=73f9bfa7aade1835d9c1738be3a73673>

.        <http://www.delphirus.com.ru>

.        <http://www.mysql.com/>

.        Интернет-Университет Информационных Технологий <http://www.INTUIT.ru>

.        <http://www.alphaskins.com/>

.        <http://www.interbase.ru/>

.        ГОСТ 12.1.005-88. Общие санитарно-гигиенические требования к воздуху рабочей зоны.

.        ГОСТ 12.2.032-78 ССТБ. Рабочее место при выполнении работ сидя.

.        ИНСТРУКЦИЯ № 32-04-Б по охране труда при работе на персональных электронно-вычислительных машинах (ПЭВМ) и видеодисплейных терминалах (ВДТ).

.        Межотраслевым правилам по охране труда (правилам безопасности) при эксплуатации электроустановок ПОТ Р М-016-2001 РД 153-34.0-03.150-00

.        Методические указания по выполнению раздела "Охрана труда" в дипломных проектах (спец.0102, 2201, 2202). Часть 1. - М.: МИП, 1998.

.        Рекомендации по организации выполнения и защиты выпускной квалификационной работы в Сергиево-Посадском киновидеотехническом колледже. − 2007. − 5 с.

.        СанПиН 2.2.2/2.4.1340-03 "Гигиенические требования к персональным электронно-вычислительным машинам и организации работы"

.        ТОИ Р 01-00-01-96 "Типовая инструкция по охране труда для операторов и пользователей персональных электронно-вычислительных машин (ПЭВМ) и работников, занятых эксплуатацией ПЭВМ и видеодисплейных терминалов (ВДТ)"

Приложения

Приложение А

 

Модуль администратора

unit unit_authentication;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, unit_dm, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, unit_main_manager,

 Buttons, sBitBtn, sLabel, sEdit, sGroupBox;

type

 Tauthentication = class(TForm)

   Bok: TsBitBtn;

   sGroupBox1: TsGroupBox;

   Euser: TsEdit;

   Epas: TsEdit;

   sLabel1: TsLabel;

   sLabel2: TsLabel;

   procedure BokClick(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 authentication: Tauthentication;

implementation

uses

 unit_start;

{$R *.dfm}

 

procedure Tauthentication.BokClick(Sender: TObject);

// клик на кнопке принять

begin

 if dm.log_in(euser.Text, epas.Text) then

   begin

     hide;

     main_manager.Show;

   end

 else

   begin

     euser.Clear;

     epas.Clear;

     ShowMessage('Неправильный пароль или имя пользователя');

   end;

end;

procedure Tauthentication.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 Form_Start.Close;

end;

procedure Tauthentication.FormShow(Sender: TObject);

begin

 dm.ConnectSPKVTK();

 dm.LoadSkinoutBD();

end;

end.

unit unit_edit_test;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Mask, DBCtrls, unit_dm, ExtCtrls, jpeg, Buttons, ComCtrls,

 Grids, DBGrids, JRCheckBox, JRDBCheckBoxMySQL, DB, DBTables, Menus, ActnPopup,

 ActnList, XPStyleActnCtrls, ActnMan, sEdit, sBitBtn, sDBRichEdit, sRichEdit,

 sSplitter, sRadioButton, sCheckBox, sPanel, sScrollBox, sGroupBox;

type

 TEdit_test = class(TForm)

   ReLoadAll: TsBitBtn;

   BoxAnswer: TsScrollBox;

   MenuAnswer: TPopupMenu;

   delete: TMenuItem;

   MainAnswer: TsGroupBox;

   QuestionText: TsDBRichEdit;

   BoxQuestionrNavigator: TsGroupBox;

   QCreate: TsBitBtn;

   ACreate: TsBitBtn;

   dbQGoToN: TsBitBtn;

   dbQPost: TsBitBtn;

   dbAReLoad: TsBitBtn;

   dbQCancel: TsBitBtn;

   N_Question: TsEdit;

   dbQPrior: TsBitBtn;

   dbQLasst: TsBitBtn;

   dbQNext: TsBitBtn;

   dbQFirst: TsBitBtn;

   QDelete: TsBitBtn;

   BoxMainIllustration: TsGroupBox;

   BoxIllustration: TsGroupBox;

   DBIllustrationText: TsDBRichEdit;

   BoxNavigationIllustration: TsGroupBox;

   mix_answer: TJRDBCheckBoxMySQL;

   only_one: TJRDBCheckBoxMySQL;

   mix_question: TJRDBCheckBoxMySQL;

   BoxIllustrationStreatch: TsGroupBox;

   propstr: TJRDBCheckBoxMySQL;

   Questionillustration: TImage;

   sSplitter1: TsSplitter;

   DeleteQIllustration: TsBitBtn;

   CreateQIllustration: TsBitBtn;

   SaveQIllustration: TsBitBtn;

   dbILast: TsBitBtn;

   dbINext: TsBitBtn;

   dbIPrior: TsBitBtn;

   dbIFirst: TsBitBtn;

   dbIGoToN: TsBitBtn;

   N_Illustration: TEdit;

   procedure deleteClick(Sender: TObject);

   procedure dbQCancelClick(Sender: TObject);

   procedure DeleteQIllustrationClick(Sender: TObject);

   procedure dbIGoToNClick(Sender: TObject);

   procedure dbILastClick(Sender: TObject);

   procedure dbINextClick(Sender: TObject);

   procedure dbIPriorClick(Sender: TObject);

   procedure dbIFirstClick(Sender: TObject);

   procedure QuestionillustrationClick(Sender: TObject);

   procedure SaveQIllustrationClick(Sender: TObject);

   procedure CreateQIllustrationClick(Sender: TObject);

   procedure dbQPostClick(Sender: TObject);

   procedure dbQGoToNClick(Sender: TObject);

   procedure dbQLasstClick(Sender: TObject);

   procedure dbQNextClick(Sender: TObject);

   procedure dbQPriorClick(Sender: TObject);

   procedure dbQFirstClick(Sender: TObject);

   procedure dbAReLoadClick(Sender: TObject);

   procedure ReLoadAllClick(Sender: TObject);

   procedure ACreateClick(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormDestroy(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure QCreateClick(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure QDeleteClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

   procedure InsertAnswer();//Вставка нового ответа

   procedure CreateList();//Создание переменных для хранения информации о динамечиске созданных элементвх

   procedure DestroyObject();//Уничтожение созданных объектов

   procedure LoadQuestion();//Получение списка вопросов по предметов

   procedure LoadAnswer();//Получение списка ответов по вопросу

   procedure CreateQuestion();//Создание нового вопроса

   procedure CreateAnswer();//Создание нового ответа

   procedure FreeListAnswer();//Уничтожение  переменных для хранения информации о динамечиске созданных элементвх

   procedure OpenIllustrationQuestion();//Открытие картинки для вопроса

   function OpenIllustrationAnswer(): string;//Открытие иллюстрации для ответа

   procedure ClickIllustrationAnswer(Sender: TObject);//Клик на картинке ответа

   procedure ClickRadioAnswer(Sender: TObject);//Клик на зависемом переключателе

   procedure ClikCheckAnswer(Sender: TObject);//Клик на независемом переключателе

   procedure ClikCheckPropStr(Sender: TObject);//Клик на переключателе пропстр

   procedure ClikTextAnswer(Sender: TObject);//Клик на тексте ответа

   procedure MouseDownAnswerText(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

   procedure SaveAnswer();//Сохранение ответов

   procedure Loadillustration();//Загрузка картинок вопроса из бд

   procedure Createillustration();//Создание картинки вопроса

   procedure ReLoadIllustration();// Отображение картинки

   procedure SaveillustrationQuestion();//Сохранение картинок

 

 end;

var

 Edit_test: TEdit_test;

 AnswerTop: integer;

 PanelList: TList;

 TextList: TList;

 SplitList: TList;

 ImageList: TList;

 CheckList: TLIst;

 CheckStretchList: TLIst;

 RadioList: TList;

 RadioIndex: array[0..1000] of integer;

 CheckIndex: array[0..1000] of integer;

 CheckStretchIndex: array[0..1000] of integer;

 TextIndex: array[0..1000] of integer;

 IllustrationIndex: array[0..1000] of integer;

 SenderRich: TObject;

implementation

{$R *.dfm}

uses


procedure TEdit_test.ACreateClick(Sender: TObject);

begin

 dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

 CreateAnswer();

 dm.Load_Answer;

 LoadAnswer();

end;

procedure TEdit_test.QCreateClick(Sender: TObject);

begin

 CreateQuestion();

 dbQLasst.Click;

 ACreate.Click;

 LoadQuestion();

end;

procedure TEdit_test.QDeleteClick(Sender: TObject);

begin

 dm.Query_Question.Delete;

 dm.Load_Answer;

 LoadAnswer();

end;

procedure TEdit_test.QuestionillustrationClick(Sender: TObject);

begin

 OpenIllustrationQuestion();

end;

procedure TEdit_test.dbINextClick(Sender: TObject);

begin

 dm.Query_Illustration.Next;

 ReLoadIllustration();

end;

procedure TEdit_test.dbIPriorClick(Sender: TObject);

begin

 dm.Query_Illustration.Prior;

 ReLoadIllustration();

end;

procedure TEdit_test.ClickIllustrationAnswer;

//обработчик клика на картинке ответа

var

 FileName: String;

begin

 FileName := OpenIllustrationAnswer();

 if not (FileName <> '') then

   exit;

 TImage(Sender).Picture.LoadFromFile(FileName);

end;

procedure TEdit_test.ClickRadioAnswer(Sender: TObject);

//клик на зависемом переключателе ответа

var

 ID: integer;

 ID_ND: integer;

 index: integer;

 Checked: Char;

begin

 ID_ND := RadioIndex[TsRadioButton(Sender).Tag];

 index := 0;

 while index < 100 do

   begin

     try

       ID := RadioIndex[TsRadioButton(RadioList.Items[index]).Tag];

       Checked := '0';

       if ID = ID_ND then

       begin

         TsRadioButton(RadioList.Items[index]).Checked := True;

         With dm.Query_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE Answer ') ;

             SQL.Add('SET correct = 1');

             SQL.Add('WHERE id_answer =' + IntToStr(ID));

             Active := true;

           end;

       end

       else

       begin

         TsRadioButton(RadioList.Items[index]).Checked := False;

         With dm.Query_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE Answer ') ;

             SQL.Add('SET correct = 0');

             SQL.Add('WHERE id_answer =' + IntToStr(ID));

             Active := true;

           end;

       end;

     except

       ;

     end;

     inc(index);

   end;

end;

procedure TEdit_test.ClikCheckAnswer(Sender: TObject);

//клик на независемом переключателе ответа

var

 ID: integer;

 ID_ND: integer;

 index: integer;

 Checked: Char;

begin

 ID_ND := CheckIndex[TsCheckBox(Sender).Tag];

 index := 0;

 while index < 100 do

   begin

     try

       ID := CheckIndex[TsCheckBox(CheckList.Items[index]).Tag];

       if ID = ID_ND then

       begin

         if TsCheckBox(CheckList.Items[index]).Checked = True then

           Checked := '1'

         else

           Checked := '0';

         With dm.Query_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE Answer ') ;

             SQL.Add('SET correct = ' + Checked);

             SQL.Add('WHERE id_answer =' + IntToStr(ID));

             Active := true;

           end;

       end;

     except

       ;

     end;

     inc(index);

   end;

end;

procedure TEdit_test.ClikCheckPropStr(Sender: TObject);

//Клик на PropStr ответа

var

 ID: integer;

 ID_ND: integer;

 index: integer;

 Checked: Char;

begin

 ID_ND := CheckStretchIndex[TsCheckBox(Sender).Tag];

 index := 0;

 while index < 100 do

   begin

     try

       ID := CheckStretchIndex[TsCheckBox(CheckList.Items[index]).Tag];

       if ID = ID_ND then

       begin

         if TsCheckBox(CheckStretchList.Items[index]).Checked = True then

           Checked := '1'

         else

           Checked := '0';

         With dm.Query_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE Answer ') ;

             SQL.Add('SET propstr = ' + Checked);

             SQL.Add('WHERE id_answer =' + IntToStr(ID));

             Active := true;

           end;

       end;

     except

       ;

     end;

     inc(index);

   end;

end;

procedure TEdit_test.ClikTextAnswer(Sender: TObject);

//клик на поле ткста ответа

begin

 SenderRich := Sender;

end;

procedure TEdit_test.CreateAnswer;

//создание нового ответа

begin

 try

   dm.Create_Answer_New(dm.Last_Selected.id_question);

 except

   ;

 end;

end;

procedure TEdit_test.Createillustration;

begin

 dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

 dm.Create_Illustration_New(dm.Last_Selected.id_question);

 dm.Load_Illustration();

end;

procedure TEdit_test.CreateList;

begin

 // Создание контейнеров Tlist для нумерации компонентов

 TextList := TList.Create;

 PanelList := TList.Create;

 SplitList := TList.Create;

 ImageList := TList.Create;

 CheckList := TLIst.Create;

 CheckStretchList := TLIst.Create;

 RadioList := TList.Create;

end;

procedure TEdit_test.CreateQuestion;

begin

 try

   dm.Create_Question_New(dm.Last_Selected.id_theme);

   dm.Load_Question();

 except

   ;

 end;

end;

procedure TEdit_test.CreateQIllustrationClick(Sender: TObject);

begin

 Createillustration();

 dm.Query_Illustration.Last;

 ReLoadIllustration();

 OpenIllustrationQuestion();

end;

procedure TEdit_test.DeleteQIllustrationClick(Sender: TObject);

begin

   dm.Query_Illustration.Delete;

   ReLoadIllustration();

end;

procedure TEdit_test.DestroyObject;

begin

 FreeListAnswer();

end;

procedure TEdit_test.dbQCancelClick(Sender: TObject);

begin

 try

   dm.Query_Question.Cancel;

 except

   ;

 end;

 SaveAnswer();

 LoadQuestion();

end;

procedure TEdit_test.dbQFirstClick(Sender: TObject);

//переход на первый вопрос

begin

 dm.Query_Question.First;

 LoadQuestion();

 LoadAnswer

end;

procedure TEdit_test.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 main_manager.Show;

end;

procedure TEdit_test.FormCreate(Sender: TObject);

begin

 CreateList();

 AnswerTop := 15;

end;

procedure TEdit_test.FormDestroy(Sender: TObject);

begin

 DestroyObject();

end;

procedure TEdit_test.FormShow(Sender: TObject);

begin

 dm.Load_Question();

 dm.Query_Question.First;

 LoadQuestion();

 dm.Query_Illustration.First;

 ReLoadIllustration();

 MainAnswer.Width := Round(edit_test.Width * 0.4);

 BoxMainIllustration.Height := Round(edit_test.Height * 0.3);

end;

procedure TEdit_test.FreeListAnswer;

var

 index: integer;

begin

 // Уничтожаем текст

 index := 0;

 try

   while true do

     begin

       TRichEdit(TextList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем картинки

 index := 0;

 try

   while true do

     begin

       TImage(ImageList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем сплиты

 index := 0;

 try

   while true do

     begin

       TSplitter(SplitList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем радиобт

 index := 0;

 try

   while true do

     begin

       TRadioButton(RadioList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем чекеты

 index := 0;

 try

   while true do

     begin

       TCheckBox(CheckList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем чекеты stretch / proportional

 index := 0;

 try

   while true do

     begin

       TCheckBox(CheckStretchList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем панели ответов

 index := 0;

 try

   while true do

     begin

       TPanel(PanelList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // чистим листы ..

 try

   TextList.Clear;

   PanelList.Clear;

   SplitList.Clear;

   ImageList.Clear;

   CheckList.Clear;

   CheckStretchList.Clear;

   RadioList.Clear;

   TextList.Free;

   SplitList.Free;

   ImageList.Free;

   CheckList.Free;

   CheckStretchList.Free;

   RadioList.Free;

 except

   ;

 end;

end;

procedure TEdit_test.dbQGoToNClick(Sender: TObject);

//переход на первый вопрос

begin

 dm.Query_Question.RecNo := StrToInt(N_Question.Text);

 LoadQuestion();

end;

procedure TEdit_test.InsertAnswer;

// вырисовка...

var

 AnswerText: TRichEdit;

 AnswerPanel: TsPanel;

 AnswerCheck: TsCheckBox;

 AnswerCheckStretch: TsCheckBox;

 AnswerRadio: TsRadioButton;

 AnswerImage: TImage;

 AnswerSplitTop,

 AnswerSplitBottom,

 AnswerSplitRight,

 AnswerSplitLeft: TsSplitter;

 AnswerSplitBottomPole,

 AnswerSplitLeftPole: TsSplitter;

 PictureStream: TStream;

begin

 //Создаю панель ответа

 AnswerPanel := TsPanel.Create(BoxAnswer);

 AnswerPanel.Top := AnswerTop;

 AnswerPanel.Height := Round((BoxAnswer.Height * 40)/100);

 AnswerPanel.Width := BoxAnswer.Width - 25;

 AnswerPanel.Left := 5;

 AnswerPanel.BorderStyle := bsSingle;

 AnswerPanel.BorderWidth := 5;

 AnswerPanel.Color := clSilver;

 AnswerPanel.Tag := PanelList.Add(AnswerPanel);

 BoxAnswer.InsertControl(AnswerPanel);

   begin

     AnswerImage := TImage.Create(AnswerPanel);

     AnswerImage.Align := alBottom;

     AnswerImage.Height := Round(AnswerPanel.Height / 2 - 6);

     AnswerImage.Picture.Assign(dm.Query_Answer.FieldByName('illustration'));

     if dm.Query_Answer.FieldByName('propstr').AsInteger = 1 then

       begin

         AnswerImage.Proportional := true;

         AnswerImage.Stretch := true;

       end

     else

       begin

         AnswerImage.Proportional := false;

         AnswerImage.Stretch := true;

       end;

     AnswerImage.OnClick := ClickIllustrationAnswer;

     AnswerImage.Tag := ImageList.Add(AnswerImage);

     IllustrationIndex[AnswerImage.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerImage);

   end;

 //Создаю нижний сплит поля

 AnswerSplitBottomPole := TsSplitter.Create(AnswerPanel);

 AnswerSplitBottomPole.Height := 5;

 AnswerSplitBottomPole.Width := 5;

 AnswerSplitBottomPole.Align := alBottom;

 AnswerSplitBottomPole.Tag := SplitList.Add(AnswerSplitBottomPole);

 AnswerPanel.InsertControl(AnswerSplitBottomPole);

 if only_one.Checked then

   begin

     //Создаю зависемый переключатель

     AnswerRadio := TsRAdioButton.Create(AnswerPanel);

     AnswerRadio.Width := 13 ;

     AnswerRadio.Align := alLeft ;

     AnswerRadio.Tag := RadioList.Add(AnswerRadio);

     if dm.Query_Answer.FieldByName('correct').AsInteger = 1 then

       begin

         AnswerRadio.Checked := true;

       end

     else

       begin

         AnswerRadio.Checked := false;

       end;

     AnswerRadio.OnClick := ClickRadioAnswer;

     RadioIndex[AnswerRadio.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerRadio);

   end

 else

   begin

     //Создаю независемый переключатель

     AnswerCheck := TsCheckBox.Create(AnswerPanel);

     AnswerCheck.Width := 13 ;

     AnswerCheck.Align := alLeft ;

     if dm.Query_Answer.FieldByName('correct').AsInteger = 1 then

       begin

         AnswerCheck.Checked := true;

       end

     else

       begin

         AnswerCheck.Checked := false;

       end;

     AnswerCheck.OnClick := ClikCheckAnswer;

     AnswerCheck.Tag := CheckList.Add(AnswerCheck);

     CheckIndex[AnswerCheck.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerCheck);

   end;

 //Создаю левый сплит

 AnswerSplitLeft := TsSplitter.Create(AnswerPanel);

 AnswerSplitLeft.Height := 5;

 AnswerSplitLeft.Width := 5;

 AnswerSplitLeft.Align := alLeft;

 AnswerSplitLeft.Visible := false;

 AnswerSplitLeft.Tag := SplitList.Add(AnswerSplitLeft);

 AnswerPanel.InsertControl(AnswerSplitLeft);

 //создаю переключатель stretch / proportional

 AnswerCheckStretch := TsCheckBox.Create(AnswerPanel);

 AnswerCheckStretch.Width := 13 ;

 AnswerCheckStretch.Align := alBottom ;

 if dm.Query_Answer.FieldByName('propstr').AsInteger = 1 then

   begin

     AnswerCheckStretch.Checked := true;

   end

 else

   begin

     AnswerCheckStretch.Checked := false;

   end;

   AnswerCheckStretch.OnClick := ClikCheckPropStr;

 AnswerCheckStretch.Tag := CheckStretchList.Add(AnswerCheckStretch);

 CheckStretchIndex[AnswerCheckStretch.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

 AnswerPanel.InsertControl(AnswerCheckStretch);

 //Создаю поле ответа

 AnswerText := TRichEdit.Create(AnswerPanel);

 AnswerText.Align := alClient;

 AnswerText.BorderStyle := bsSingle;

 AnswerText.BorderWidth := 5;

 AnswerText.ScrollBars := ssVertical;

 AnswerText.PopupMenu := MenuAnswer;

 AnswerText.OnClick := ClikTextAnswer;

 AnswerText.OnMouseDown := MouseDownAnswerText;

 AnswerText.Tag := TextList.Add(AnswerText);

 TextIndex[AnswerText.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

 AnswerPanel.InsertControl(AnswerText);

 AnswerText.Text := dm.Query_Answer.FieldByName('answer').AsString;

 AnswerTop := AnswerTop + Answerpanel.Height + 10;

end;

procedure TEdit_test.dbQLasstClick(Sender: TObject);

//переход на последний вопрос

begin

 dm.Query_Question.Last;

 LoadQuestion();

end;

procedure TEdit_test.LoadAnswer;

//прорисовываем ответы на форме

begin

 FreeListAnswer();

 CreateList();

 AnswerTop := 10;

 dm.Query_Answer.First;

 while not dm.Query_Answer.Eof do

   begin

     InsertAnswer();

     dm.Query_Answer.Next;

   end;

end;

procedure TEdit_test.Loadillustration;

begin

   dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

   dm.Load_Illustration;

   dm.Query_Illustration.First;

   ReLoadIllustration();

end;

procedure TEdit_test.LoadQuestion;

//загрузка данных вопроса

begin

 try

   Questionillustration.Stretch := propstr.Checked;

 except

   ;

 end;

 dm.Load_Answer();

 dm.Query_Answer.First;

 LoadAnswer();

 loadIllustration();

end;

procedure TEdit_test.MouseDownAnswerText(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

//Нажатие клавиши мыши в поле ответа

begin

 SenderRich := Sender;

end;

procedure TEdit_test.dbAReLoadClick(Sender: TObject);

begin

 dm.Load_Question();

 dm.Load_Answer();

 LoadQuestion();

 LoadAnswer();

end;

procedure TEdit_test.dbIFirstClick(Sender: TObject);

begin

 dm.Query_Illustration.First;

 ReLoadIllustration();

end;

procedure TEdit_test.dbIGoToNClick(Sender: TObject);

begin

 dm.Query_Illustration.RecNo := StrToInt(N_illustration.Text);

 ReLoadIllustration();

end;

procedure TEdit_test.dbILastClick(Sender: TObject);

begin

dm.Query_Illustration.Last;();

end;

procedure TEdit_test.ReLoadAllClick(Sender: TObject);

begin

 dm.Load_Question();

 LoadQuestion();

 LoadAnswer()

end;

procedure TEdit_test.ReLoadIllustration;

begin

 QuestionIllustration.Picture := nil;

 QuestionIllustration.Picture.Assign(dm.Query_Illustration.FieldByName('illustration'));

 QuestionIllustration.Stretch := true;

 QuestionIllustration.Proportional := propstr.Checked;

end;

procedure TEdit_test.dbQNextClick(Sender: TObject);

//переход на следующий вопрос

begin

 dm.Query_Question.Next;

 LoadQuestion();

end;

function TEdit_test.OpenIllustrationAnswer;

//открытие иллюстрации на ответ

begin

 openillustrationAnswer := '';

 if not dm.OPD.Execute then

   exit;

 OpenIllustrationAnswer := dm.OPD.FileName;

end;

procedure TEdit_test.OpenIllustrationQuestion();

begin

 if not dm.OPD.Execute then

   begin

     exit;

   end;

 try

   QuestionIllustration.Picture.LoadFromFile(dm.opd.FileName);

 except

   ;

 end;

end;

procedure TEdit_test.dbQPostClick(Sender: TObject);

begin

 try

   dm.Query_Question.Post;

 except

   ;

 end;

 SaveAnswer();

 LoadQuestion();

end;

procedure TEdit_test.dbQPriorClick(Sender: TObject);

//переход на предидущий вопрос

begin

 dm.Query_Question.Prior;

 LoadQuestion();

end;

procedure TEdit_test.deleteClick(Sender: TObject);

var

 ID: integer;

begin

 try

   ID := TextIndex[TsRichEdit(SenderRich).Tag];

     With dm.Query_Delete do

       begin

         Active := false;

         SQL.Clear;

         SQL.Add('DELETE FROM answer ') ;

         SQL.Add('WHERE id_answer =' + IntToStr(ID));

         Active := true;

       end;

   except

     LoadQuestion();

   end;

end;

procedure TEdit_test.SaveAnswer;

var

 index: integer;

 ID: integer;

 Checked: string;

 bs: TBlobStream;

begin

 // Сохраняем текст

 index := 0;

 while index < 100 do

   begin

     try

       ID := TextIndex[TsRichEdit(TextList.Items[index]).Tag];

       bs := nil;

       With dm.Query_Answer do

         begin

           Active := false;

           SQL.Clear;

           SQL.Add('SELECT * FROM answer ') ;

           SQL.Add('WHERE id_answer =' + IntToStr(ID));

           Active := true;

           First;

           TsRichEdit(TextList.Items[index]).PlainText := false;

           Edit;

           dm.Query_Answer.FieldByName('answer').Assign(TsRichEdit(TextList.Items[index]).Lines);

           Post;

         end;

     except

       ;

     end;

     inc(index);

   end;

 // Сохраняем картинки

 index := 0;

 while index < 100 do

   begin

     try

       ID := IllustrationIndex[TImage(ImageList.Items[index]).Tag];

       bs := nil;

       With dm.Query_Answer do

         begin

           Active := false;

           SQL.Clear;

           SQL.Add('SELECT * FROM answer ') ;

           SQL.Add('WHERE ' + 'id_answer = ' + IntToStr(ID));

           Active := true;

           First;

           Edit;

           FieldByName('illustration').Assign(TImage(ImageList.Items[index]).Picture);

           Post;

         end;

     except

       ;

     end;

     inc(index);

   end;

 //Сохраняем радиобт

 index := 0;

 while index < 100 do

   begin

     try

       ID := RadioIndex[TsRadioButton(RadioList.Items[index]).Tag];

       if TRadioButton(RadioList.Items[index]).Checked then

         begin

         end

       else

         begin

           Checked := '0';

         end;

       With dm.Query_Answer do

         begin

           Active := false;

           SQL.Clear;

           SQL.Add('UPDATE Answer ') ;

           SQL.Add('SET correct = ' + Checked);

           SQL.Add('WHERE id_answer =' + IntToStr(ID));

           Active := true;

         end;

     except

       ;

     end;

     inc(index);

   end;

 // Сохраняем чекеты

 index := 0;

 while index < 100 do

   begin

     try

       ID := CheckIndex[TsCheckBox(CheckList.Items[index]).Tag];

       if TCheckBox(CheckList.Items[index]).Checked then

         begin

           Checked := '1';

         end

       else

         begin

           Checked := '0';

         end;

       With dm.Query_Answer do

         begin

           Active := false;

           SQL.Clear;

           SQL.Add('UPDATE Answer ') ;

           SQL.Add('SET correct = ' + Checked);

           SQL.Add('WHERE id_answer =' + IntToStr(ID));

           Active := true;

         end;

     except

       ;

     end;

     inc(index);

   end;

 // Сохраняем чекеты stretch / proportional

 index := 0;

 while index < 100 do

   begin

     try

       ID := CheckStretchIndex[TsCheckBox(CheckStretchList.Items[index]).Tag];

       if TCheckBox(CheckStretchList.Items[index]).Checked then

         begin

           Checked := '1';

         end

       else

         begin

           Checked := '0';

         end;

       With dm.Query_Answer do

         begin

           Active := false;

           SQL.Clear;

           SQL.Add('UPDATE Answer ') ;

           SQL.Add('SET propstr = ' + Checked);

           SQL.Add('WHERE id_answer =' + IntToStr(ID));

           Active := true;

         end;

     except

       ;

     end;

     inc(index);

   end;

end;

procedure TEdit_test.SaveillustrationQuestion;

begin

 try

   dm.Query_Illustration.Post;

 except;

   ;

 end;

 dm.Query_Illustration.Edit;

 dm.Query_Illustration.FieldByName('illustration').Assign(Questionillustration.Picture);

 dm.Query_Illustration.Post;

end;

procedure TEdit_test.SaveQIllustrationClick(Sender: TObject);

begin

 SaveillustrationQuestion();

end;

end.

unit unit_main_manager;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Tabs, StdCtrls, DBCtrls, ComCtrls, unit_dm, ExtCtrls, Grids, DBGrids,

 Mask, Buttons, sPanel, sDBNavigator, sDBEdit, sLabel, sDBRichEdit, sGroupBox,

 sBitBtn, sPageControl, sDBComboBox, FileCtrl, sCheckBox, sRadioButton,

 acProgressBar, sTrackBar, sButton, sGauge, DB, sComboBox, sUpDown, sBevel,

 sSpeedButton, sEdit, DBTables,

 ImgList, Provider, DBClient, JRCheckBox, JRDBCheckBoxMySQL;

type

 Tmain_manager = class(TForm)

   PageAdministration: TsPageControl;

   opros: TsTabSheet;

   tuser: TsTabSheet;

   subject: TsGroupBox;

   Grid_Subject: TDBGrid;

   DBInfo_Subject: TsDBRichEdit;

   Create_Subject: TsBitBtn;

   Navigator_Subject: TsDBNavigator;

   theme: TsGroupBox;

   Grid_Theme: TDBGrid;

   DBInfo_Theme: TsDBRichEdit;

   Navigator_Theme: TsDBNavigator;

   Create_Theme: TsBitBtn;

   sGroupBox1: TsGroupBox;

   sLabel1: TsLabel;

   sLabel2: TsLabel;

   DBEsubject: TsDBEdit;

   DBEtheme: TsDBEdit;

   BtnQuestion: TsBitBtn;

   StydentGrid: TDBGrid;

   StydentNavigator: TsDBNavigator;

   sGroupBox2: TsGroupBox;

   sLabel3: TsLabel;

   sLabel4: TsLabel;

   sLabel5: TsLabel;

   sLabel6: TsLabel;

   sLabel7: TsLabel;

   sLabel8: TsLabel;

   ulogin: TsDBEdit;

   upassword: TsDBEdit;

   usname: TsDBEdit;

   uname: TsDBEdit;

   upatronymic: TsDBEdit;

   uaccessbox: TsDBComboBox;

   UReLoad: TsBitBtn;

   panelstydent: TsTabSheet;

   DBGrid2: TDBGrid;

   sDBNavigator1: TsDBNavigator;

   sGroupBox3: TsGroupBox;

   sLabel11: TsLabel;

   sLabel12: TsLabel;

   sLabel13: TsLabel;

   stsname: TsDBEdit;

   stname: TsDBEdit;

   stgroup: TsDBEdit;

   stReload: TsBitBtn;

   stCreate: TsBitBtn;

   stDelete: TsBitBtn;

   stSave: TsBitBtn;

   stCancel: TsBitBtn;

   uCreate: TsBitBtn;

   uDelete: TsBitBtn;

   uSave: TsBitBtn;

   uCancel: TsBitBtn;

   Skin: TsTabSheet;

   Progr2: TsGauge;

   BtnOpen: TsBitBtn;

   LoadOutBD: TsBitBtn;

   sDBNavigator2: TsDBNavigator;

   DBGrid3: TDBGrid;

   LoadInBD: TsBitBtn;

   BtnDelete: TsButton;

   sRadioGroup1: TsRadioGroup;

   Progr3: TsTrackBar;

   Progr1: TsProgressBar;

   sPanel1: TsPanel;

   sRadioButton1: TsRadioButton;

   sRadioButton2: TsRadioButton;

   sCheckBox1: TsCheckBox;

   sDBRichEdit1: TsDBRichEdit;

   ApplyOutBD: TsBitBtn;

   BtnSetSkin: TsBitBtn;

   sLabel9: TsLabel;

   sEdit1: TsEdit;

   sButton1: TsButton;

   sSpeedButton1: TsSpeedButton;

   sBevel1: TsBevel;

   sUpDown1: TsUpDown;

   sComboBox1: TsComboBox;

   BtnCancel: TsBitBtn;

   BtnBetta: TsBitBtn;

   Mark: TsTabSheet;

   Btn_Subject: TsBitBtn;

   Btn_Subject_Theme: TsBitBtn;

   Btn_Subject_Theme_group: TsBitBtn;

   BtnAll: TsBitBtn;

   BoxAccessSubject: TJRDBCheckBoxMySQL;

   BoxAccessTheme: TJRDBCheckBoxMySQL;

   procedure Grid_SubjectKeyPress(Sender: TObject; var Key: Char);

   procedure Grid_SubjectColExit(Sender: TObject);

   procedure Grid_SubjectCellClick(Column: TColumn);

   procedure Grid_SubjectDrawColumnCell(Sender: TObject; const Rect: TRect;

     DataCol: Integer; Column: TColumn; State: TGridDrawState);

   procedure uCancelClick(Sender: TObject);

   procedure uSaveClick(Sender: TObject);

   procedure uDeleteClick(Sender: TObject);

   procedure uCreateClick(Sender: TObject);

   procedure stCancelClick(Sender: TObject);

   procedure stSaveClick(Sender: TObject);

   procedure stDeleteClick(Sender: TObject);

   procedure stCreateClick(Sender: TObject);

   procedure stReloadClick(Sender: TObject);

   procedure UReLoadClick(Sender: TObject);

   procedure BtnQuestionClick(Sender: TObject);

   procedure Create_ThemeClick(Sender: TObject);

   procedure Navigator_SubjectClick(Sender: TObject; Button: TNavigateBtn);

   procedure Grid_SubjectMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure Create_SubjectClick(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure BtnOpenClick(Sender: TObject);

   procedure LoadInBDClick(Sender: TObject);

   procedure BtnDeleteClick(Sender: TObject);

   procedure ApplyOutBDClick(Sender: TObject);

   procedure LoadOutBDClick(Sender: TObject);

   procedure BtnSetSkinClick(Sender: TObject);

   procedure SkinShow(Sender: TObject);

   procedure Progr3Change(Sender: TObject);

   procedure BtnCancelClick(Sender: TObject);

   procedure BtnBettaClick(Sender: TObject);

   procedure Btn_SubjectClick(Sender: TObject);

   procedure Btn_Subject_ThemeClick(Sender: TObject);

   procedure Btn_Subject_Theme_groupClick(Sender: TObject);

   procedure BtnAllClick(Sender: TObject);

   procedure Grid_ThemeKeyPress(Sender: TObject; var Key: Char);

   procedure Grid_ThemeCellClick(Column: TColumn);

   procedure Grid_ThemeColExit(Sender: TObject);

   procedure Grid_ThemeDrawColumnCell(Sender: TObject; const Rect: TRect;

     DataCol: Integer; Column: TColumn; State: TGridDrawState);

 private

   { Private declarations }

 public

   { Public declarations }

   procedure LoadSkin(FileName: String);//Загрузка в БД

   function SaveSkin(Path: String): String;//Сохранение скина на диск

   procedure ApplySkin(FileName: String);//Применяет скин

 end;

var

 main_manager: Tmain_manager;

implementation

unit_edit_test, unit_betta, unit_marks_subject_theme,

 unit_marks_subject, unit_marks_subject_theme_group, unit_marks,

 unit_mark_option;

{$R *.dfm}

 

procedure Tmain_manager.ApplyOutBDClick(Sender: TObject);

var

 Path: String;

begin

 Path := ExtractFilePath(ParamStr(0)) + 'temp\';

 ApplySkin(SaveSkin(Path));

end;

procedure Tmain_manager.ApplySkin(FileName: String);

var

 Fname: String;

 I: Integer;

 Name: String;

 Path: String;

begin

 if FileExists( FileName ) then

  begin

     Path := ExtractFilePath(FileName);

     Name := ExtractFileName(FileName);

     Delete( Name, LastDelimiter( '.', Name ), Length( Name ) );

  end

  else

     Name := '';

 dm.SkinManager.SkinDirectory := Path;

 dm.SkinManager.SkinName := Name;

 dm.SkinManager.Active := true;

end;

procedure Tmain_manager.BtnAllClick(Sender: TObject);

begin

 Form_mark_option.Show;

 Form_mark_option.Form_index := 0;

 Hide;

end;

procedure Tmain_manager.BtnBettaClick(Sender: TObject);

begin

 FrmBetta.Show;

end;

procedure Tmain_manager.BtnCancelClick(Sender: TObject);

begin

 dm.SetAllSkinPriority('null');

 dm.SkinManager.Active := false;

end;

procedure Tmain_manager.BtnDeleteClick(Sender: TObject);

begin

 dm.Query_Skin.Delete;

end;

procedure Tmain_manager.BtnOpenClick(Sender: TObject);

begin

 if not dm.OD.Execute then exit;

 ApplySkin(dm.OD.FileName);

end;

procedure Tmain_manager.BtnQuestionClick(Sender: TObject);

begin

 dm.Last_Selected.id_subject := dm.Query_Subject.FieldByName('id_subject').AsInteger;

 dm.Last_Selected.id_theme := dm.Query_Theme.FieldByName('id_theme').AsInteger;

 main_manager.Hide;

 edit_test.Show;

end;

procedure Tmain_manager.BtnSetSkinClick(Sender: TObject);

var

 id_skin: integer;

begin

 ApplyOutBD.OnClick(Sender);

 id_skin := dm.Query_Skin.FieldByName('id_skin').AsInteger;

 dm.SetAllSkinPriority('0');

 dm.SetSkinPriority('100', id_skin);

 dm.Load_Query_Skin;

end;

procedure Tmain_manager.Button1Click(Sender: TObject);

begin

;

//Создание нового предмета

procedure Tmain_manager.Create_SubjectClick(Sender: TObject);

var

 Subject_New: String;

begin

 Subject_New := InputBox('Создание нового предмета',

                         'Введите название создаваемого предмета',

                         '<<< Новый предмет >>>');

 if Subject_New <> '<<< Новый предмет >>>' then

   begin

     try

       dm.Create_Subject_New(subject_New);

     except

     ;

     end;

     dm.Query_Subject_Set;

     dm.Query_Theme_Set;

   end;

end;

//Создание новой темы

procedure Tmain_manager.Create_ThemeClick(Sender: TObject);

var

 Theme_New: String;

 id_subject: integer;

begin

 id_subject := dm.Query_Subject.FieldByName('id_subject').AsInteger;

 dm.Last_Selected.id_subject := id_subject;

 Theme_New := InputBox('Создание новой темы',

                         'Введите название создаваемой темы',

                         '<<< Новая тема >>>');

   begin

     try

       dm.Create_Theme_New(id_subject, theme_New);

     except

     ;

     end;

     dm.Last_Selected.id_theme := dm.Query_Theme.FieldByName('id_theme').AsInteger;

     dm.Query_Subject_Set;

     dm.Query_Subject.Locate('id_subject', dm.Last_Selected.id_subject, []);

     dm.Query_Theme_Set;

   end;

end;

procedure Tmain_manager.FormClose(Sender: TObject;

 var Action: TCloseAction);

begin

 Application.Terminate;

end;

procedure Tmain_manager.FormShow(Sender: TObject);

begin

 dm.Query_Subject_Set();

 dm.Query_Theme_Set();

 dm.Load_User;

 dm.Load_Student;

end;

procedure Tmain_manager.Grid_SubjectCellClick(Column: TColumn);

begin

 if Column.FieldName = 'access' then

   begin

     Column.Field.DataSet.Edit;

     if Column.Field.DataSet.FieldByName('access').AsInteger = 1 then

       Column.Field.DataSet.FieldByName('access').AsInteger := 0

     else

       Column.Field.DataSet.FieldByName('access').AsInteger := 1;

     Column.Field.DataSet.Post;

   end;

end;

procedure Tmain_manager.Grid_SubjectColExit(Sender: TObject);

begin

 If Grid_Subject.SelectedField.FieldName = BoxAccessSubject.DataField then

   BoxAccessSubject.Visible := false;

end;

procedure Tmain_manager.Grid_SubjectDrawColumnCell(Sender: TObject;

 const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

Var

 Style: Integer;

 ImageIndex: Integer;

begin

   if Column.FieldName = 'access' then

     begin

       if Column.Field.DataSet.FieldByName('access').AsInteger = 1 then

         ImageIndex := 0

       else

         ImageIndex := 1;

     end;

   dm.ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex, true );

 if (gdFocused in State) and (Column.FieldName = BoxAccessSubject.DataField)

   then

     begin

       BoxAccessSubject.Left:= Rect.Left + Grid_Subject.Left + 1;

       BoxAccessSubject.Top:= Rect.Top + Grid_Subject.top + 1;

       BoxAccessSubject.Width := Rect.Right - Rect.Left;

       BoxAccessSubject.Height := Rect.Bottom - Rect.Top;

       BoxAccessSubject.Visible:=true;

     end;

end;

procedure Tmain_manager.Grid_SubjectKeyPress(Sender: TObject; var Key: Char);

begin

 if (key <> chr(9)) then

 begin

   if (Grid_Subject.SelectedField.FieldName = BoxAccessSubject.DataField) then

   begin

     BoxAccessSubject.SetFocus;

     SendMessage(BoxAccessSubject.Handle, WM_Char, word(Key), 0);

   end;

 end;

end;

procedure Tmain_manager.Grid_SubjectMouseUp(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 dm.Query_Theme_Set();

end;

procedure Tmain_manager.Grid_ThemeCellClick(Column: TColumn);

begin

 if Column.FieldName = 'access' then

   begin

     Column.Field.DataSet.Edit;

     if Column.Field.DataSet.FieldByName('access').AsInteger = 1 then

       Column.Field.DataSet.FieldByName('access').AsInteger := 0

     else

       Column.Field.DataSet.FieldByName('access').AsInteger := 1;

     Column.Field.DataSet.Post;

   end;

end;

procedure Tmain_manager.Grid_ThemeColExit(Sender: TObject);

begin

 If Grid_Theme.SelectedField.FieldName = BoxAccessTheme.DataField then

   BoxAccessTheme.Visible := false;

end;

procedure Tmain_manager.Grid_ThemeDrawColumnCell(Sender: TObject;

 const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

Var

 Style: Integer;

 ImageIndex: Integer;

begin

   if Column.FieldName = 'access' then

     begin

       if Column.Field.DataSet.FieldByName('access').AsInteger = 1 then

         ImageIndex := 0

       else

         ImageIndex := 1;

     end;

   dm.ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex, true );

 if (gdFocused in State) and (Column.FieldName = BoxAccessTheme.DataField)

   then

     begin

       BoxAccessTheme.Left:= Rect.Left + Grid_Theme.Left + 1;

       BoxAccessTheme.Top:= Rect.Top + Grid_Theme.top + 1;

       BoxAccessTheme.Width := Rect.Right - Rect.Left;

       BoxAccessTheme.Height := Rect.Bottom - Rect.Top;

       BoxAccessTheme.Visible:=true;

     end;

end;

procedure Tmain_manager.Grid_ThemeKeyPress(Sender: TObject; var Key: Char);

begin

 if (key <> chr(9)) then

 begin

   if (Grid_Subject.SelectedField.FieldName = BoxAccessTheme.DataField) then

   begin

     BoxAccessTheme.SetFocus;

     SendMessage(BoxAccessTheme.Handle, WM_Char, word(Key), 0);

   end;

 end;

end;

procedure Tmain_manager.LoadInBDClick(Sender: TObject);

var

 Fname: String;

 I: Integer;

 name: String;

 PAth: String;

begin

 LoadSkin(dm.OD.FileName);

end;

procedure Tmain_manager.LoadOutBDClick(Sender: TObject);

var

 Path: String;

beginnot SelectDirectory('Выберете папку','C:\, D:\', Path) then

  Exit;:= Path + '\';(Path);

end;

procedure Tmain_manager.LoadSkin(FileName: String);

var

 name: String;

begin

 if FileExists( FileName ) then

  begin

     Name := ExtractFileName(FileName);

     Delete( Name, LastDelimiter( '.', Name ), Length( Name ) );

  end

  else

     Name := 'name';

 dm.Load_Query_Skin();

 dm.Query_Skin.Insert;

 dm.Query_Skin.Post;

 dm.Query_Skin.Edit;

 (dm.Query_Skin.FieldByName('skin') as TBlobField).LoadFromFile(FileName);

 dm.Query_Skin.FieldByName('name').AsString := name;

 dm.Query_Skin.Post;

end;

procedure Tmain_manager.Navigator_SubjectClick(Sender: TObject;

 Button: TNavigateBtn);

begin

 dm.Query_Theme_Set();

end;

procedure Tmain_manager.Progr3Change(Sender: TObject);

begin

 Progr1.Position := Progr3.Position;

 Progr2.Progress := Progr3.Position;

end;

function Tmain_manager.SaveSkin(Path: String): String;

var

 FileName: String;

begin

 FileName := Path + dm.Query_Skin.FieldByName('name').AsString + '.asz';

 (dm.Query_Skin.FieldByName('skin') as TBlobField).SaveToFile(FileName);

 SaveSkin := FileName;

end;

procedure Tmain_manager.Btn_SubjectClick(Sender: TObject);

begin

 Form_mark_option.Show;

 Form_mark_option.Form_index := 1;

 main_manager.Hide;

end;

procedure Tmain_manager.Btn_Subject_ThemeClick(Sender: TObject);

begin

 Form_mark_option.Show;

 Form_mark_option.Form_index := 2;

 main_manager.Hide;

end;

procedure Tmain_manager.Btn_Subject_Theme_groupClick(Sender: TObject);

begin

 Form_mark_option.Show;

 Form_mark_option.Form_index := 3;

 main_manager.Hide;

end;

procedure Tmain_manager.SkinShow(Sender: TObject);

begin

 dm.Load_Query_Skin;

end;

procedure Tmain_manager.stCancelClick(Sender: TObject);

begin

 try

   dm.Query_Student.Cancel;

 except

   ;

 end;

end;

procedure Tmain_manager.stCreateClick(Sender: TObject);

begin

 try

   dm.Query_Student.Insert;

 except

   ;

 end;

end;

procedure Tmain_manager.stDeleteClick(Sender: TObject);

begin

 try

   dm.Query_Student.Delete;

 except

   ;

 end;

end;

procedure Tmain_manager.stReloadClick(Sender: TObject);

begin

 try

   dm.Load_Student;

 except

   ;

 end;

end;

procedure Tmain_manager.stSaveClick(Sender: TObject);

begin

 try

   dm.Query_Student.Post;

 except

   ;

 end;

end;

procedure Tmain_manager.uCancelClick(Sender: TObject);

begin

 try

   dm.Query_User.Cancel;

 except

   ;

 end;

end;

procedure Tmain_manager.uCreateClick(Sender: TObject);

begin

 try

   dm.Query_User.Insert;

 except

   ;

 end;

end;

procedure Tmain_manager.uDeleteClick(Sender: TObject);

begin

 try

   dm.Query_User.Delete;

 except

   ;

 end;

end;

procedure Tmain_manager.UReLoadClick(Sender: TObject);

begin

 try

   dm.Load_User;

 except

   ;

 end;

end;

procedure Tmain_manager.uSaveClick(Sender: TObject);

begin

 try

   dm.Query_User.Post;

 except

   ;

 end;

end;

end.

unit unit_marks;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Grids, DBGrids, Menus;

type

 TForm_Marks = class(TForm)

   MainMenu1: TMainMenu;

   columns: TMenuItem;

   select: TMenuItem;

   Grid_Mark: TDBGrid;

   Report: TMenuItem;

   View: TMenuItem;

   procedure FormShow(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure ViewClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

   procedure ColumnsSet();

 end;

var

 Form_Marks: TForm_Marks;

implementation

 unit_dm, unit_mark_option, unit_main_manager;

{$R *.dfm}

 

procedure TForm_Marks.ColumnsSet;

begin

 Grid_Mark.Columns[0].Visible := Form_mark_option.N_group.Checked;

 Grid_Mark.Columns[1].Visible := Form_mark_option.SName.Checked;

 Grid_Mark.Columns[2].Visible := Form_mark_option.Name.Checked;

 Grid_Mark.Columns[3].Visible := Form_mark_option.Subject.Checked;

 Grid_Mark.Columns[4].Visible := Form_mark_option.Theme.Checked;

 Grid_Mark.Columns[5].Visible := Form_mark_option.date_begin.Checked;

 Grid_Mark.Columns[6].Visible := Form_mark_option.time_begin.Checked;

 Grid_Mark.Columns[7].Visible := Form_mark_option.time_end.Checked;

 Grid_Mark.Columns[8].Visible := Form_mark_option.mark.Checked;

 Grid_Mark.Columns[9].Visible := Form_mark_option.mark_5.Checked;

 Grid_Mark.Columns[10].Visible := Form_mark_option.mark_100.Checked;

 Grid_Mark.Columns[0].Width := 50;

 Grid_Mark.Columns[1].Width := 104;

 Grid_Mark.Columns[2].Width := 108;

 Grid_Mark.Columns[3].Width := 64;

 Grid_Mark.Columns[4].Width := 141;

 Grid_Mark.Columns[5].Width := 90;

 Grid_Mark.Columns[6].Width := 85;

 Grid_Mark.Columns[7].Width := 107;

 Grid_Mark.Columns[8].Width := 36;

 Grid_Mark.Columns[9].Width := 71;

 Grid_Mark.Columns[10].Width := 79;

end;

procedure TForm_Marks.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 main_manager.Show;

end;

procedure TForm_Marks.FormShow(Sender: TObject);

begin

 dm.Load_Marks_Al();

 ColumnsSet;

end;

procedure TForm_Marks.ViewClick(Sender: TObject);

 dm.RvProject.Execute;

 dm.RvProject.Close;

end;

end.

unit unit_marks_subject;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, ExtCtrls, sPanel, sTabControl, Grids, DBGrids, StdCtrls, Buttons,

 sBitBtn, sMemo, Menus;

type

 TForm_Marks_Subject = class(TForm)

   TabSubject: TsTabControl;

   Grid_Mark: TDBGrid;

   MainMenu1: TMainMenu;

   columns: TMenuItem;

   select: TMenuItem;

   procedure FormShow(Sender: TObject);

   procedure TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private

   { Private declarations }

   procedure CreateTabSubject();//Создаёт вкладки для каждого предмета

 public

   { Public declarations }

   procedure ColumnsSet();

 end;

var

 Form_Marks_Subject: TForm_Marks_Subject;

 id_subject: array[0..500] of Integer;

implementation

 uses

   unit_dm, unit_main_manager, unit_mark_option;

{$R *.dfm}

 

procedure TForm_Marks_Subject.ColumnsSet;

begin

 Grid_Mark.Columns[0].Visible := Form_mark_option.N_group.Checked;

 Grid_Mark.Columns[1].Visible := Form_mark_option.SName.Checked;

 Grid_Mark.Columns[2].Visible := Form_mark_option.Name.Checked;

 Grid_Mark.Columns[3].Visible := Form_mark_option.Subject.Checked;

 Grid_Mark.Columns[4].Visible := Form_mark_option.Theme.Checked;

 Grid_Mark.Columns[5].Visible := Form_mark_option.date_begin.Checked;

 Grid_Mark.Columns[6].Visible := Form_mark_option.time_begin.Checked;

 Grid_Mark.Columns[7].Visible := Form_mark_option.time_end.Checked;

 Grid_Mark.Columns[8].Visible := Form_mark_option.mark.Checked;

 Grid_Mark.Columns[9].Visible := Form_mark_option.mark_5.Checked;

 Grid_Mark.Columns[0].Width := 50;

 Grid_Mark.Columns[1].Width := 104;

 Grid_Mark.Columns[2].Width := 108;

 Grid_Mark.Columns[3].Width := 64;

 Grid_Mark.Columns[4].Width := 141;

 Grid_Mark.Columns[5].Width := 90;

 Grid_Mark.Columns[6].Width := 85;

 Grid_Mark.Columns[7].Width := 107;

 Grid_Mark.Columns[8].Width := 36;

 Grid_Mark.Columns[9].Width := 71;

end;

procedure TForm_Marks_Subject.CreateTabSubject;

var

 TabIndex: integer;

begin

 TabSubject.Tabs.Clear;

 dm.Query_Subject.First;

 TabIndex := 0;

 while not dm.Query_Subject.Eof do

   begin

     TabSubject.Tabs.Add(dm.Query_Subject.FieldByName('subject').AsString);

     id_subject[TabIndex] := dm.Query_Subject.FieldByName('id_subject').AsInteger;

     Inc(TabIndex);

     dm.Query_Subject.Next;

   end;

end;

procedure TForm_Marks_Subject.FormClose(Sender: TObject;

 var Action: TCloseAction);

begin

 main_manager.Show;

end;

procedure TForm_Marks_Subject.FormShow(Sender: TObject);

begin

 CreateTabSubject();

 dm.Load_Mark_Subject(id_subject[TabSubject.TabIndex]);

 TabSubject.TabIndex := 0;

 ColumnsSet;

end;

procedure TForm_Marks_Subject.TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 dm.Load_Mark_Subject(id_subject[TabSubject.TabIndex]);

end;

end.

unit unit_marks_subject_theme;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, ExtCtrls, sPanel, sTabControl, Grids, DBGrids, StdCtrls, Buttons,

 sBitBtn, sMemo, Menus;

type

 TForm_Marks_Subject_Theme = class(TForm)

   TabSubject: TsTabControl;

   MainMenu1: TMainMenu;

   columns: TMenuItem;

   select: TMenuItem;

   TabTheme: TsTabControl;

   Grid_Mark: TDBGrid;

   procedure FormShow(Sender: TObject);

   procedure TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure TabThemeMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private

   { Private declarations }

   procedure CreateTabSubject();//Создаёт вкладки для каждого предмета

   procedure CreateTabTheme(id_subject: integer);//Создаёт вкладки для тем

 public

   { Public declarations }

   procedure ColumnsSet();

 end;

var

 Form_Marks_Subject_Theme: TForm_Marks_Subject_Theme;

 id_subject: array[0..500] of Integer;

 id_theme: array[0..500] of Integer;

implementation

 uses

   unit_dm, unit_main_manager, unit_mark_option;

{$R *.dfm}

 

procedure TForm_Marks_Subject_Theme.ColumnsSet;

begin

 Grid_Mark.Columns[0].Visible := Form_mark_option.N_group.Checked;

 Grid_Mark.Columns[1].Visible := Form_mark_option.SName.Checked;

 Grid_Mark.Columns[2].Visible := Form_mark_option.Name.Checked;

 Grid_Mark.Columns[3].Visible := Form_mark_option.Subject.Checked;

 Grid_Mark.Columns[4].Visible := Form_mark_option.Theme.Checked;

 Grid_Mark.Columns[5].Visible := Form_mark_option.date_begin.Checked;

 Grid_Mark.Columns[6].Visible := Form_mark_option.time_begin.Checked;

 Grid_Mark.Columns[7].Visible := Form_mark_option.time_end.Checked;

 Grid_Mark.Columns[8].Visible := Form_mark_option.mark.Checked;

 Grid_Mark.Columns[0].Width := 50;

 Grid_Mark.Columns[1].Width := 104;

 Grid_Mark.Columns[2].Width := 108;

 Grid_Mark.Columns[3].Width := 64;

 Grid_Mark.Columns[4].Width := 141;

 Grid_Mark.Columns[5].Width := 90;

 Grid_Mark.Columns[6].Width := 85;

 Grid_Mark.Columns[7].Width := 107;

 Grid_Mark.Columns[8].Width := 36;

end;

procedure TForm_Marks_Subject_Theme.CreateTabSubject;

var

 TabIndex: integer;

begin

 dm.Query_Subject_Set;

 TabSubject.Tabs.Clear;

 dm.Query_Subject.First;

 TabIndex := 0;

 while not dm.Query_Subject.Eof do

   begin

     TabSubject.Tabs.Add(dm.Query_Subject.FieldByName('subject').AsString);

     id_subject[TabIndex] := dm.Query_Subject.FieldByName('id_subject').AsInteger;

     Inc(TabIndex);

     dm.Query_Subject.Next;

   end;

end;

procedure TForm_Marks_Subject_Theme.CreateTabTheme(id_subject: integer);

var

 TabIndex: integer;

begin

 id_theme[0] := -1;

 dm.Query_Subject.Locate('id_subject', id_subject, []);

 dm.Query_Theme_Set;

 TabTheme.Tabs.Clear;

 dm.Query_Theme.First;

 TabIndex := 0;

 while not dm.Query_Theme.Eof do

   begin

     TabTheme.Tabs.Add(dm.Query_Theme.FieldByName('theme').AsString);

     id_theme[TabIndex] := dm.Query_Theme.FieldByName('id_theme').AsInteger;

     Inc(TabIndex);

     dm.Query_Theme.Next;

   end;

 TabTheme.TabIndex := 0;

 dm.Load_Mark_Theme(id_theme[TabTheme.TabIndex]);

end;

procedure TForm_Marks_Subject_Theme.FormClose(Sender: TObject;

 var Action: TCloseAction);

begin

 main_manager.Show;

end;

procedure TForm_Marks_Subject_Theme.FormShow(Sender: TObject);

begin

 CreateTabSubject();

 CreateTabTheme(id_subject[TabSubject.TabIndex]);

 TabSubject.TabIndex := 0;

 dm.Load_Mark_Theme(id_theme[TabTheme.TabIndex]);

 TabTheme.TabIndex := 0;

 ColumnsSet;

end;

procedure TForm_Marks_Subject_Theme.TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 CreateTabTheme(id_subject[TabSubject.TabIndex]);

end;

procedure TForm_Marks_Subject_Theme.TabThemeMouseUp(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 dm.Load_Mark_Theme(id_theme[TabTheme.TabIndex]);

end;

end.

unit unit_marks_subject_theme_group;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, ExtCtrls, sPanel, sTabControl, Grids, DBGrids, StdCtrls, Buttons,

 sBitBtn, sMemo, Menus;

type

 TForm_Marks_Subject_Theme_group = class(TForm)

   TabSubject: TsTabControl;

   MainMenu1: TMainMenu;

   columns: TMenuItem;

   select: TMenuItem;

   TabTheme: TsTabControl;

   TabGroup: TsTabControl;

   Grid_Mark: TDBGrid;

   procedure FormShow(Sender: TObject);

   procedure TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure TabThemeMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure TabGroupMouseUp(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private

   { Private declarations }

   procedure CreateTabSubject();//Создаёт вкладки для каждого предмета

   procedure CreateTabTheme(id_subject: integer);//Создаёт вкладки для тем

   procedure CreateTabGroup(id_theme: integer);//Создаёт вкладки груп

 public

   { Public declarations }

   procedure ColumnsSet();

 end;

var

 Form_Marks_Subject_Theme_group: TForm_Marks_Subject_Theme_group;

 id_subject: array[0..500] of Integer;

 id_theme: array[0..500] of Integer;

 id_group: array[0..500] of Integer;

implementation

 uses

   unit_dm, unit_main_manager, unit_mark_option;

{$R *.dfm}

 

procedure TForm_Marks_Subject_Theme_group.ColumnsSet;

begin

 Grid_Mark.Columns[0].Visible := Form_mark_option.N_group.Checked;

 Grid_Mark.Columns[1].Visible := Form_mark_option.SName.Checked;

 Grid_Mark.Columns[2].Visible := Form_mark_option.Name.Checked;

 Grid_Mark.Columns[3].Visible := Form_mark_option.Subject.Checked;

 Grid_Mark.Columns[4].Visible := Form_mark_option.Theme.Checked;

 Grid_Mark.Columns[5].Visible := Form_mark_option.date_begin.Checked;

 Grid_Mark.Columns[6].Visible := Form_mark_option.time_begin.Checked;

 Grid_Mark.Columns[7].Visible := Form_mark_option.time_end.Checked;

 Grid_Mark.Columns[8].Visible := Form_mark_option.mark.Checked;

 Grid_Mark.Columns[0].Width := 50;

 Grid_Mark.Columns[1].Width := 104;

 Grid_Mark.Columns[2].Width := 108;

 Grid_Mark.Columns[3].Width := 64;

 Grid_Mark.Columns[4].Width := 141;

 Grid_Mark.Columns[5].Width := 90;

 Grid_Mark.Columns[6].Width := 85;

 Grid_Mark.Columns[7].Width := 107;

 Grid_Mark.Columns[8].Width := 36;

end;

procedure TForm_Marks_Subject_Theme_group.CreateTabGroup(id_theme: integer);

begin

 dm.Load_Group();

 TabGroup.Tabs.Clear;

 dm.Query_Group.First;

 while not dm.Query_Group.Eof do

   begin

     TabGroup.Tabs.Add(dm.Query_Group.FieldByName('n_group').AsString);

     dm.Query_Group.Next;

   end;

 TabGroup.TabIndex := 0;

 dm.Load_Mark_Group(id_theme, TabGroup.Tabs[0]);

end;

procedure TForm_Marks_Subject_Theme_group.CreateTabSubject;

var

 TabIndex: integer;

begin

 dm.Query_Subject_Set;

 TabSubject.Tabs.Clear;

 dm.Query_Subject.First;

 TabIndex := 0;

 while not dm.Query_Subject.Eof do

   begin

     TabSubject.Tabs.Add(dm.Query_Subject.FieldByName('subject').AsString);

     id_subject[TabIndex] := dm.Query_Subject.FieldByName('id_subject').AsInteger;

     Inc(TabIndex);

     dm.Query_Subject.Next;

   end;

 TabSubject.TabIndex := 0;

end;

procedure TForm_Marks_Subject_Theme_group.CreateTabTheme(id_subject: integer);

var

 TabIndex: integer;

begin

 id_theme[0] := -1;

 dm.Query_Subject.Locate('id_subject', id_subject, []);

 dm.Query_Theme_Set;

 TabTheme.Tabs.Clear;

 dm.Query_Theme.First;

 TabIndex := 0;

 while not dm.Query_Theme.Eof do

   begin

     TabTheme.Tabs.Add(dm.Query_Theme.FieldByName('theme').AsString);

     id_theme[TabIndex] := dm.Query_Theme.FieldByName('id_theme').AsInteger;

     Inc(TabIndex);

     dm.Query_Theme.Next;

   end;

 TabTheme.TabIndex := 0;

 CreateTabGroup(id_theme[TabTheme.TabIndex]);

end;

procedure TForm_Marks_Subject_Theme_group.FormClose(Sender: TObject;

 var Action: TCloseAction);

begin

 main_manager.Show;

end;

procedure TForm_Marks_Subject_Theme_group.FormShow(Sender: TObject);

begin

 CreateTabSubject();

 CreateTabTheme(id_subject[TabSubject.TabIndex]);

 TabSubject.TabIndex := 0;

 dm.Load_Mark_Theme(id_theme[TabTheme.TabIndex]);

 TabTheme.TabIndex := 0;

 ColumnsSet;

end;

procedure TForm_Marks_Subject_Theme_group.TabGroupMouseUp(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 dm.Load_Mark_Group(id_theme[TabTheme.TabIndex], TabGroup.Tabs[TabGroup.TabIndex]);

end;

procedure TForm_Marks_Subject_Theme_group.TabSubjectMouseUp(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 CreateTabTheme(id_subject[TabSubject.TabIndex]);

end;

procedure TForm_Marks_Subject_Theme_group.TabThemeMouseUp(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 CreateTabGroup(id_theme[TabTheme.TabIndex]);

end;


unit unit_mark_option;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, ComCtrls, sPageControl, StdCtrls, sCheckBox, Buttons, sBitBtn,

 sAlphaListBox;

type

 TForm_mark_option = class(TForm)

   Page_SELECT: TsPageControl;

   TabField: TsTabSheet;

   TabOrder: TsTabSheet;

   BtnNext: TsBitBtn;

   N_group: TsCheckBox;

   SName: TsCheckBox;

   Name: TsCheckBox;

   Subject: TsCheckBox;

   Theme: TsCheckBox;

   date_begin: TsCheckBox;

   time_begin: TsCheckBox;

   time_end: TsCheckBox;

   mark: TsCheckBox;

   mark_5: TsCheckBox;

   mark_100: TsCheckBox;

   ListOut: TsListBox;

   ListIn: TsListBox;

   BtnSelect: TsBitBtn;

   BtnSelectAll: TsBitBtn;

   BtnCancelAll: TsBitBtn;

   BtnCancel: TsBitBtn;

   BtnCanc: TsBitBtn;

   procedure BtnNextClick(Sender: TObject);

   procedure BtnSelectClick(Sender: TObject);

   procedure BtnCancelClick(Sender: TObject);

   procedure BtnSelectAllClick(Sender: TObject);

   procedure BtnCancelAllClick(Sender: TObject);

   procedure BtnCancClick(Sender: TObject);

   procedure FormShow(Sender: TObject);

 private

   { Private declarations }

   procedure SetOrderStr();//Заполнение параметров сортировки

 public

   { Public declarations }

   Form_index: integer; //указатель выбранной формы

 end;

var

 Form_mark_option: TForm_mark_option;

implementation

unit_marks, unit_main_manager, unit_dm, unit_marks_subject,

 unit_marks_subject_theme_group, unit_marks_subject_theme;

{$R *.dfm}

 

procedure TForm_mark_option.BtnCancClick(Sender: TObject);

begin

 Hide;

 Main_Manager.Show;

end;

procedure TForm_mark_option.BtnCancelAllClick(Sender: TObject);

begin

 ListOut.Items.Clear;

 ListOut.Items.Add('№ группы');

 ListOut.Items.Add('Фамилия');

 ListOut.Items.Add('Имя');

 ListOut.Items.Add('Предмет');

 ListOut.Items.Add('Тема');

 ListOut.Items.Add('Дата');

 ListOut.Items.Add('Время начала');

 ListOut.Items.Add('Время окончания');

 ListOut.Items.Add('Оценка 2-5');

 ListOut.Items.Add('Оценка 2-5');

 ListOut.Items.Add('Оценка 0-100');

 ListIn.Items.Clear;

end;

procedure TForm_mark_option.BtnCancelClick(Sender: TObject);

begin

 if ListIn.ItemIndex = -1 then

   exit;

 ListOut.Items.Add(ListIn.Items[ListIn.ItemIndex]);

 ListIn.Items.Delete(ListIn.ItemIndex);

 ListIn.ItemIndex := 0;

end;

procedure TForm_mark_option.BtnSelectAllClick(Sender: TObject);

begin

 ListIn.Items.Clear;

 ListIn.Items.Add('№ группы');

 ListIn.Items.Add('Фамилия');

 ListIn.Items.Add('Имя');

 ListIn.Items.Add('Предмет');

 ListIn.Items.Add('Тема');

 ListIn.Items.Add('Дата');

 ListIn.Items.Add('Время начала');

 ListIn.Items.Add('Время окончания');

 ListIn.Items.Add('Оценка 2-5');

 ListIn.Items.Add('Оценка 2-5');

 ListIn.Items.Add('Оценка 0-100');

 ListOut.Items.Clear;

end;

procedure TForm_mark_option.BtnSelectClick(Sender: TObject);

begin

 if ListOut.ItemIndex = -1 then

   exit;

 ListIn.Items.Add(ListOut.Items[listOut.ItemIndex]);

 ListOut.Items.Delete(listOut.ItemIndex);

 ListOut.ItemIndex := 0;

end;

procedure TForm_mark_option.FormShow(Sender: TObject);

begin

 Page_Select.TabIndex := 0;

end;

procedure TForm_mark_option.SetOrderStr;

var

 ItemIndex: integer;

begin

 if  ListIn.Items.Count <> 0 then

   begin

     ListIn.ItemIndex := 0;

     dm.order_str := '';

     if ListIn.Items[ListIn.ItemIndex] = '№ группы' then

       dm.order_str := dm.order_str + 'n_group';

     if ListIn.Items[ListIn.ItemIndex] = 'Фамилия' then

       dm.order_str := dm.order_str + 'sname';

     if ListIn.Items[ListIn.ItemIndex] = 'Имя' then

       dm.order_str := dm.order_str + 'name';

     if ListIn.Items[ListIn.ItemIndex] = 'Предмет' then

       dm.order_str := dm.order_str + 'subject';

     if ListIn.Items[ListIn.ItemIndex] = 'Тема' then

       dm.order_str := dm.order_str + 'theme';

     if ListIn.Items[ListIn.ItemIndex] = 'Дата' then

       dm.order_str := dm.order_str + 'date_begin';

     if ListIn.Items[ListIn.ItemIndex] = 'Время начала' then

       dm.order_str := dm.order_str + 'time_begin';

     if ListIn.Items[ListIn.ItemIndex] = 'Время окончания' then

       dm.order_str := dm.order_str + 'time_end';

     if ListIn.Items[ListIn.ItemIndex] = 'Оценка 2-5' then

       dm.order_str := dm.order_str + 'mark';

     if ListIn.Items[ListIn.ItemIndex] = 'Оценка 0-5' then

       dm.order_str := dm.order_str + 'mark_5';

     if ListIn.Items[ListIn.ItemIndex] = 'Оценка 0-100' then

       dm.order_str := dm.order_str + 'mark_100';

   ListIn.ItemIndex := ListIn.ItemIndex + 1;

   ItemIndex := ListIn.ItemIndex;

   while ItemIndex <= ListIn.Items.Count - 1 do

     begin

       dm.order_str := dm.order_str + ' ,' ;

       if ListIn.Items[ListIn.ItemIndex] = '№ группы' then

         dm.order_str := dm.order_str + 'n_group';

       if ListIn.Items[ListIn.ItemIndex] = 'Фамилия' then

         dm.order_str := dm.order_str + 'sname';

       if ListIn.Items[ListIn.ItemIndex] = 'Имя' then

         dm.order_str := dm.order_str + 'name';

       if ListIn.Items[ListIn.ItemIndex] = 'Предмет' then

         dm.order_str := dm.order_str + 'subject';

       if ListIn.Items[ListIn.ItemIndex] = 'Тема' then

         dm.order_str := dm.order_str + 'theme';

       if ListIn.Items[ListIn.ItemIndex] = 'Дата' then

         dm.order_str := dm.order_str + 'date_begin';

       if ListIn.Items[ListIn.ItemIndex] = 'Время начала' then

         dm.order_str := dm.order_str + 'time_begin';

       if ListIn.Items[ListIn.ItemIndex] = 'Время окончания' then

         dm.order_str := dm.order_str + 'time_end';

       if ListIn.Items[ListIn.ItemIndex] = 'Оценка 2-5' then

         dm.order_str := dm.order_str + 'mark';

       if ListIn.Items[ListIn.ItemIndex] = 'Оценка 0-5' then

         dm.order_str := dm.order_str + 'mark_5';

       if ListIn.Items[ListIn.ItemIndex] = 'Оценка 0-100' then

         dm.order_str := dm.order_str + 'mark_100';

       Inc ( ItemIndex );

       ListIn.ItemIndex := ListIn.ItemIndex + 1;

     end;

   end;

end;

procedure TForm_mark_option.BtnNextClick(Sender: TObject);

begin

 if Page_Select.TabIndex = (Page_Select.PageCount - 1) then

   begin

     SetOrderStr;

     case Form_index of

     0: Form_Marks.Show;

     1: Form_Marks_Subject.Show;

     2: Form_Marks_Subject_Theme.Show;

     3: Form_marks_subject_theme_group.Show;

     end;

     Hide;

   end

 else

   Page_Select.TabIndex := Page_Select.TabIndex + 1;

end;

end.

unit unit_mark_select;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ComCtrls;

type

 Tform_mark_select = class(TForm)

   PageSelect: TPageControl;

   TabMark: TTabSheet;

   TabSheet2: TTabSheet;

   TabSheet3: TTabSheet;

   TabSheet4: TTabSheet;

   RB_2_5: TRadioButton;

   RB_0_5: TRadioButton;

   RB_0_100: TRadioButton;

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 form_mark_select: Tform_mark_select;

implementation

{$R *.dfm}

 

end.

unit unit_dm;

interface

 SysUtils, Classes, ZConnection, DB, ZAbstractRODataset, ZAbstractDataset,

 ZDataset, Dialogs, ZAbstractTable, XPMan, ExtDlgs, ActnList, Menus, ActnPopup,

 XPStyleActnCtrls, ActnMan, ComCtrls, ZSqlMonitor, sSkinProvider, sSkinManager,

 ImgList, Controls, RpRenderText, RpRenderRTF, RpRenderHTML, RpRender,

 RpRenderPDF, RpCon, RpConDS, RpRave, RpDefine, RpBase, RpSystem, ExtCtrls;

type

  TUser = record //Данные о пользователе

    id:     integer;

    user:    string;

    pas:    string;

    access: string;

    name:   string;

    sname:  string;

    patronymic: string;

  end;

  TFSetting = record//Настройки соединения

   Host: String[100];

   Port: String[100];

   Database: String[100];

   User: String[100];

   Password: String[100];

 end;

 TSelection = record//Последние выбранные элементы

   id_subject: integer;

   id_theme: integer;

   id_question: integer;

 end;

   Tdm = class(TDataModule)

   ZConnection_spkvtk: TZConnection;

   Query_login: TZQuery;

   Query_data_test: TZQuery;

   Table_Subject_test: TZTable;

   Source_Subject: TDataSource;

   Query_Subject: TZQuery;

   Query_Create: TZQuery;

   XP: TXPManifest;

   Query_Answer: TZQuery;

   Query_Question: TZQuery;

   Source_Answer: TDataSource;

   Source_Question: TDataSource;

   OPD: TOpenPictureDialog;

   Query_Illustration: TZQuery;

   Source_Illustration: TDataSource;

   Query_Delete: TZQuery;

   Monitor: TZSQLMonitor;

   Query_Theme: TZQuery;

   Source_Theme: TDataSource;

   Query_User: TZQuery;

   Source_User: TDataSource;

   SkinManager: TsSkinManager;

   Query_Student: TZQuery;

   Source_Student: TDataSource;

   Query_Skin: TZQuery;

   Source_Skin: TDataSource;

   OD: TOpenDialog;

   Query_Betta: TZQuery;

   Source_Betta: TDataSource;

   Query_Mark: TZQuery;

   Source_Mark: TDataSource;

   Query_Group: TZQuery;

   RvSystem: TRvSystem;

   RvProject: TRvProject;

   RvConnectionMark: TRvDataSetConnection;

   RvPDF: TRvRenderPDF;

   RvHTML: TRvRenderHTML;

   RvRTF: TRvRenderRTF;

   RvText: TRvRenderText;

   ImageList: TImageList;

   procedure DataModuleCreate(Sender: TObject);//Создание модуля

   procedure ReadSetting(FName: String; Var

                         Host,

                         Port,

                         Database,

                         User,

                         Password: String);//Чтение настроек из файла для доступа к БД

   procedure ConnectSPKVTK();//Подключение к базе данных СПКВТК

 

 private

   { Private declarations }

 public

   { Public declarations }

   StrUser: TUser ;//Данные о пользователе

   Last_Selected: TSelection;//Последние выбранные элементы

   order_str: string;

   function log_in(nik:  String;

                   password:    String): Boolean ;// Проверка логина и пароля

   function Query_Subject_Set(): Boolean;//Получение списка предметов

   function Query_Theme_Set(): Boolean;//Получение списка тем по предмету

   function Create_Subject_New(Subject_Name: String): Boolean;//Создание нового предмета

   function Create_Theme_New(id_subject: integer; Theme_Name: String): Boolean;//Создание нового

   function Create_Question_New(id_theme: integer): Boolean;//Создание вопроса

   function Create_Answer_New(id_question: integer): Boolean;//Создание ответа

   function Load_Answer(): Boolean;//Получение списка ответов по предмету

   function Load_Question(): Boolean;//Получение списка вопросов

   function Create_Illustration_New(id_question: integer): Boolean;//Создание иллюстрации к вопросу

   function Load_Illustration(): Boolean;//Загрузка картинок к вопросу

   function Load_User(): Boolean;//Загрузка списка пользователей

   function Load_Student(): Boolean;//Загрузка списка пользователей

   procedure Load_Query_Skin(); //Загрузка таблицы скиеов

   procedure SetAllSkinPriority(priority: string);//Задать приоритет всем скинам

   procedure SetSkinPriority(priority: string; id_skin: integer);//Задать приоритет одному скину

   function SaveSkin(Path: String): String;//Сохранение скина на диск

   procedure ApplySkin(FileName: String);//Применяет скин

   procedure LoadSkinOutBD();//Загрузка скина ииз бд

   procedure Load_Betta();//Загрузка заметок Бетта

   procedure Load_Mark_Subject(id_subject: integer); //Загрузка оценок по предмету

   procedure Load_Mark_Theme(id_theme: integer); //Загрузка оценок по теие

   procedure Load_Mark_Group(id_theme: integer; n_group: String);//Загрузка оценок по теие

   procedure Load_Marks_Al();//Загрузка всех оценок

   procedure Load_Group();//Загруска списка груп

 end;

var

 dm: Tdm;

implementation

unit_edit_test, unit_start, unit_authentication;

{$R *.dfm}

 

procedure Tdm.ApplySkin(FileName: String);

var

 Fname: String;

 I: Integer;

 Name: String;

 Path: String;

begin

 Fname := dm.OD.FileName;

 if FileExists( FileName ) then

  begin

     Path := ExtractFilePath(FileName);

     Name := ExtractFileName(FileName);

     Delete( Name, LastDelimiter( '.', Name ), Length( Name ) );

  end

  else

     Name := '';

 dm.SkinManager.SkinDirectory := Path;

 dm.SkinManager.SkinName := Name;

 dm.SkinManager.Active := true;

end;

// Подключение к базе данных СПКВТК

var

 Host: String;

 Port: String;

 Database: String;

 User: String;

 Password: String;

begin

 try

   ReadSetting(ExtractFilePath(ParamStr(0))+'mysql.stg', Host, Port, Database, User, Password);

   ZConnection_spkvtk.HostName := Host;

   ZConnection_spkvtk.Port := StrToInt(Port);

   ZConnection_spkvtk.Database := Database;

   ZConnection_spkvtk.User := User;

   ZConnection_spkvtk.Password := Password;

   Zconnection_spkvtk.Connected := true;

 except

   ShowMessage('Ошибка подключения к ' + Host + ':' + Port);

   authentication.Close;

 end;

end;

function Tdm.Create_Answer_New(id_question: integer): Boolean;

//Создание нового ответа

begin

 Create_Answer_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO answer(id_question, propstr, correct) VALUE(' + IntToStr(id_question) + ', true, false)') ;

       Active := true;

       Last_Selected.id_question := FieldByName('id_answer').AsInteger;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Illustration_New(id_question: integer): Boolean;

//Создание иллюстрации для вопроса

begin

 Create_Illustration_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO q_illustration(id_question) VALUE(' + IntToStr(id_question) + ')') ;

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Question_New(id_theme: integer): Boolean;

//Создание нового вопроса

begin

 Create_Question_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO question(id_theme, only_one, mix_answer) VALUE(' + IntToStr(id_theme) + ', true, true)') ;

       Active := true;

       Last_Selected.id_question := FieldByName('id_question').AsInteger;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Subject_New(Subject_Name: String): Boolean;

//Создание нового предмета

begin

 Create_Subject_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO subject(subject) VALUE("' + Subject_Name + '")') ;

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Theme_New(id_subject: integer; Theme_Name: String): Boolean;

//Создание нового

begin

 Create_Theme_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO theme(id_subject, theme) VALUE(' + IntToStr(id_subject) + ', "' + Theme_Name + '")') ;

       Active := true;

       Last_Selected.id_theme := FieldByName('id_theme').AsInteger;

     end;

 except

   ;

 end;

end;

procedure Tdm.DataModuleCreate(Sender: TObject);

//Создание модуля

begin

 ;

end;

procedure Tdm.LoadSkinOutBD;

var

 path: string;

begin

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM skin') ;

       SQL.Add('WHERE priority in (Select max(priority) FROM skin)' );

       Active := true;

       Path := ExtractFilePath(ParamStr(0)) + 'temp\';

       if Eof then exit;

       ApplySkin(SaveSkin(Path));

     end;

 except

   ;

 end;

end;

function Tdm.Load_Answer: Boolean;

//Загрузка ответа на вопрос

begin

 Load_Answer := true;

 try

   With Query_Answer do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Answer') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   ;

   Load_Answer := false;

 end;

end;

procedure Tdm.Load_Betta;

begin

 try

   With Query_Betta do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT *') ;

       SQL.Add('FROM betta') ;

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_Group;

begin

 try

   With Query_Group do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT DISTINCT n_group');

       SQL.Add('FROM student');

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Load_Illustration: Boolean;

// загрузка иллюстраций к вопросу

begin

 Load_Illustration := true;

 try

   With Query_illustration do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM q_illustration ') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   ;

   Load_illustration := false;

 end;

end;

procedure Tdm.Load_Mark_Subject(id_subject: integer);

begin

 //try

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'su.id_subject = ' + IntToStr(id_subject));

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Mark_Theme(id_theme: integer);

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'th.id_theme = ' + IntToStr(id_theme));

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Marks_Al;

begin

 //try

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'te.id_subject = su.id_subject');

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Mark_Group(id_theme: Integer; n_group: String);

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'th.id_theme = ' + IntToStr(id_theme) + ' AND ');

       SQL.Add(      'st.n_group = ' + n_group);

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Query_Skin;

begin

 try

   With Query_Skin do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT *');

       SQL.Add('FROM skin');

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Load_Question: Boolean;

//чтение вопросов по предмету

begin

 Load_Question := true;

 try

   With Query_Question do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Question') ;

       SQL.Add('WHERE id_theme=' + IntToStr(Last_Selected.id_theme));

       Active := true;

     end;

 except

   Load_Question := false;

 end;

end;

function Tdm.Load_Student: Boolean;

//Загрузка списка пользователей

begin

 Load_Student := true;

 try

   With Query_Student do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM student') ;

       Active := true;

     end;

 except

   Load_Student := false;

 end;

end;

function Tdm.Load_User: Boolean;

//Загрузка списка пользователей

begin

 Load_User := true;

 try

   With Query_User do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM user') ;

       Active := true;

     end;

 except

   Load_User := false;

 end;

end;

procedure Tdm.ReadSetting(FName: String; var Host, Port, Database, User, Password: String);

//Чтение настроек из файла

var

 FSetting: File of TFSetting;

 Setting: TFSetting;

begin

 AssignFile(FSetting, FName);

 Reset(FSetting);

 Read(FSetting, Setting);

 Host := Setting.Host;

 port := Setting.Port;

 user := Setting.User;

 password := Setting.Password;

 database := Setting.Database;

 CloseFile(FSetting);


function Tdm.SaveSkin(Path: String): String;

var

 FileName: String;

begin

 FileName := Path + dm.Query_Skin.FieldByName('name').AsString + '.asz';

 (dm.Query_Skin.FieldByName('skin') as TBlobField).SaveToFile(FileName);

 SaveSkin := FileName;

end;

procedure Tdm.SetAllSkinPriority(priority: String);

begin

 try

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('UPDATE skin set priority =' + priority) ;

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.SetSkinPriority(priority: String; id_skin: integer);

begin

 try

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('UPDATE skin set priority = ' + priority) ;

       SQL.Add('WHERE id_skin = ' + IntToStr(id_skin));

       Active := true;

     end;

 except

   ;

 end;

function Tdm.log_in(nik:  String;

                   password:    String): boolean;

                   //Проверка имени пользователя и пароля

begin

try

 With Query_login do

   begin

     Active := false ;

     SQL.Clear;

     SQL.Add('select * from user where ');

     SQL.Add('user = "' + nik + '" and ');

     SQL.Add('password = "' + password + '"');

     Active := true;

     StrUser.id := FieldByName('id_user').AsInteger;

     if not Query_login.IsEmpty then

       begin

         StrUser.user := FieldByName('user').AsString;

         StrUser.pas := FieldByName('password').AsString;

         StrUser.access := FieldByName('access').AsString;

         StrUser.name := FieldByName('name').AsString;

         StrUser.sname := FieldByName('sname').AsString;

         StrUser.patronymic := FieldByName('patronymic').AsString;

         log_in := true;

       end

     else

       log_in := false;

   end;

except

    ;

end;

end;

function Tdm.Query_Subject_Set: boolean;

//Получение списка предметов

begin

 Query_Subject_Set := true;

 try

   With Query_Subject do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM Subject ') ;

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка предметов');

   Query_Subject_Set := false;

 end;

end;

function Tdm.Query_Theme_Set: Boolean;

//Получение списка тем по даному предмету

var

 id_subject: Integer;

begin

 Query_Theme_Set := true;

 try

   id_subject := Query_Subject.FieldByName('id_subject').AsInteger;

   With Query_Theme do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM theme WHERE id_subject = ' + IntToStr(id_subject));

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка тем по данному предмету');

   Query_Theme_Set := false;

 end;

end;

end.

Приложение Б

Модуль тестирования

unit unit_dm;

interface

 SysUtils, Classes, ZConnection, DB, ZAbstractRODataset, ZAbstractDataset,

 ZDataset, Dialogs, ZAbstractTable, XPMan, ExtDlgs, ActnList, Menus, ActnPopup,

 XPStyleActnCtrls, ActnMan, ComCtrls, ZSqlMonitor, sSkinProvider, sSkinManager,

 ImgList, Controls, RpRenderText, RpRenderRTF, RpRenderHTML, RpRender,

 RpRenderPDF, RpCon, RpConDS, RpRave, RpDefine, RpBase, RpSystem, ExtCtrls;

type

  TUser = record //Данные о пользователе

    id:     integer;

    user:    string;

    pas:    string;

    access: string;

    name:   string;

    sname:  string;

    patronymic: string;

  end;

  TFSetting = record//Настройки соединения

   Host: String[100];

   Port: String[100];

   Database: String[100];

   User: String[100];

   Password: String[100];

 end;

 TSelection = record//Последние выбранные элементы

   id_subject: integer;

   id_theme: integer;

   id_question: integer;

 end;

   Tdm = class(TDataModule)

   ZConnection_spkvtk: TZConnection;

   Query_login: TZQuery;

   Query_data_test: TZQuery;

   Table_Subject_test: TZTable;

   Source_Subject: TDataSource;

   Query_Subject: TZQuery;

   Query_Create: TZQuery;

   XP: TXPManifest;

   Query_Answer: TZQuery;

   Query_Question: TZQuery;

   Source_Answer: TDataSource;

   Source_Question: TDataSource;

   OPD: TOpenPictureDialog;

   Query_Illustration: TZQuery;

   Source_Illustration: TDataSource;

   Query_Delete: TZQuery;

   Monitor: TZSQLMonitor;

   Query_Theme: TZQuery;

   Source_Theme: TDataSource;

   Query_User: TZQuery;

   Source_User: TDataSource;

   SkinManager: TsSkinManager;

   Query_Student: TZQuery;

   Source_Student: TDataSource;

   Query_Skin: TZQuery;

   Source_Skin: TDataSource;

   OD: TOpenDialog;

   Query_Betta: TZQuery;

   Source_Betta: TDataSource;

   Query_Mark: TZQuery;

   Source_Mark: TDataSource;

   Query_Group: TZQuery;

   RvSystem: TRvSystem;

   RvProject: TRvProject;

   RvConnectionMark: TRvDataSetConnection;

   RvPDF: TRvRenderPDF;

   RvHTML: TRvRenderHTML;

   RvRTF: TRvRenderRTF;

   RvText: TRvRenderText;

   ImageList: TImageList;

   procedure DataModuleCreate(Sender: TObject);//Создание модуля

   procedure ReadSetting(FName: String; Var

                         Host,

                         Port,

                         Database,

                         User,

                         Password: String);//Чтение настроек из файла для доступа к БД

   procedure ConnectSPKVTK();//Подключение к базе данных СПКВТК

 

 private

   { Private declarations }

 public

   { Public declarations }

   StrUser: TUser ;//Данные о пользователе

   Last_Selected: TSelection;//Последние выбранные элементы

   order_str: string;

   function log_in(nik:  String;

                   password:    String): Boolean ;// Проверка логина и пароля

   function Query_Subject_Set(): Boolean;//Получение списка предметов

   function Query_Theme_Set(): Boolean;//Получение списка тем по предмету

   function Create_Subject_New(Subject_Name: String): Boolean;//Создание нового предмета

   function Create_Theme_New(id_subject: integer; Theme_Name: String): Boolean;//Создание нового

   function Create_Question_New(id_theme: integer): Boolean;//Создание вопроса

   function Create_Answer_New(id_question: integer): Boolean;//Создание ответа

   function Load_Answer(): Boolean;//Получение списка ответов по предмету

   function Load_Question(): Boolean;//Получение списка вопросов

   function Create_Illustration_New(id_question: integer): Boolean;//Создание иллюстрации к вопросу

   function Load_Illustration(): Boolean;//Загрузка картинок к вопросу

   function Load_User(): Boolean;//Загрузка списка пользователей

   function Load_Student(): Boolean;//Загрузка списка пользователей

   procedure Load_Query_Skin(); //Загрузка таблицы скиеов

   procedure SetAllSkinPriority(priority: string);//Задать приоритет всем скинам

   procedure SetSkinPriority(priority: string; id_skin: integer);//Задать приоритет одному скину

   function SaveSkin(Path: String): String;//Сохранение скина на диск

   procedure ApplySkin(FileName: String);//Применяет скин

   procedure LoadSkinOutBD();//Загрузка скина ииз бд

   procedure Load_Betta();//Загрузка заметок Бетта

   procedure Load_Mark_Subject(id_subject: integer); //Загрузка оценок по предмету

   procedure Load_Mark_Theme(id_theme: integer); //Загрузка оценок по теие

   procedure Load_Mark_Group(id_theme: integer; n_group: String);//Загрузка оценок по теие

   procedure Load_Marks_Al();//Загрузка всех оценок

   procedure Load_Group();//Загруска списка груп

 end;

var

 dm: Tdm;

implementation

unit_edit_test, unit_start, unit_authentication;

{$R *.dfm}

 

procedure Tdm.ApplySkin(FileName: String);

var

 Fname: String;

 I: Integer;

 Name: String;

 Path: String;

begin

 Fname := dm.OD.FileName;

 if FileExists( FileName ) then

  begin

     Path := ExtractFilePath(FileName);

     Name := ExtractFileName(FileName);

     Delete( Name, LastDelimiter( '.', Name ), Length( Name ) );

  end

  else

     Name := '';

 dm.SkinManager.SkinDirectory := Path;

 dm.SkinManager.SkinName := Name;

 dm.SkinManager.Active := true;

end;

procedure Tdm.ConnectSPKVTK;

// Подключение к базе данных СПКВТК

var

 Host: String;

 Port: String;

 Database: String;

 User: String;

 Password: String;

begin

 try

   ReadSetting(ExtractFilePath(ParamStr(0))+'mysql.stg', Host, Port, Database, User, Password);

   ZConnection_spkvtk.HostName := Host;

   ZConnection_spkvtk.Port := StrToInt(Port);

   ZConnection_spkvtk.Database := Database;

   ZConnection_spkvtk.User := User;

   ZConnection_spkvtk.Password := Password;

   Zconnection_spkvtk.Connected := true;

 except

   ShowMessage('Ошибка подключения к ' + Host + ':' + Port);

   authentication.Close;

 end;

end;

function Tdm.Create_Answer_New(id_question: integer): Boolean;

//Создание нового ответа

begin

 Create_Answer_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO answer(id_question, propstr, correct) VALUE(' + IntToStr(id_question) + ', true, false)') ;

       Active := true;

       Last_Selected.id_question := FieldByName('id_answer').AsInteger;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Illustration_New(id_question: integer): Boolean;

//Создание иллюстрации для вопроса

begin

 Create_Illustration_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO q_illustration(id_question) VALUE(' + IntToStr(id_question) + ')') ;

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Question_New(id_theme: integer): Boolean;

//Создание нового вопроса

begin

 Create_Question_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO question(id_theme, only_one, mix_answer) VALUE(' + IntToStr(id_theme) + ', true, true)') ;

       Active := true;

       Last_Selected.id_question := FieldByName('id_question').AsInteger;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Subject_New(Subject_Name: String): Boolean;

//Создание нового предмета

begin

 Create_Subject_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO subject(subject) VALUE("' + Subject_Name + '")') ;

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Create_Theme_New(id_subject: integer; Theme_Name: String): Boolean;

//Создание нового

begin

 Create_Theme_New := true;

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO theme(id_subject, theme) VALUE(' + IntToStr(id_subject) + ', "' + Theme_Name + '")') ;

       Active := true;

       Last_Selected.id_theme := FieldByName('id_theme').AsInteger;

     end;

 except

   ;

 end;


procedure Tdm.DataModuleCreate(Sender: TObject);

//Создание модуля

begin

 ;

end;

procedure Tdm.LoadSkinOutBD;

var

 path: string;

begin

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM skin') ;

       SQL.Add('WHERE priority in (Select max(priority) FROM skin)' );

       Active := true;

       Path := ExtractFilePath(ParamStr(0)) + 'temp\';

       if Eof then exit;

       ApplySkin(SaveSkin(Path));

     end;

 except

   ;

 end;

end;

function Tdm.Load_Answer: Boolean;

//Загрузка ответа на вопрос

begin

 Load_Answer := true;

 try

   With Query_Answer do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Answer') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   Load_Answer := false;

 end;

end;

procedure Tdm.Load_Betta;

begin

 try

   With Query_Betta do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT *') ;

       SQL.Add('FROM betta') ;

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_Group;

begin

 try

   With Query_Group do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT DISTINCT n_group');

       SQL.Add('FROM student');

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Load_Illustration: Boolean;

// загрузка иллюстраций к вопросу

begin

 Load_Illustration := true;

 try

   With Query_illustration do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM q_illustration ') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   Load_illustration := false;

 end;

end;

procedure Tdm.Load_Mark_Subject(id_subject: integer);

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'su.id_subject = ' + IntToStr(id_subject));

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Mark_Theme(id_theme: integer);

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'th.id_theme = ' + IntToStr(id_theme));

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Marks_Al;

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'te.id_subject = su.id_subject');

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Mark_Group(id_theme: Integer; n_group: String);

begin

   With Query_Mark do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT n_group, sname, name, subject, theme, mark, date_begin, time_begin, time_end, mark_5, mark_100 ');

       SQL.Add('FROM test te, student st, subject su, theme th') ;

       SQL.Add('WHERE te.id_subject = su.id_subject AND');

       SQL.Add(      'te.id_theme = th.id_theme AND');

       SQL.Add(      'te.id_student = st.id_student AND');

       SQL.Add(      'th.id_theme = ' + IntToStr(id_theme) + ' AND ');

       SQL.Add(      'st.n_group = ' + n_group);

       if dm.order_str <> '' then

         SQL.Add(      'ORDER BY ' + dm.order_str);

       Active := true;

     end;

end;

procedure Tdm.Load_Query_Skin;

begin

 try

   With Query_Skin do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT *');

       SQL.Add('FROM skin');

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.Load_Question: Boolean;

//чтение вопросов по предмету

begin

 Load_Question := true;

 try

   With Query_Question do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Question') ;

       SQL.Add('WHERE id_theme=' + IntToStr(Last_Selected.id_theme));

       Active := true;

     end;

 except

   Load_Question := false;

 end;

end;

function Tdm.Load_Student: Boolean;

//Загрузка списка пользователей

begin

 Load_Student := true;

 try

   With Query_Student do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM student') ;

       Active := true;

     end;

 except

   Load_Student := false;

 end;

end;

function Tdm.Load_User: Boolean;

//Загрузка списка пользователей

begin

 Load_User := true;

 try

   With Query_User do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM user') ;

       Active := true;

     end;

 except

   Load_User := false;

 end;

end;

procedure Tdm.ReadSetting(FName: String; var Host, Port, Database, User, Password: String);

//Чтение настроек из файла

var

 FSetting: File of TFSetting;

 Setting: TFSetting;

begin

 AssignFile(FSetting, FName);

 Reset(FSetting);

 Read(FSetting, Setting);

 Host := Setting.Host;

 port := Setting.Port;

 user := Setting.User;

 password := Setting.Password;

 database := Setting.Database;

 CloseFile(FSetting);

end;

function Tdm.SaveSkin(Path: String): String;

var

 FileName: String;

begin

 FileName := Path + dm.Query_Skin.FieldByName('name').AsString + '.asz';

 (dm.Query_Skin.FieldByName('skin') as TBlobField).SaveToFile(FileName);

 SaveSkin := FileName;

end;

procedure Tdm.SetAllSkinPriority(priority: String);

begin

 try

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('UPDATE skin set priority =' + priority) ;

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.SetSkinPriority(priority: String; id_skin: integer);

begin

 try

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('UPDATE skin set priority = ' + priority) ;

       SQL.Add('WHERE id_skin = ' + IntToStr(id_skin));

       Active := true;

     end;

 except

   ;

 end;

function Tdm.log_in(nik:  String;

                   password:    String): boolean;

                   //Проверка имени пользователя и пароля

begin

try

 With Query_login do

   begin

     Active := false ;

     SQL.Clear;

     SQL.Add('select * from user where ');

     SQL.Add('user = "' + nik + '" and ');

     SQL.Add('password = "' + password + '"');

     Active := true;

     StrUser.id := FieldByName('id_user').AsInteger;

     if not Query_login.IsEmpty then

       begin

         StrUser.user := FieldByName('user').AsString;

         StrUser.pas := FieldByName('password').AsString;

         StrUser.access := FieldByName('access').AsString;

         StrUser.name := FieldByName('name').AsString;

         StrUser.sname := FieldByName('sname').AsString;

         StrUser.patronymic := FieldByName('patronymic').AsString;

         log_in := true;

       end

     else

       log_in := false;

   end;

except

    ;

end;

end;

function Tdm.Query_Subject_Set: boolean;

//Получение списка предметов

begin

 Query_Subject_Set := true;

 try

   With Query_Subject do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM Subject ') ;

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка предметов');

   Query_Subject_Set := false;

 end;

end;

function Tdm.Query_Theme_Set: Boolean;

//Получение списка тем по даному предмету

var

 id_subject: Integer;

begin

 Query_Theme_Set := true;

 try

   id_subject := Query_Subject.FieldByName('id_subject').AsInteger;

   With Query_Theme do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM theme WHERE id_subject = ' + IntToStr(id_subject));

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка тем по данному предмету');

   Query_Theme_Set := false;

 end;

end;

end.

unit unit_inquirer;

interface

 Dialogs, StdCtrls, Mask, DBCtrls, unit_dm, ExtCtrls, jpeg, Buttons, ComCtrls,

 Grids, DBGrids, JRCheckBox, JRDBCheckBoxMySQL, DB, DBTables, Menus, ActnPopup,

 ActnList, XPStyleActnCtrls, ActnMan, sEdit, sBitBtn, sDBRichEdit, sRichEdit,

 sSplitter, sRadioButton, sCheckBox, sPanel, sScrollBox, sGroupBox, ToolWin,

 sToolBar;

type

 TForm_Inquirer = class(TForm)

   MenuAnswer: TPopupMenu;

   delete: TMenuItem;

   PanelAnswer: TsPanel;

   mix_answer: TJRDBCheckBoxMySQL;

   only_one: TJRDBCheckBoxMySQL;

   propstr: TJRDBCheckBoxMySQL;

   mix_question: TJRDBCheckBoxMySQL;

   QuestionText: TsDBRichEdit;

   sToolBar1: TsToolBar;

   BoxIllustration: TsGroupBox;

   Questionillustration: TImage;

   DBIllustrationText: TsDBRichEdit;

   BoxIllustrationBtn: TsGroupBox;

   dbILast: TsBitBtn;

   dbINext: TsBitBtn;

   dbIPrior: TsBitBtn;

   dbIFirst: TsBitBtn;

   dbIGoToN: TsBitBtn;

   N_Illustration: TEdit;

   sSplitter1: TsSplitter;

   BoxAnswerBtn: TsGroupBox;

   dbQLasst: TsBitBtn;

   dbQNext: TsBitBtn;

   dbQPrior: TsBitBtn;

   dbQFirst: TsBitBtn;

   dbQGoToN: TsBitBtn;

   N_Question: TsEdit;

   PaneMainlAnswer: TsPanel;

   BoxAnswer: TsScrollBox;

   BtnRendering: TsBitBtn;

   procedure deleteClick(Sender: TObject);

   procedure dbQCancelClick(Sender: TObject);

   procedure dbIGoToNClick(Sender: TObject);

   procedure dbILastClick(Sender: TObject);

   procedure dbINextClick(Sender: TObject);

   procedure dbIPriorClick(Sender: TObject);

   procedure dbIFirstClick(Sender: TObject);

   procedure dbQPostClick(Sender: TObject);

   procedure dbQGoToNClick(Sender: TObject);

   procedure dbQLasstClick(Sender: TObject);

   procedure dbQNextClick(Sender: TObject);

   procedure dbQPriorClick(Sender: TObject);

   procedure dbQFirstClick(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormDestroy(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure BtnRenderingClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

   procedure InsertAnswer();

   procedure CreateList();

   procedure DestroyObject();

   procedure LoadQuestion();

   procedure LoadAnswer();

   procedure FreeListAnswer();

   procedure ClickIllustrationAnswer(Sender: TObject);

   procedure ClickRadioAnswer(Sender: TObject);

   procedure ClikCheckAnswer(Sender: TObject);

   procedure ClikTextAnswer(Sender: TObject);

   procedure MouseDownAnswerText(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

   procedure SaveAnswer();

   procedure Loadillustration();

   procedure Createillustration();

   procedure ReLoadIllustration();

   procedure SaveillustrationQuestion();

   procedure ClikCheckPropStr(Sender: TObject);

   procedure SetSQuestion();

   procedure Rendering();

   procedure QFirst();

   procedure QPrior();

   procedure QNext();

   procedure QLast();

   procedure QRecNo();//Переход к вопросу номер ...

 

   procedure QSFirst();

   procedure QSPrior();

   procedure QSNext();

   procedure QSLast();

   procedure QSRecNo();

   procedure AFirst();

   procedure ANext();

   procedure ASFirst();

   procedure ASNext();

 end;

var

 Form_Inquirer: TForm_Inquirer;

 AnswerTop: integer;

 PanelList: TList;

 TextList: TList;

 SplitList: TList;

 ImageList: TList;

 CheckList: TLIst;

 CheckStretchList: TLIst;

 RadioList: TList;

 RadioIndex: array[0..1000] of integer;

 CheckIndex: array[0..1000] of integer;

 CheckStretchIndex: array[0..1000] of integer;

 TextIndex: array[0..1000] of integer;

 IllustrationIndex: array[0..1000] of integer;

 SenderRich: TObject;

 IndexQuestion: integer;//Номер вопроса

 IndexAnswer: integer;//Номер ответа на вопрос

 

implementation

{$R *.dfm}

 uses

   unit_private, unit_result;

procedure TForm_Inquirer.dbINextClick(Sender: TObject);

begin

 dm.Query_Illustration.Next;

 ReLoadIllustration();

end;

procedure TForm_Inquirer.dbIPriorClick(Sender: TObject);

begin

 dm.Query_Illustration.Prior;

 ReLoadIllustration();

end;

procedure TForm_Inquirer.AFirst;

begin

 IndexAnswer := 1;

 dm.Query_Answer.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_answer[IndexAnswer];

end;

procedure TForm_Inquirer.ANext;

begin

 Inc(IndexAnswer);

 dm.Query_Answer.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_answer[IndexAnswer];

end;

procedure TForm_Inquirer.ASFirst;

begin

 dm.Query_S_Answer.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_answer[IndexAnswer];

end;

procedure TForm_Inquirer.ASNext;

begin

 dm.Query_S_Answer.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_answer[IndexAnswer];

end;

procedure TForm_Inquirer.ClickIllustrationAnswer;

//обработчик клика на картинке ответа

begin

 ;

end;

procedure TForm_Inquirer.ClickRadioAnswer(Sender: TObject);

//клик на зависемом переключателе ответа

var

 ID: integer;

 ID_ND: integer;

 index: integer;

 Checked: Char;

begin

ID_ND := RadioIndex[TsRadioButton(Sender).Tag];

 index := 0;

 while index < 100 do

   begin

     try

       ID := RadioIndex[TsRadioButton(RadioList.Items[index]).Tag];

       Checked := '0';

       if ID = ID_ND then

       begin

         TsRadioButton(RadioList.Items[index]).Checked := True;

         With dm.Query_S_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE s_answer ') ;

             SQL.Add('SET correct = 1');

             SQL.Add('WHERE id_s_answer =' + IntToStr(ID));

             Active := true;

           end;

       end

       else

       begin

         TsRadioButton(RadioList.Items[index]).Checked := False;

         With dm.Query_S_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE s_answer ') ;

             SQL.Add('SET correct = 0');

             SQL.Add('WHERE id_s_answer =' + IntToStr(ID));

             Active := true;

           end;

       end;

     except

       ;

     end;

     Inc(index);

   end;

end;

procedure TForm_Inquirer.ClikCheckAnswer(Sender: TObject);

//клик на независемом переключателе ответа

var

 ID: integer;

 ID_ND: integer;

 index: integer;

 Checked: Char;

begin

 ID_ND := CheckIndex[TsCheckBox(Sender).Tag];

 index := 0;

 while index < 100 do

   begin

     try

       ID := CheckIndex[TsCheckBox(CheckList.Items[index]).Tag];

       if ID = ID_ND then

       begin

         if TsCheckBox(CheckList.Items[index]).Checked = True then

           Checked := '1'

         else

           Checked := '0';

         With dm.Query_S_Answer do

           begin

             Active := false;

             SQL.Clear;

             SQL.Add('UPDATE s_answer ') ;

             SQL.Add('SET correct = ' + Checked);

             SQL.Add('WHERE id_s_answer =' + IntToStr(ID));

             Active := true;

           end;

       end;

     except

       ;

     end;

     inc(index);

   end;

end;

procedure TForm_Inquirer.ClikCheckPropStr(Sender: TObject);

begin

 ;

end;

procedure TForm_Inquirer.ClikTextAnswer(Sender: TObject);

//клик на поле ткста ответа

begin

 SenderRich := Sender;

end;

procedure TForm_Inquirer.Createillustration;

begin

;

procedure TForm_Inquirer.CreateList;

begin

 // Создание контейнеров Tlist для нумерации компонентов

 TextList := TList.Create;

 PanelList := TList.Create;

 SplitList := TList.Create;

 ImageList := TList.Create;

 CheckList := TLIst.Create;

 CheckStretchList := TLIst.Create;

 RadioList := TList.Create;

end;

procedure TForm_Inquirer.DestroyObject;

begin

 FreeListAnswer();

end;

procedure TForm_Inquirer.dbQCancelClick(Sender: TObject);

begin

 try

   dm.Query_Question.Cancel;

 except

   ;

 end;

 SaveAnswer();

 LoadQuestion();

end;

procedure TForm_Inquirer.dbQFirstClick(Sender: TObject);

//переход на первый вопрос

begin

 QFirst;

 QSFirst;

 LoadQuestion();

 LoadAnswer;

 LoadIllustration();

 ReLoadIllustration();

end;

procedure TForm_Inquirer.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 form_private.Show;

 form_inquirer.Hide;

end;

procedure TForm_Inquirer.FormCreate(Sender: TObject);

begin

 CreateList();

 AnswerTop := 15;

end;

procedure TForm_Inquirer.FormDestroy(Sender: TObject);

begin

 DestroyObject();

end;

procedure TForm_Inquirer.FormShow(Sender: TObject);

begin

 dm.Load_Question();

 QFirst();

 dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

 dm.Load_S_Question;

 QSFirst;

 dm.Last_Selected.id_answer := dm.Query_Answer.FieldByName('id_answer').AsInteger;

 dm.Load_S_Answer;

 ASFirst;

 LoadQuestion();

 LoadAnswer();

 AFirst();

 dm.Load_Illustration;

 dm.Query_Illustration.First;

 ReLoadIllustration();

 PanelAnswer.Width := Round(Form_Inquirer.Width * 0.4);

 DBIllustrationText.Width := Round(BoxIllustration.Width / 2);

end;

procedure TForm_Inquirer.FreeListAnswer;

var

 index: integer;

begin

 // Уничтожаем текст

 index := 0;

 try

   while true do

     begin

       TRichEdit(TextList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем картинки

 index := 0;

 try

   while true do

     begin

       TImage(ImageList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем сплиты

 index := 0;

 try

   while true do

     begin

       TSplitter(SplitList.Items[index]).Free;

       inc(index);

     end;

 except

   ;


 // Уничтожаем радиобт

 index := 0;

 try

   while true do

     begin

       TRadioButton(RadioList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем чекеты

 index := 0;

 try

   while true do

     begin

       TCheckBox(CheckList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем чекеты stretch / proportional

 index := 0;

 try

   while true do

     begin

       TCheckBox(CheckStretchList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // Уничтожаем панели ответов

 index := 0;

 try

   while true do

     begin

       TPanel(PanelList.Items[index]).Free;

       inc(index);

     end;

 except

   ;

 end;

 // чистим листы ..

 try

   TextList.Clear;

   PanelList.Clear;

   SplitList.Clear;

   ImageList.Clear;

   CheckList.Clear;

   CheckStretchList.Clear;

   RadioList.Clear;

   TextList.Free;

   PanelList.Free;

   SplitList.Free;

   ImageList.Free;

   CheckList.Free;

   CheckStretchList.Free;

   RadioList.Free;

 except

   ;

 end;

end;

procedure TForm_Inquirer.dbQGoToNClick(Sender: TObject);

//переход на первый вопрос

begin

 dm.Query_Question.RecNo := StrToInt(N_Question.Text);

 dm.Query_S_Question.RecNo := StrToInt(N_Question.Text);

 LoadQuestion();

 LoadAnswer;

 LoadIllustration();

 ReLoadIllustration();

end;

procedure TForm_Inquirer.InsertAnswer;

// вырисовка...

var

 AnswerText: TRichEdit;

 AnswerPanel: TsPanel;

 AnswerCheck: TsCheckBox;

 AnswerCheckStretch: TsCheckBox;

 AnswerRadio: TsRadioButton;

 AnswerImage: TImage;

 AnswerSplitTop,

 AnswerSplitBottom,

 AnswerSplitRight,

 AnswerSplitLeft: TsSplitter;

 AnswerSplitBottomPole,

 AnswerSplitLeftPole: TsSplitter;

 PictureStream: TStream;

begin

 //Создаю панель ответа

 AnswerPanel := TsPanel.Create(BoxAnswer);

 AnswerPanel.Top := AnswerTop;

 AnswerPanel.Height := Round((BoxAnswer.Height * 40)/100);

 AnswerPanel.Width := BoxAnswer.Width - 25;

 AnswerPanel.Left := 5;

 AnswerPanel.BorderStyle := bsSingle;

 AnswerPanel.BorderWidth := 5;

 AnswerPanel.Color := clSilver;

 AnswerPanel.Tag := PanelList.Add(AnswerPanel);

 BoxAnswer.InsertControl(AnswerPanel);

 //Создаю поле под картинку

 if dm.Query_Answer.FieldByName('illustration').AsVariant <> '' then

   begin

     AnswerImage := TImage.Create(AnswerPanel);

     AnswerImage.Align := alBottom;

     AnswerImage.Height := Round(AnswerPanel.Height / 2 - 6);

     AnswerImage.Picture.Assign(dm.Query_Answer.FieldByName('illustration'));

     if dm.Query_Answer.FieldByName('propstr').AsInteger = 1 then

       begin

         AnswerImage.Proportional := true;

         AnswerImage.Stretch := true;

       end

     else

       begin

         AnswerImage.Proportional := false;

         AnswerImage.Stretch := true;

       end;

     AnswerImage.OnClick := ClickIllustrationAnswer;

     AnswerImage.Tag := ImageList.Add(AnswerImage);

     IllustrationIndex[AnswerImage.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerImage);

   end;

 //Создаю нижний сплит поля

 AnswerSplitBottomPole := TsSplitter.Create(AnswerPanel);

 AnswerSplitBottomPole.Height := 5;

 AnswerSplitBottomPole.Width := 5;

 AnswerSplitBottomPole.Align := alBottom;

 AnswerSplitBottomPole.Tag := SplitList.Add(AnswerSplitBottomPole);

 AnswerPanel.InsertControl(AnswerSplitBottomPole);

 if only_one.Checked then

   begin

     //Создаю зависемый переключатель

     AnswerRadio := TsRAdioButton.Create(AnswerPanel);

     AnswerRadio.Width := 13 ;

     AnswerRadio.Align := alLeft ;

     AnswerRadio.Tag := RadioList.Add(AnswerRadio);

     if dm.Query_S_Answer.FieldByName('correct').AsInteger = 1 then

       begin

         AnswerRadio.Checked := true;

       end

     else

       begin

         AnswerRadio.Checked := false;

       end;

     AnswerRadio.OnClick := ClickRadioAnswer;

     RadioIndex[AnswerRadio.Tag] := dm.Query_S_Answer.FieldByName('id_s_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerRadio);

   end

 else

   begin

     //Создаю независемый переключатель

     AnswerCheck := TsCheckBox.Create(AnswerPanel);

     AnswerCheck.Width := 13 ;

     AnswerCheck.Align := alLeft ;

     if dm.Query_S_Answer.FieldByName('correct').AsInteger = 1 then

       begin

         AnswerCheck.Checked := true;

       end

     else

       begin

         AnswerCheck.Checked := false;

       end;

     AnswerCheck.OnClick := ClikCheckAnswer;

     AnswerCheck.Tag := CheckList.Add(AnswerCheck);

     CheckIndex[AnswerCheck.Tag] := dm.Query_S_Answer.FieldByName('id_s_answer').AsInteger;

     AnswerPanel.InsertControl(AnswerCheck);

   end;

 //Создаю левый сплит

 AnswerSplitLeft := TsSplitter.Create(AnswerPanel);

 AnswerSplitLeft.Height := 5;

 AnswerSplitLeft.Width := 5;

 AnswerSplitLeft.Align := alLeft;

 AnswerSplitLeft.Visible := false;

 AnswerSplitLeft.Tag := SplitList.Add(AnswerSplitLeft);

 AnswerPanel.InsertControl(AnswerSplitLeft);

 //Создаю поле ответа

 AnswerText := TRichEdit.Create(AnswerPanel);

 AnswerText.Align := alClient;

 AnswerText.BorderStyle := bsSingle;

 AnswerText.BorderWidth := 5;

 AnswerText.PopupMenu := MenuAnswer;

 AnswerText.OnClick := ClikTextAnswer;

 AnswerText.OnMouseDown := MouseDownAnswerText;

 AnswerText.Tag := TextList.Add(AnswerText);

 TextIndex[AnswerText.Tag] := dm.Query_Answer.FieldByName('id_answer').AsInteger;

 AnswerPanel.InsertControl(AnswerText);

 AnswerText.PlainText := false;

 AnswerText.ReadOnly := true;

 AnswerText.Lines.Assign(dm.Query_Answer.FieldByName('answer'));

 AnswerTop := AnswerTop + Answerpanel.Height + 10;

end;

procedure TForm_Inquirer.dbQLasstClick(Sender: TObject);

//переход на последний вопрос

begin

 QLast;

 QSLast;

 LoadQuestion();

 LoadAnswer;

 LoadIllustration();

 ReLoadIllustration();

end;

procedure TForm_Inquirer.LoadAnswer;

//прорисовываем ответы на форме

var

 IndexA: integer;

begin

 try

   dm.Load_Answer();

   dm.Load_S_Answer();

   FreeListAnswer();

   CreateList();

   AnswerTop := 10;

   AFirst();

   ASFirst();

   for IndexA := 1 to dm.Navigator.NavigatorQuestion[IndexQuestion].IndexAmax do

     begin

       InsertAnswer();

        ANext();

        ASNext();

     end;

 except

   ;

 end;

end;

procedure TForm_Inquirer.Loadillustration;

begin

 try

   dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

   dm.Load_Illustration;

   dm.Query_Illustration.First;

 except

   ;

 end;

end;

procedure TForm_Inquirer.LoadQuestion;

//загрузка данных вопроса

begin

 dm.Last_Selected.id_s_question := dm.Query_S_Question.FieldByName('id_s_question').AsInteger;

 dm.Load_Answer();

 dm.Load_S_Answer();

 QuestionIllustration.Picture := nil;

end;

procedure TForm_Inquirer.MouseDownAnswerText(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

//Нажатие клавиши мыши в поле ответа

begin

 SenderRich := Sender;

end;

procedure TForm_Inquirer.QFirst;

begin

 IndexQuestion := 1;

 dm.Query_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QLast;

begin

 IndexQuestion := dm.Navigator.IndexQmax;

 dm.Query_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QNext;

begin

 if IndexQuestion <> dm.Navigator.IndexQmax then

   Inc(IndexQuestion);

 dm.Query_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QPrior;

begin

 if IndexQuestion <> 1 then

   Dec(IndexQuestion);

 dm.Query_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QRecNo;

begin

 IndexQuestion := StrToInt(N_Question.Text);

 dm.Query_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QSFirst;

begin

 dm.Query_S_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QSLast;

begin

 dm.Query_S_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QSNext;

begin

 dm.Query_S_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QSPrior;

begin

 dm.Query_S_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.QSRecNo;

begin

 dm.Query_S_Question.RecNo := dm.Navigator.NavigatorQuestion[IndexQuestion].No_question;

end;

procedure TForm_Inquirer.dbIFirstClick(Sender: TObject);

begin

 dm.Query_Illustration.First;

 ReLoadIllustration();

end;

procedure TForm_Inquirer.dbIGoToNClick(Sender: TObject);

begin

 dm.Query_Illustration.RecNo := StrToInt(N_illustration.Text);

 ReLoadIllustration();

end;

procedure TForm_Inquirer.dbILastClick(Sender: TObject);

begin

 dm.Query_Illustration.Last;

 ReLoadIllustration();

end;

procedure TForm_Inquirer.ReLoadIllustration;

begin

 QuestionIllustration.Picture := nil;

 QuestionIllustration.Picture.Assign(dm.Query_Illustration.FieldByName('illustration'));

 QuestionIllustration.Stretch := true;

 QuestionIllustration.Proportional := propstr.Checked;

end;

procedure TForm_Inquirer.Rendering;

begin

;

procedure TForm_Inquirer.SaveAnswer;

begin

 ;

end;

procedure TForm_Inquirer.SaveillustrationQuestion;

begin

;

procedure TForm_Inquirer.BtnRenderingClick(Sender: TObject);

begin

 dm.Rendering();

 dm.SetMark();

 form_result.Show;

 form_result.Result();

 form_inquirer.Hide;

end;

procedure TForm_Inquirer.SetSQuestion;

begin

 dm.Query_Question.First;

 dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

 while not dm.Query_Question.Eof do

   begin

     dm.Create_S_Question();

     dm.Query_Question.Next;

     dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

   end;

end;

procedure TForm_Inquirer.dbQNextClick(Sender: TObject);

//переход на следующий вопрос

 QNext;

 QSNext;

 LoadQuestion();

 LoadAnswer();

 LoadIllustration();

 ReLoadIllustration();

end;

procedure TForm_Inquirer.dbQPostClick(Sender: TObject);

begin

 try

   dm.Query_Question.Post;

 except

   ;

 end;

 SaveAnswer();

 LoadQuestion();

end;

procedure TForm_Inquirer.dbQPriorClick(Sender: TObject);

//переход на предидущий вопрос

begin

 QPrior;

 QSPrior;

 LoadQuestion();

 LoadAnswer;

 LoadIllustration();

 ReLoadIllustration();

end;

procedure TForm_Inquirer.deleteClick(Sender: TObject);

var

 ID: integer;

begin

 try

   ID := TextIndex[TsRichEdit(SenderRich).Tag];

     With dm.Query_Delete do

       begin

         Active := false;

         SQL.Clear;

         SQL.Add('DELETE FROM answer ') ;

         SQL.Add('WHERE id_answer =' + IntToStr(ID));

         Active := true;

       end;

   except

     LoadQuestion();

   end;

end;

end.

unit unit_private;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Buttons, sBitBtn, ComCtrls, sRichEdit, sLabel, sComboBox,

 sGroupBox, sPageControl, DB;

type

 Tform_private = class(TForm)

   PrivatePage: TsPageControl;

   test: TsTabSheet;

   sGroupBox1: TsGroupBox;

   BoxSubject: TsComboBox;

   BoxTheme: TsComboBox;

   sLabel1: TsLabel;

   sLabel2: TsLabel;

   RichSubject: TsRichEdit;

   RichTheme: TsRichEdit;

   testing: TsBitBtn;

   procedure testingClick(Sender: TObject);

   procedure BoxThemeChange(Sender: TObject);

   procedure BoxSubjectChange(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure FormShow(Sender: TObject);

   procedure LoadSubjectBox();

   procedure LoadThemeBox();

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 form_private: Tform_private;

 ID_Subject: array[0..1000] of integer;

 ID_Theme: array[0..1000] of integer;

implementation

 uses

   unit_dm, unit_authentication, unit_inquirer;

{$R *.dfm}

 

procedure Tform_private.BoxSubjectChange(Sender: TObject);

begin

 LoadThemeBox();

 dm.Query_Subject_Box.Locate('subject', BoxSubject.Text, [loPartialKey]);

 RichSubject.Lines.Clear;

 RichSubject.Lines.Assign(dm.Query_Subject_Box.FieldByName('info'));

 dm.Last_Selected.id_subject := ID_Subject[BoxSubject.ItemIndex];

 BoxTheme.Text := 'Выбирите тему';

end;

procedure Tform_private.BoxThemeChange(Sender: TObject);

begin

 dm.Query_Theme_Box.Locate('theme', BoxTheme.Text, [loPartialKey]);

 RichTheme.Lines.Clear;

 RichTheme.Lines.Assign(dm.Query_Theme_Box.FieldByName('info'));

 dm.Last_Selected.id_theme := ID_Theme[BoxTheme.ItemIndex];

end;

procedure Tform_private.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 form_private.Hide;

 form_authentication.Show;

end;

procedure Tform_private.FormShow(Sender: TObject);

begin

 LoadSubjectBox();

 BoxSubject.Text := 'Выбирите предмет';

 BoxTheme.Text := 'Выбирите тему';

end;

procedure Tform_private.LoadSubjectBox;

var

 index: integer;

begin

 try

   dm.Load_Subject_Box();

   BoxSubject.Items.Clear;

   dm.Query_Subject_Box.First;

   index := 0;

   while not dm.Query_Subject_Box.Eof do

     begin

       BoxSubject.Items.Add(dm.Query_Subject_Box.FieldByName('subject').AsString);

       ID_Subject[index] := dm.Query_Subject_Box.FieldByName('id_subject').AsInteger;

       dm.Query_Subject_Box.Next;

       inc(index);

     end;

   dm.Query_Subject_Box.First;

   BoxSubject.Text := dm.Query_Subject_Box.FieldByName('subject').AsString;

   RichSubject.Lines.Assign(dm.Query_Subject_Box.FieldByName('info'));

   dm.Last_Selected.id_subject := ID_Subject[BoxSubject.ItemIndex];

 except

   ;

 end;

end;

procedure Tform_private.LoadThemeBox;

var

 index: integer;

begin

 try

   dm.Load_Theme_Box(BoxSubject.Text);

   BoxTheme.Items.Clear;

   dm.Query_Theme_Box.First;

   index := 0;

   while not dm.Query_Theme_Box.Eof do

     begin

       BoxTheme.Items.Add(dm.Query_Theme_Box.FieldByName('theme').AsString);

       ID_Theme[index] := dm.Query_Theme_Box.FieldByName('id_theme').AsInteger;

       dm.Query_Theme_Box.Next;

       inc(index);

     end;

   dm.Query_Theme_Box.First;

   BoxTheme.Text := dm.Query_Theme_Box.FieldByName('theme').AsString;

   RichTheme.Lines.Assign(dm.Query_Theme_Box.FieldByName('info'));

   dm.Last_Selected.id_theme := ID_Theme[BoxTheme.ItemIndex];

 except

   ;

 end;

end;

procedure Tform_private.testingClick(Sender: TObject);

begin

 if BoxSubject.Text = 'Выбирите предмет'  then

   begin

     ShowMessage('Для продолжения необходимо выбрать предмет !');

     exit;

   end;

 if BoxTheme.Text = 'Выбирите тему'  then

   begin

     ShowMessage('Для продолжения необходимо выбрать тему !');

     exit;

   end;

 try

   dm.Last_Selected.id_subject := ID_Subject[BoxSubject.ItemIndex];

   dm.Last_Selected.id_theme   := ID_Theme[BoxTheme.ItemIndex];

   dm.Create_Navigator();

   dm.Create_Test_New();

 except

   ShowMessage('Неудалось загрузить вопросы. Тема пуста или не существует');

 end;

 dm.Load_Question();

 if dm.Query_Question.IsEmpty then

   begin

     ShowMessage('Неудалось загрузить вопросы. Тема пуста или не существует');

     exit ;

   end;

 form_private.Hide;

 form_inquirer.Show;

 form_inquirer.dbQFirst.OnClick(Sender);

 form_inquirer.dbIFirst.OnClick(Sender);

end;

end.

unit unit_result;

interface

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Buttons, sBitBtn, sMemo, sLabel, sEdit, sGroupBox, unit_dm;

type

 Tform_result = class(TForm)

   Box_Result: TsGroupBox;

   Edit_Name: TsEdit;

   sLabel1: TsLabel;

   Edit_SName: TsEdit;

   sLabel2: TsLabel;

   Edit_Group: TsEdit;

   sLabel3: TsLabel;

   Edit_Subject: TsEdit;

   sLabel4: TsLabel;

   Edit_Theme: TsEdit;

   sLabel5: TsLabel;

   Edit_Mark_100: TsEdit;

   sLabel6: TsLabel;

   Edit_Mark_50: TsEdit;

   sLabel7: TsLabel;

   Edit_Mark_5: TsEdit;

   sLabel8: TsLabel;

   Box_Note: TsGroupBox;

   sLabel9: TsLabel;

   MMessage: TsMemo;

   Btn_Result: TsBitBtn;

   procedure Btn_ResultClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

   procedure Result();

   procedure SendBettaMesage();// Сохранение пожнланий студента

 end;

var

 form_result: Tform_result;

implementation

{$R *.dfm}

uses

 unit_authentication;

procedure Tform_result.Btn_ResultClick(Sender: TObject);

var

 FullProgPath: PChar;

begin

 SendBettaMesage();

 Hide;

 FullProgPath := PChar(Application.ExeName);

 WinExec(FullProgPath, SW_SHOW); // Or better use the CreateProcess function

 Application.Terminate; // or: Close;

end;

procedure Tform_result.Result;

begin

 dm.LoadResult(dm.Last_Selected.id_test);

 Edit_SName.Text := dm.Query_Result.FieldByName('sname').AsString;

 Edit_Name.Text := dm.Query_Result.FieldByName('name').AsString;

 Edit_Group.Text := IntToStr(dm.Query_Result.FieldByName('n_group').AsInteger);

 Edit_Subject.Text := dm.Query_Result.FieldByName('subject').AsString;

 Edit_Theme.Text := dm.Query_Result.FieldByName('theme').AsString;

 Edit_Mark_100.Text := IntToStr(dm.Query_Result.FieldByName('mark_100').AsInteger);

 Edit_Mark_50.Text := IntToStr(dm.Query_Result.FieldByName('mark_5').AsInteger);

 Edit_Mark_5.Text := IntToStr(dm.Query_Result.FieldByName('mark').AsInteger);

end;

procedure Tform_result.SendBettaMesage;

begin

 MMessage.Lines.Insert(0, '--------------------------------------');

 MMessage.Lines.Add('--------------------------------------');

 MMessage.Lines.Add(Edit_SName.Text);

 MMessage.Lines.Add(Edit_Name.Text);

 MMessage.Lines.Add(Edit_Group.Text);

 MMessage.Lines.Add(Edit_Subject.Text);

 MMessage.Lines.Add(Edit_Theme.Text);

 MMessage.Lines.Add(Edit_Mark_100.Text);

 MMessage.Lines.Add(Edit_Mark_50.Text);

 MMessage.Lines.Add(Edit_Mark_5.Text);

 MMessage.Lines.Add('--------------------------------------');

 dm.Load_Betta();

 dm.Query_Betta.Insert;

 dm.Query_Betta.FieldByName('message').Assign(MMessage.Lines);

 dm.Query_Betta.Post;

 MMessage.Lines.Add('--------------------------------------');

end;

end.

unit unit_dm;

interface

 SysUtils, Classes, ZConnection, DB, ZAbstractRODataset,

 ZAbstractDataset, ZDataset, Dialogs, sSkinManager, ExtDlgs, ZSqlMonitor,

 ImgList, Controls, XPMan;

type

  TStudent = record

    id:    integer;

    ngr:   string;

    name:  string;

    sname: string;

    mark: integer;

    mark_5: real;

    mark_100: real;

  end;

  TFSetting = record

   Host: String[100];

   Port: String[100];

   Database: String[100];

   User: String[100];

   Password: String[100];

 end;

 TSelection = record

   id_student: integer;

   id_subject: integer;

   id_theme: integer;

   id_question: integer;

   id_answer: integer;

   id_test: integer;

   id_s_question: integer;

   id_s_answer: integer;

 end;

 TNavigatorQuestion = record

   No_question: integer;

   IndexAmax: integer;

   No_answer: array[1..500] of integer;

 end;

 TNavigator = record

   IndexQmax: integer;

   NavigatorQuestion: array[0..500] of TNavigatorQuestion;

 end;

 Tdm = class(TDataModule)

   ZConnection_spkvtk: TZConnection;

   Query_login: TZQuery;

   Query_Group: TZQuery;

   Query_SName: TZQuery;

   Query_Name: TZQuery;

   SkinManager: TsSkinManager;

   Query_Subject_Box: TZQuery;

   Query_Theme_Box: TZQuery;

   Query_Question: TZQuery;

   Query_Answer: TZQuery;

   Source_Question: TDataSource;

   Source_Answer: TDataSource;

   Query_Illustration: TZQuery;

   Source_Illustration: TDataSource;

   Query_Delete: TZQuery;

   Query_Create: TZQuery;

   Source_Subject: TDataSource;

   Query_Subject: TZQuery;

   Query_Theme: TZQuery;

   Source_Theme: TDataSource;

   OPD: TOpenPictureDialog;

   Query_Select: TZQuery;

   Query_S_Question: TZQuery;

   Query_S_Answer: TZQuery;

   Source_S_Question: TDataSource;

   Source_S_Answer: TDataSource;

   Query_Result: TZQuery;

   SQLMonitor: TZSQLMonitor;

   IList: TImageList;

   Query_Betta: TZQuery;

   Query_Skin: TZQuery;

   Source_Skin: TDataSource;

   OD: TOpenDialog;

   XPManifest1: TXPManifest;

   procedure ReadSetting(FName: String; Var

                         Host,

                         Port,

                         Database,

                         User,

                         Password: String);

   procedure ConnectOpros();

   procedure Load_Group();//Загруска списка груп

   procedure Load_SName(SelectGroup: String);

   procedure Load_Name(SelectSName: String);

   procedure Load_Subject_Box();

   procedure Load_Theme_Box(SelectSubject: String);

   function Load_Answer: Boolean;

   function Load_Illustration: Boolean;

   function Load_Question: Boolean;

   function Query_Subject_Set: boolean;

   function Query_Theme_Set: Boolean;

   procedure Create_Test_New();

   procedure Create_S_Question();

   procedure Create_S_Answer();

   procedure Load_S_Question();

   procedure Load_S_Answer();

   procedure Create_Navigator();//Заполнения навигационного массива

   procedure Rendering();//подсчёт балов

   procedure SetMark();//Занесение результатов тестирования в базу данных

   procedure LoadResult(id_test: integer);//Получение результатов опроса студента

   procedure Load_Betta();//Загрузка таблици пожеланий студентов

   function SaveSkin(Path: String): String;//Сохранение скина на диск

   procedure ApplySkin(FileName: String);//Применяет скин

   procedure LoadSkinOutBD();//Загрузка скина ииз бд

 

 

 private

   { Private declarations }

   Student: TStudent;

 public

   { Public declarations }

   Last_Selected: TSelection;

   Navigator: TNavigator;

   procedure Subject_Select(SelectSubject: String);

   procedure Theme_Select(ThemeSelect: String);

   function log_in(ngr:   String;

                   sname:  String;

                   nam: String): boolean ;

 end;

var

 dm: Tdm;

implementation

unit_start, unit_authentication;

{$R *.dfm}

 

{ Tdm }

 

procedure Tdm.ApplySkin(FileName: String);

var

 Fname: String;

 I: Integer;

 Name: String;

 Path: String;

begin

 Fname := dm.OD.FileName;

 if FileExists( FileName ) then

  begin

     Path := ExtractFilePath(FileName);

     Name := ExtractFileName(FileName);

     Delete( Name, LastDelimiter( '.', Name ), Length( Name ) );

  end

  else

     Name := '';

 dm.SkinManager.SkinDirectory := Path;

 dm.SkinManager.SkinName := Name;

 dm.SkinManager.Active := true;

end;

procedure Tdm.ConnectOpros;

var

 Host: String;

 Port: String;

 Database: String;

 User: String;

 Password: String;

begin

 try

   ReadSetting(ExtractFilePath(ParamStr(0))+'mysql.stg', Host, Port, Database, User, Password);

   ZConnection_spkvtk.HostName := Host;

   ZConnection_spkvtk.Port := StrToInt(Port);

   ZConnection_spkvtk.Database := Database;

   ZConnection_spkvtk.User := User;

   ZConnection_spkvtk.Password := Password;

 except

   ShowMessage('Ошибка файла конфигурации');

   form_authentication.Close;

 end;

 try

   Zconnection_spkvtk.Connected := true;

 except

   ShowMessage('Ошибка подключения к базе данных');

   form_authentication.Close;

 end;

end;

procedure Tdm.Load_Betta();

begin

   try

   With Query_Betta do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT * FROM betta');

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Create_Navigator;

//Заполнения навигационного массива

var

 IndexQuestion: integer;

 IndexAnswer: integer;

 Index: integer;

 IndexRndQuestion: array[1..500] of integer;

 I: integer;

 RndQuestion: boolean;

begin

     dm.Load_Question();

     Navigator.IndexQmax := dm.Query_Question.RecordCount;

     dm.Query_Question.First;

     for Index := 1 to Navigator.IndexQmax do

       begin

         Repeat

           RndQuestion := true;

           Randomize();

           IndexRndQuestion[Index] := Round( Random() * (Navigator.IndexQmax - 1) + 1);

           I := 1;

           While ( I < Index ) do

             begin

               if IndexRndQuestion[Index] = IndexRndQuestion[I] then

                 RndQuestion := false;

               Inc(I);

             end;

         Until ( RndQuestion = true );

       end;

      

     for IndexQuestion := 1 to Navigator.IndexQmax do

       begin

         Navigator.NavigatorQuestion[IndexRndQuestion[IndexQuestion]].No_question := dm.Query_Question.RecNo;

         dm.Load_Answer();

         Navigator.NavigatorQuestion[IndexRndQuestion[IndexQuestion]].IndexAmax := dm.Query_Answer.RecordCount;

         dm.Query_Answer.First;

         for IndexAnswer := 1 to Navigator.NavigatorQuestion[IndexRndQuestion[IndexQuestion]].IndexAmax do

           begin

             Navigator.NavigatorQuestion[IndexRndQuestion[IndexQuestion]].No_answer[IndexAnswer] := dm.Query_Answer.RecNo;

             dm.Query_Answer.Next;

           end;

         dm.Query_Question.Next;

       end;

end;

procedure Tdm.Create_S_Answer;

begin

 try

   With Query_Create do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('INSERT INTO s_answer(id_s_question, id_answer)');

       SQL.Add('VALUE(' + IntToStr(last_Selected.id_s_question) + ', ' + IntToStr(last_Selected.id_answer) + ')');

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Create_S_Question;

begin

 try

   With Query_Create do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('INSERT INTO s_question(id_test, id_question)');

       SQL.Add('VALUE(' + IntToStr(Last_Selected.id_test) + ', ' +

                          IntToStr(Last_Selected.id_question) + ')');

       Active := true;

     end;

 except

   ;

 end;

 try

   With Query_Create do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT MAX(id_s_question) AS max');

       SQL.Add('FROM s_question');

       Active := true;

       Last_Selected.id_s_question := FieldByName('max').AsInteger;

     end;

 except

   ;

 end;

end;

procedure Tdm.Create_Test_New;

var

 IndexQuestion: integer;

 IndexAnswer: integer;

begin

 try

   With Query_Create do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('INSERT INTO test(id_student, id_subject, id_theme, date_begin, time_begin)');

       SQL.Add('VALUE(' + IntToStr(Last_Selected.id_student) + ', ' +

                          IntToStr(Last_Selected.id_subject) + ', ' +

                          IntToStr(Last_Selected.id_theme) +   ', ' +

                          'CURDATE(), '                             +

                          'TIME(NOW()) )');

       Active := true;

     end;

 except

   ;

 end;

 try

   With Query_Create do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT MAX(id_test) AS max');

       SQL.Add('FROM test');

       Active := true;

       Last_Selected.id_test := FieldByName('max').AsInteger;

     end;

 except

   ;

 end;

 dm.Load_Question();

 dm.Query_Question.First;

 for IndexQuestion := 1 to Navigator.IndexQmax do

   begin

     dm.Load_Answer();

     dm.Query_Answer.First;

     dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

     dm.Create_S_Question();

     for IndexAnswer := 1 to Navigator.NavigatorQuestion[IndexQuestion].IndexAmax do

       begin

         dm.Last_Selected.id_answer := dm.Query_Answer.FieldByName('id_answer').AsInteger;

         dm.Create_S_Answer();

         dm.Query_Answer.Next;

       end;

     dm.Query_Question.Next;

   end;

end;

procedure Tdm.DataModuleCreate(Sender: TObject);

begin

 dm.ConnectOpros();

 dm.LoadSkinoutBD();

 Sleep(2000);

 Form_authentication.Show;

 Form_Start.Hide;

end;

procedure Tdm.Load_Group;

begin

 try

   With Query_Group do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT DISTINCT n_group');

       SQL.Add('FROM student');

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_Name(SelectSName: String);

begin

 try

   With Query_Name do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT id_student, name');

       SQL.Add('FROM student');

       SQL.Add('WHERE sname=''' + SelectSName+ '''');

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_SName(SelectGroup: String);

begin

 try

   With Query_SName do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT id_student, sname');

       SQL.Add('FROM student');

       SQL.Add('WHERE n_group= ' + SelectGroup);

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_Subject_Box;

begin

 try

   With Query_Subject_Box do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT subject, id_subject, info');

       SQL.Add('FROM subject');

       SQL.Add('WHERE subject.access = 1');

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_S_Answer;

begin

 try

   With Query_S_Answer do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM s_answer') ;

       SQL.Add('WHERE id_s_question = ' + IntToStr(Last_Selected.id_s_question));

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Load_S_Question;

begin

 try

   With Query_S_Question do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM s_question') ;

       SQL.Add('WHERE id_test = ' + IntToStr(Last_Selected.id_test));

       Active := true;

     end;

   ;

 end;

end;

procedure Tdm.Load_Theme_Box(SelectSubject: String);

begin

 try

   With Query_Theme_Box do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('SELECT theme.theme, theme.id_theme, info');

       SQL.Add('FROM theme');

       SQL.Add('WHERE theme.id_subject IN(');

       SQL.Add('SELECT subject.id_subject ' );

       SQL.Add('FROM subject ');

       SQL.Add('WHERE (subject.subject = ''' + SelectSubject +''' ) and (theme.access = 1))');

       Active := true;

     end;

 except

   ;

 end;

end;

function Tdm.log_in(ngr, sname, nam: String): boolean;

begin

 log_in := true;

 try

   With Query_login do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('select * from student where ');

       SQL.Add('student.n_group=' + ngr + ' and ');

       SQL.Add('student.sname="' + sname + '" and ');

       SQL.Add('student.name="' + nam + '"');

       Active := true;

       if Query_login.IsEmpty then log_in := false;

       Student.id := FieldByName('id_student').AsInteger;

       Last_Selected.id_student := Student.id;

     end;

 except

   log_in := false;

 end;

end;

procedure Tdm.ReadSetting(FName: String; var Host, Port, Database, User, Password: String);

var

 FSetting: File of TFSetting;

 Setting: TFSetting;

begin

 AssignFile(FSetting, FName);

 Reset(FSetting);

 Read(FSetting, Setting);

 Host := Setting.Host;

 port := Setting.Port;

 user := Setting.User;

 password := Setting.Password;

 database := Setting.Database;

 CloseFile(FSetting);

end;

procedure Tdm.Rendering;

var

 IndexQuestion: integer;

 IndexAnswer: integer;

 markanswer: real;

 markquestion: real;

 ncorrect: integer;

 correct: integer;

begin

 dm.Load_Question();

 dm.Load_S_Question();

 dm.Query_Question.First;

 dm.Query_S_Question.First;

 dm.Last_Selected.id_s_question := dm.Query_S_Question.FieldByName('id_s_question').AsInteger;

 markanswer := 0;

 markquestion := 0;

 for IndexQuestion := 1 to dm.Query_Question.RecordCount do

   begin

     dm.Last_Selected.id_question := dm.Query_Question.FieldByName('id_question').AsInteger;

     dm.Load_Answer();

     dm.Last_Selected.id_s_question := dm.Query_S_Question.FieldByName('id_s_question').AsInteger;

     dm.Load_S_Answer();

     dm.Query_Answer.First;

     dm.Query_S_Answer.First;

     if dm.Query_Question.FieldByName('only_one').AsInteger = 1 then //Если один ответ

       begin

         markanswer := 100;

         for IndexAnswer := 1 to dm.Query_Answer.RecordCount do

           begin

             if dm.Query_Answer.FieldByName('correct').AsInteger <> dm.Query_S_Answer.FieldByName('correct').AsInteger then

             markanswer := 0;

             dm.Query_Answer.Next;

             dm.Query_S_Answer.Next;

           end;

         markquestion := markquestion + markanswer;

         dm.Query_Question.Next;

         dm.Query_S_Question.Next;

       end

     else //если ответов много

       begin

         correct := 0;

         ncorrect := 0;

         for IndexAnswer := 1 to dm.Query_Answer.RecordCount do

           begin

             if dm.Query_Answer.FieldByName('correct').AsInteger <> dm.Query_S_Answer.FieldByName('correct').AsInteger then

               ncorrect := ncorrect + 1;

             if dm.Query_Answer.FieldByName('correct').AsInteger = 1 then

               correct := correct + 1;

             dm.Query_Answer.Next;

             dm.Query_S_Answer.Next;

           end;

         if correct - ncorrect > 0 then

           begin

             markanswer := (100 * (correct - ncorrect)) / correct;

           end

         else

           markanswer := 0;

         markquestion := markquestion + markanswer;

         dm.Query_Question.Next;

         dm.Query_S_Question.Next;

       end;

   end;

 Student.mark_100 := markquestion / dm.Query_Question.RecordCount;

 Student.mark_5 := (5 * Student.mark_100) / 100;

 if (Student.mark_100 <= 31) and (Student.mark_100 >= 0) then

   Student.mark := 2;

 if (Student.mark_100 <= 55) and (Student.mark_100 >= 32) then

   Student.mark := 3;

 if (Student.mark_100 <= 74) and (Student.mark_100 >= 56) then

   Student.mark := 4;

 if (Student.mark_100 <= 100) and (Student.mark_100 >= 75) then

   Student.mark := 5;

end;

function Tdm.SaveSkin(Path: String): String;

var

 FileName: String;

begin

 try

   FileName := Path + dm.Query_Skin.FieldByName('name').AsString + '.asz';

   (dm.Query_Skin.FieldByName('skin') as TBlobField).SaveToFile(FileName);

   SaveSkin := FileName;

 except

   ;

 end;

end;

procedure Tdm.SetMark;

begin

 try

   With Query_Create do

     begin

       Active := false ;

       SQL.Clear;

       SQL.Add('UPDATE test SET date_end = CURDATE(), time_end = TIME(NOW()), mark = ' + IntToStr(Student.mark) + ' , mark_5 = ' + IntToStr(Round(Student.mark_5)) + ' , mark_100 = ' + IntToStr(Round(Student.mark_100)) + ' WHERE id_test = ' + IntToStr(Last_Selected.id_test));

       Active := true;

     end;

 except

   ;

 end;

end;

procedure Tdm.Subject_Select(SelectSubject: String);

begin

 ;

end;

procedure Tdm.Theme_Select(ThemeSelect: String);

begin

 ;

end;

procedure Tdm.LoadResult(id_test: integer);

begin

 try

   With Query_Result do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM student, subject, theme, test ') ;

       SQL.Add('WHERE test.id_test = ' + IntToStr(id_test) );

       SQL.Add('  AND test.id_student = student.id_student');

       SQL.Add('  AND test.id_subject = subject.id_subject');

       SQL.Add('  AND test.id_theme = theme.id_theme');

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения информации об тестировании');

 end;

end;

procedure Tdm.LoadSkinOutBD;

var

 path: string;

begin

   With Query_Skin do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM skin') ;

       SQL.Add('WHERE priority in (Select max(priority) FROM skin)' );

       Active := true;

       if Eof then Exit;

       Path := ExtractFilePath(ParamStr(0)) + 'temp\';

       ApplySkin(SaveSkin(Path));

     end;

 except

   //ShowMessage('Ошибка получения списка вопросов')

 end;

end;

function Tdm.Load_Answer: Boolean;

//Загрузка ответа на вопрос

begin

 Load_Answer := true;

 try

   With Query_Answer do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Answer') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   //ShowMessage('Ошибка получения списка вопросов');

   Load_Answer := false;

 end;

end;

function Tdm.Load_Illustration: Boolean;

// загрузка иллюстраций к вопросу

begin

 Load_Illustration := true;

 try

   With Query_illustration do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM q_illustration ') ;

       SQL.Add('WHERE id_question=' + IntToStr(Query_Question.FieldByName('id_question').AsInteger));

       Active := true;

     end;

 except

   //ShowMessage('Ошибка получения списка иллюстраций');

   Load_illustration := false;

 end;

end;

function Tdm.Load_Question: Boolean;

//чтение вопросов по предмету

begin

 Load_Question := true;

 try

   With Query_Question do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * ') ;

       SQL.Add('FROM Question') ;

       SQL.Add('WHERE id_theme=' + IntToStr(Last_Selected.id_theme));

       Active := true;

     end;

 except

   //ShowMessage('Ошибка получения списка вопросов');

   Load_Question := false;

 end;

end;

function Tdm.Query_Subject_Set: boolean;

//Получение списка предметов

begin

 Query_Subject_Set := true;

 try

   With Query_Subject do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM Subject ') ;

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка предметов');

   Query_Subject_Set := false;

 end;

end;

function Tdm.Query_Theme_Set: Boolean;

//Получение списка тем по даному предмету

var

 id_subject: Integer;

begin

 Query_Theme_Set := true;

 try

   id_subject := Query_Subject.FieldByName('id_subject').AsInteger;

   With Query_Theme do

     begin

       Active := false;

       SQL.Clear;

       SQL.Add('SELECT * FROM theme WHERE id_subject = ' + IntToStr(id_subject));

       Active := true;

     end;

 except

   ShowMessage('Ошибка получения списка тем по данному предмету');

   Query_Theme_Set := false;

 end;

end;

end.

Приложение В

 

SQL запросы для создания базы данных тестирования

drop database spkvtk ;

create database spkvtk CHARACTER SET "utf8";

use spkvtk ;

create table subject(

  id_subject            int         auto_increment,

  subject            varchar(255)                           not null,

  access     boolean                                       default false,

  info                 longblob,

  primary key(id_subject)

);

create table theme(

  id_theme         int              auto_increment,

  id_subject       int                          not null,

  theme                varchar(255)                 not null,

  maximum            tinyint                                 default 5,

  mix_question  boolean                                          default true,

  access     boolean                                       default false,

  info                 longblob,

  primary key(id_theme),

  foreign key(id_subject) references subject(id_subject) on delete cascade

);

create table question(

  id_question      int         auto_increment,

  id_theme         int                          not null,

  question         longblob,

  only_one         boolean                                       default true,

  mix_answer       boolean                                       default true,

  primary key(id_question),

  foreign key(id_theme) references theme(id_theme) on delete cascade

);

create table q_illustration(

  id_q_illustration int              auto_increment,

  id_question          int,

  illustration  longblob,

  propstr       boolean                                          default true,

  description   longblob,

  primary key(id_q_illustration),

  foreign key(id_question) references question(id_question) on delete cascade

);

create table answer(

  id_answer              int         auto_increment,

  id_question      int                          not null,

  answer        longblob,

  illustration  longblob,

  propstr       boolean                      default true,

  correct            boolean                                     default false,

  primary key(id_answer),

  foreign key(id_question) references question(id_question) on delete cascade


create table student(

  id_student       int         auto_increment,

  name                 varchar(255)                                        not null,

  sname                varchar(255)                                        not null,

  n_group          smallint                                        not null,

  primary key(id_student)

);

create table test(

  id_test            int              auto_increment,

  id_student       int                                                 not null,

  id_subject       int                                                 not null,

  id_theme         int                                                 not null,

  date_begin          date                         not null,

  date_end            date,

  time_begin    time                         not null,

  time_end      time,

  mark          int,

  mark_5        decimal(6, 2),

  mark_100      decimal(6, 2),

  primary key(id_test),

  foreign key(id_subject) references subject(id_subject) on delete cascade,

  foreign key(id_theme)   references theme(id_theme)     on delete cascade

);

create table s_question(

  id_s_question   int         auto_increment,

  id_question           int                         not null,

  id_test             int                         not null,

  primary key(id_s_question),

  foreign key(id_test)     references  test(id_test)         on delete cascade,

  foreign key(id_question) references  question(id_question) on delete cascade

);

create table s_answer(

  id_s_answer           int        auto_increment,

  id_s_question   int                         not null,

  id_answer               int                         not null,

  correct            boolean                                     default false,

  primary key(id_s_answer),

  foreign key(id_s_question) references  s_question(id_s_question) on delete cascade,

  foreign key(id_answer)     references  answer(id_answer)         on delete cascade

);

create table user(

  id_user       int         auto_increment,

  user          varchar(255)                  not null,

  password      varchar(255)                  not null,

  access        varchar(255)                  not null,

  name          varchar(255),

  sname         varchar(255),

  patronymic    varchar(255),

  primary key(id_user)

);

create table betta(

  id_betta        int         auto_increment,

  message              longblob,

  primary key(id_betta)

);

create table skin(

  id_skin         int         auto_increment,

  name          varchar(255),

  skin                 longblob,

  info           longblob,

  priority    int,

  primary key(id_skin)

);

Похожие работы на - Разработка распределенного программного обеспечения для контроля знаний студентов

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!