Пояснительная записка к программе-оболочке для проведения лабораторных работ по физике - rita.netnado.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
I. Пояснительная записка к рабочей программе по литературе для 5... 4 579.98kb.
2012 – 2013 учебный год пояснительная записка рабочая программа по... 3 388.26kb.
По биологии (базовый уровень) мкоу залипьевская оош ккласс 1 109.85kb.
Пояснительная записка к календарно- тематическому планированию по... 1 207.02kb.
Пояснительная записка к рабочей программе по физической культуре... 1 361.64kb.
Пояснительная записка к рабочей программе по Обществознанию 10 класс 1 419.75kb.
1. пояснительная записка к образовательной программе … 6 656.99kb.
Пояснительная записка Курс «гиа на 5» разработан мною на основе следующих... 1 122.29kb.
Пояснительная записка статус документа 1 177.92kb.
Класс Темы лабораторных или практических работ 1 189.71kb.
Пояснительная записка к программе курса 2 681.56kb.
2 курс ргф преп. Блинова М. П 1 119.92kb.
Публичный отчет о деятельности моу кассельская сош 2 737.71kb.
Пояснительная записка к программе-оболочке для проведения лабораторных работ по физике - страница №1/1

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

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОУ ВПО Череповецкий государственный университет


Институт информационных технологий

Кафедра: Программное обеспечение ВТ и АС

Дисциплина: Программирование на языках высокого уровня






ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к программе-оболочке

для проведения лабораторных работ по физике



Разработал Гнусов Н.А.


Студент группы 1-СПО11

(Подпись)________________




Череповец 2009


СОДЕРЖАНИЕ

Введение


1 Назначение и область применения

2 Технические характеристики

2.1 Постановка задачи на разработку программы

2.2 Описание алгоритма и (или) функционирования программы

2.3 Описание и обоснование выбора метода организации входных и выходных данных

2.4 Описание и обоснование выбора состава технических и программных средств

3 Ожидаемые технико-экономические показатели

Литература

Приложение А. Техническое задание

Приложение Б. Руководство пользователя

Приложение В. Блок-схема алгоритма

Приложение Г. Текст программы


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

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

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

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

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

1 Назначение и область применения

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

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

Область применения программного продукта не ограничивается использованием его на дисциплине «Физика». Программа может быть использована и при выполнении лабораторных работ по другим предметам, таких как «Химия»(при написании соответствующих модулей). Программа может быть использована не только в институтах, но и в школах, техникумах, училищах. По ней, преподаватели, не имея специального оборудования, смогут показывать проведение того или иного опыта.



2 Технические характеристики

2.1 Постановка задачи на разработку программы

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

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

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

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

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


Рис. 2.2.1 – Общий вид оболочки


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

Рис. 2.2.2 – Форма лабораторной работы


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

Рис 2.2.3 – Формы выбора лабораторной работы

Данная форма предоставляется пользователю при загрузке программы и при выборе другой лабораторной работы. После нажатия кнопки «Выбрать», пользователю отображается окно, представленное на рисунке 2.2.1. Окно в центре – окно помощника, предоставляющего интерфейс для начала работы.

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

Для реализации оболочки применены стандартные компоненты, такие как Combobox, Button, SpeedButton, MainMenu. Программа является MDI-приложением.
2.3 Описание и обоснование выбора метода организации

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

Первоначально система берет значения двух функций, берущихся из dll. Это функции: DllInfo (возвращает название лабораторной работы), DllAuthor (возвращает имя создателя dll). Обе функции возвращают данные типа string.

Так же входными данными для системы является форма, вызываемая из dll (функция CreateMDI). Данная функция возвращает объект класса TForm. На рисунке 2.3.1 представлен пример формы модуля.

Рис. 2.3.1 – Пример формы модуля


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

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



2.4 Описание и обоснование выбора состава технических и программных средств

Для реализации программы была использована среда разработки IDE Delphi 7. Данная среда зарекомендовала себя как надежная, проверенная временем среда разработки.

Программа разрабатывается по ОС Windows XP/Vista. Так же возможен запуск в ОС Linux из под программы Wine.

Системные требования сводятся к следующим: ОС семейства Windows; процессор – Intel Pentium 533 MHz; ОЗУ – 128 Mb; видеокарта – VGA-совместимая с разрешением не ниже 800*600; 50 Mb места на диске.




2.5 Состав программного продукта
Программа-оболочка для работы с лабораторными работами состоит из следующих модулей.
Таблица 1 – Состав модулей программного продукта

Наименование

Описание

PhysLab

Главный модуль. Объединяет все остальные модули, создает объект класса TApplication, показывает splashscreen.

MainUnit

Главная форма приложения.

Splash

Заставка при загрузке программы (splash-screen).

Wizard

Форма помощника.

LabChoiseUnit

Форма выбора лабораторной работы.

AboutUnit

Форма «О программе»

DllExplorerUnit

Модуль, содержащий функции для работы с dll. Позволяет экранировать dll-функции.

FunctionsUnit

Модуль, содержащий часто применяемые функции и переменные.

Таблица 2 – Основные процедуры и функции программы



Наименование

Описание

function TMainForm.ShowIntroForm(): TIntroForm;

Сканирует открытые окна: при наличии Помощника активирует его, иначе – создает.

function TMainForm.ShowExperimentForm(): TForm;

Сканирует открытые окна: при наличии окна опыта активирует его, иначе – создает.

function TMainForm.CloseExperimentForm(): TForm;

Сканирует открытые окна: при наличии окна опыта закрывает его.

procedure TMainForm.FormCreate(Sender: TObject);

Ставит в заголовок название лабораторной работы, инициализирует форму

procedure TMainForm.FormDestroy(Sender: TObject);

Очистка памяти от dll при закрытии формы

Продолжение таблицы 2



Наименование

Описание

procedure TMainForm.ManualItemClick(Sender: TObject);

Вызов справки по лабораторной работе.

procedure TMainForm.ItemLabChoseClick(Sender: TObject);

Выбор другой лабораторной работы

procedure GetHelp();

Вызов справки по работе с программой.

procedure ExitProgram();

Спрашивает у пользователя о закрытии программы.

function GetDllInfo(FName:string):string;

Возвращает название ЛР из dll

function GetAuthorInfo(FName:string):string;

Возвращает имя автора модуля из dll

procedure GetLabWindow(FName:string);

Инициализирует форму лабораторной работы из dll.

Переменные и константы, используемые в приложении:

LabName: string; - название текущей лабораторной работы;

LabFile: string; - имя текущего файла-модуля;

Labs : array [1..100] of TLabs; - массив записей имеющихся модулей;

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



2.6 Тестирование программы
Для любого серьезного проекта просто необходим такой этап как тестирование. Без него практическое применение проекта может быть сорвано из-за ошибок в разработке. Результаты проведенных тестов представлены в таблице 2.
Таблица 2 – Результаты тестирования программы

опыта

Описание алгоритма действия

Входные данные

Полученные данные

Итог

1

Запуск программы. выбор и загрузка модуля

модуль test.dll

модуль test.dll

модуль test2.dll



Успешно

2

Запуск программы, выбор модуля, вызов справки

файл справки test.chm

файл справки test.chm

Успешно

3

Запуск программы, выбор модуля, выбор другого модуля

модуль test.dll

модуль test2.dll



модуль test.dll

модуль test2.dll



Были обнаружены ошибки в использовании памяти. Ошибки успешно устранены.

4

Запуск программы с поврежденным модулем dll




Сообщение некорректном модуле.

Успешно

3 Ожидаемые технико-экономические показатели

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

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

Литература
1 «Delphi 7», Хомоненко А., Никифоров В., Гофман В., Мещеряков Е.,

серия: "В подлиннике", 2004 г., Изд.: БХВ-Петербург

2 «Приемы программирования в Delphi на основе VCL», Архангельский А.Я., Изд: Бином-Пресс, 2009 г.

3 «Delphi на примерах», А.Маслобоев, В.Пестриков, Изд.: БХВ-Петербург, 2005 г.



ПРИЛОЖЕНИЕ А

(справочное)

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


Введение

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

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

1 Основания для разработки

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


2 Назначение

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

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

3 Требования к программному изделию

3.1 Требования к функциональным характеристикам

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

- просмотр всех внешних модулей;

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

- выполнение лабораторной работы из модуля;

Для поставленных задач должно быть реализовано:

- сканирование модулей в специальной папке

- загрузка справки, форм, данных из модуля;

- корректная и безошибочная работа с оперативной памятью.

3.2 Требования к надежности

Для обеспечения надежности работы системы необходимо:

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

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

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

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



3.3 Условия эксплуатации

Программа должна работать локально под ОС Windows XP и выше. Возможен запуск программы из под приложения Wine в ОС Linux.


3.4 Требования к аппаратной и информационной совместимости

Для клиентских систем требуется установленная ОС семейства Windows, начиная от Windows 2000 и выше, аппаратная часть: процессор Pentium III и выше, 256 Mb ОЗУ, 300 Мб на свободного места на жестком диске..


4 Требования к программной документации

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

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

п/п

Название этапа

Срок

Ответственность

Отчетность

1

Разработка ядра системы

(оболочки)



3 недели

Гнусов Н.А.


Реализация системы на уровне интерфейса, описание внутренних форматов, интерфейсов

2

Написание отладочного модуля-заглушки

2 дня

Гнусов Н.А.

Реализация необходимых функций в модуле, необходимых и достаточных для тестирования оболочки

3

Тестирование

3 дня

Смирнов В.В.

Отчет по найденным ошибкам в программе.

4

Разработка модулей системы




В зависимости от лабораторной работы

Разработка формы для ввода данных, расчета и моделирования того или иного лабораторного оборудования

5

Доработка всей системы




Гнусов Н.А.

Смирнов В.В.



Предоставление на тестирование готового программного продукта

6

Внедрение системы







Внедрение системы в эксплуатацию

7

Техническая поддержка











ПРИЛОЖЕНИЕ Б

(обязательное)

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

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

Текущее руководство распространяется на оболочку в целом. Конкретные модули не затрагиваются.
Описание установки

Что бы установить программу, необходимо распаковать архив в любую директорию. Для добавления модулей в программу, необходимо добавить файл модуля и файл справки в папку «modules» данной программы.


Описание запуска

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


Информация по работе

Первые шаги

После запуска программы Вы увидите окно выбора лабораторной работы (рис. 1), где из выпадающего списка Вам необходимо выбрать нужную Вам лабораторную работу после чего и нажать кнопку «Ок» или «Enter».


Рис. 1 – Выбор лабораторной работы


После выбора лабораторной работы откроется основное окно программы «PhysLab». При запуске главного окна автоматически запустится окно помощника (рис. 2), откуда Вы можете вызвать общую справку по программе, теоретические сведения по выбранной лабораторной работе или начать выполнять работу. Все эти пункты помощника дублируются в главном меню программы по разделам.


Рис. 2 – Главное окно программы


Проведение опытов

Нажав кнопку «Выполнение работы» на экране появится лабораторной работы, где первоначально необходимо ввести требуемые входные данные, а затем приступит к ее выполнению (рис. 4).


Рис. 3 – Пример формы лабораторной работы



Общая информация

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


ПРИЛОЖЕНИЕ В

(справочное)

Блок-схемы основных алгоритмов

procedure TLabChoise.FormCreate(Sender: TObject); (сканирует папку modules на наличие dll файлов и загружаем их в combobox)






function TMainForm.ShowExperimentForm(): TForm; // Сканирует открытые окна и при наличии окна опыта активирует его, иначе – создает


ПРИЛОЖЕНИЕ Г

(справочное)

Текст программы

unit MainUnit;

{ главная форма }
interface
uses

Windows, shellApi,Messages, ShareMem, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, ExtCtrls, Menus, ComCtrls, Splash, Wizard,

LabChoiseUnit, DllExplorerUnit, FunctionsUnit, ClipBrd;


type

TMainForm = class(TForm)

MainMenu: TMainMenu;

ItemFileContainer: TMenuItem;

ItemExit: TMenuItem;

ItemExperimentContainer: TMenuItem;

ItemStartExperiment: TMenuItem;

ItemHelpContainer: TMenuItem;

ItemHelp: TMenuItem;

ItemAbout: TMenuItem;

MaualItem: TMenuItem;

ItemIntroForm: TMenuItem;

MainStatusBar: TStatusBar;

ItemLabChose: TMenuItem;

procedure ItemIntroFormClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

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

procedure ItemStartExperimentClick(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure ItemExitClick(Sender: TObject);

procedure ManualItemClick(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure ItemAboutClick(Sender: TObject);

procedure ItemLabChoseClick(Sender: TObject);

procedure ItemHelpClick(Sender: TObject);

private


{ Private declarations }

public


// Сканирует открытые окна и при наличии Помощника активирует его, иначе - создает

function ShowIntroForm(): TIntroForm;

// Сканирует открытые окна и при наличии окна опыта активирует его, иначе - создает

function ShowExperimentForm(): TForm;

// Сканирует открытые окна и при наличии окна опыта закрывает его

function CloseExperimentForm(): TForm;


end;
var

MainForm: TMainForm;

LibHandle: THandle;
implementation
uses AboutUnit;

{$R *.dfm}

// Сканирует открытые окна и при наличии Помощника активирует его, иначе - создает

function TMainForm.ShowIntroForm(): TIntroForm;

var

i: integer;



bFound: boolean;

iIndex: integer;

begin

bFound := False;



for i := 0 to MainForm.MDIChildCount - 1 do begin

if MainForm.MDIChildren[i] is TIntroForm then begin

bFound := True;

iIndex := i;

end;

end;


if bFound then begin

Result := (MainForm.MDIChildren[iIndex] as TIntroForm);

(MainForm.MDIChildren[iIndex] as TIntroForm).Show();

end


else begin

IntroForm := TIntroForm.Create(Application);

Result := IntroForm;

IntroForm.Show;

end;

end;
// Сканирует открытые окна и при наличии окна опыта активирует его, иначе - создает



function TMainForm.ShowExperimentForm(): TForm;

var


i: integer;

bFound: boolean;

iIndex: integer;

begin


bFound := False;

for i := 0 to MainForm.MDIChildCount - 1 do begin

if MainForm.MDIChildren[i].ClassName = 'TLabRunForm' then begin

bFound := True;

iIndex := i;

end;


end;

if bFound then begin

Result := (MainForm.MDIChildren[iIndex] as TForm);

(MainForm.MDIChildren[iIndex] as TForm).Show()

end

else begin



XForm := TForm(CreateMDI);

Result := XForm;

XForm.Show;

end;


end;
// Сканирует открытые окна и при наличии окна опыта закрывает его

function TMainForm.CloseExperimentForm(): TForm;

var

i: integer;



bFound: boolean;

iIndex: integer;

begin

Result := nil;



bFound := False;

for i := 0 to MainForm.MDIChildCount - 1 do begin

if MainForm.MDIChildren[i].ClassName = 'TLabRunForm' then begin

bFound := True;

iIndex := i;

end;


end;

if bFound then begin

Result := (MainForm.MDIChildren[iIndex] as TForm);

(MainForm.MDIChildren[iIndex] as TForm).Free();

end

end;
// Нажатие кнопки вызова помощника в меню



procedure TMainForm.ItemIntroFormClick(Sender: TObject);

begin


ShowIntroForm();

end;
// ставит в заголовок название лобраторной, инициализирует форму

procedure TMainForm.FormCreate(Sender: TObject);

var result : TModalResult;

lab :integer;

begin
UnsavedData:=false;


LabChoise := TLabChoise.Create(Application);

result := LabChoise.ShowModal;

if not(result = TModalResult(mrOK)) then ExitProcess(0);
lab:=LabChoise.cbLabs.ItemIndex;
LabName := LabChoise.Labs[lab].Name;

LabFile := LabChoise.Labs[lab].FileName;


Caption := LabName;
GetLabWindow(LabFile);

end;
// событие "при закрытии формы". Выдает вопрос о закрытии

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

var buttonSelected: integer;

begin

buttonSelected:= MessageBox (Handle, 'Вы хотите выйти?', 'PhysLab' , MB_ICONQUESTION+MB_YESNO);



if buttonSelected = IDYES then

ExitProcess(0)

else

Action:=caNone;



end;

// Нажатие кнопки вызова формы проведения опыта в меню

procedure TMainForm.ItemStartExperimentClick(Sender: TObject);

begin


ShowExperimentForm();

end;
// при уничтожении формы очищает память от dll

procedure TMainForm.FormDestroy(Sender: TObject);

begin


DonePlugin;

FreeLibrary(FLib);

end;

procedure TMainForm.ItemExitClick(Sender: TObject);



begin

ExitProgram();

end;
// вызов справки по лабораторной работе

procedure TMainForm.ManualItemClick(Sender: TObject);

var hlpfilename: string;

DirHelp: PChar;

begin

hlpfilename:=LabChoise.Labs[LabChoise.cbLabs.ItemIndex].FileName;



Delete(hlpfilename, integer(strlen(PAnsiChar(hlpfilename)))-3, integer(strlen(PAnsiChar(hlpfilename))));

hlpfilename:=hlpfilename+'.chm';


DirHelp:=PChar(ExtractFilePath(Application.ExeName)+'modules/'+hlpfilename);

ShellExecute(Handle,'open',DirHelp,nil,nil,SW_SHOW);

end;

// при показе формы запуск помощника



procedure TMainForm.FormShow(Sender: TObject);

begin
IntroForm := TIntroForm.Create(Application);

IntroForm.Show;
end;
// вызов окна "О программе"

procedure TMainForm.ItemAboutClick(Sender: TObject);

begin

AboutBox.ShowModal;



end;

// выбор другой лабораторной работы

procedure TMainForm.ItemLabChoseClick(Sender: TObject);

var result : TModalResult;

lab :integer;

begin
LabChoise := TLabChoise.Create(Application);

result := LabChoise.ShowModal;

if not(result = TModalResult(mrOK)) then exit;


CloseExperimentForm();
DonePlugin;

//FreeLibrary(FLib);


lab:=LabChoise.cbLabs.ItemIndex;
LabName := LabChoise.Labs[lab].Name;

LabFile := LabChoise.Labs[lab].FileName;


Caption := LabName;
GetLabWindow(LabFile);

ShowIntroForm();

end;

// вызов справки о программе



procedure TMainForm.ItemHelpClick(Sender: TObject);

begin


GetHelp();

end; end.



unit LabChoiseUnit;

{ форма выбора лаботраторной работы }
interface

uses


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

Dialogs, StdCtrls, XPMan, DllExplorerUnit;


type TLabs=record

Name : string;

FileName : string;

end;


type

TLabChoise = class(TForm)

cbLabs: TComboBox;

btnOk: TButton;

XPMan: TXPManifest;

btnCancel: TButton;

lblInfo: TLabel;

procedure FormCreate(Sender: TObject);

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

private
public

Labs : array [1..100] of TLabs;

end;
var

LabChoise: TLabChoise;

implementation


{$R *.dfm}
// сканируем папку modules на наличие dll файлов и загружаем их в combobox

procedure TLabChoise.FormCreate(Sender: TObject);

var SR:TSearchRec; // поисковая переменная

FindRes:Integer; // переменная для записи результата поиска

founded: boolean;

i:integer;

tmpname : string;

begin


KeyPreview := True;

founded:=false;

i:=0;

cbLabs.Clear; // очистка компонента перед занесением в него списка файлов



FindRes:=FindFirst('modules\*.dll',faAnyFile,SR); // задание условий поиска и начало поиска

While FindRes=0 do // пока мы находим файлы (каталоги), то выполнять цикл

begin

tmpname:=GetDllInfo(SR.Name);



if Length(tmpname)>0 then begin

founded:=true;

Labs[i].Name:=tmpname;

Labs[i].FileName:=SR.Name;

cbLabs.Items.Add(Labs[i].Name+' ('+Labs[i].FileName+')'); // добавление в список название найденного элемента

FindRes:=FindNext(SR); // продолжение поиска по заданным условиям

i:=i+1;

end;


end;

FindClose(SR); // закрываем поиск

cbLabs.ItemIndex:=0;

if not(founded) then

begin

MessageDlg('Лабораторные работы не найдены!'+#13+'Программа завершит свое выполнение!',mtError, [mbYes], 0);



ExitProcess(0);

end;


end;
// реализация управления на клавишах

procedure TLabChoise.FormKeyPress(Sender: TObject; var Key: Char);

begin

if key = #27 then ModalResult:=mrCancel;



if key = #13 then ModalResult:=mrOK;

end; end.


unit FunctionsUnit;

{ в текущем модуле лежат общие функции и переменные,

используемые несколькими юнитами}

interface


uses

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

Forms, Dialogs, Buttons, XPMan, StdCtrls;
procedure GetHelp();

procedure ExitProgram();

var UnsavedData : boolean;

LabName: string;

LabFile: string;

implementation


uses MainUnit;
// процедура выхода из программы - перед выходом спрашивает разрешения на выход

procedure ExitProgram();

var

buttonSelected: integer;



begin

buttonSelected := MessageBox (MainForm.Handle, 'Вы хотите выйти?', 'PhysLab' , MB_ICONQUESTION+MB_YESNO);

if buttonSelected = IDYES then

ExitProcess(0);

end;

// универсальная процедура вызова справки о программе



procedure GetHelp();

var hlpfilename: string;

DirHelp: PChar;

Handle : THandle;

begin

hlpfilename:='help.chm';


DirHelp:=PChar(ExtractFilePath(Application.ExeName)+hlpfilename);

ShellExecute(Handle,'open',DirHelp,nil,nil,SW_SHOW);


end; end.
unit DllExplorerUnit;

{ модуль, в котором находятся все функции, связанные с dll }
interface

uses


Windows, Messages, ShareMem, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, ExtCtrls, Menus, ComCtrls, Common;


type

TInitProc = procedure(App, Scr: integer); StdCall;

TDoneProc = procedure; StdCall;

TCreateProc = function: TForm; StdCall;


// функции, экранирующие работу с dll

// взвращает название лабораторной работы из dll

function GetDllInfo(FName : string): string;

// взвращает автора модуля из dll

function GetAuthorInfo(FName : string): string;

// инициализирует форму лабораторной работы из dll

procedure GetLabWindow(FName : string);

var LibHandle: THandle;

DllInfo : function():string;

CurrentDllName : string;

CurrentLabName : string;

FLib : THandle;

InitPlugin : TInitProc;

DonePlugin : TDoneProc;

CreateMDI : TCreateProc;

XForm: TForm;


// ExperimentWindow : TExperimentForm;

implementation


// взвращасет название лабораторной работы из dll

function GetDllInfo(FName:string):string;

var LabName : string;

DllInfo : function():string; stdcall;

begin
LabName:='';

DllInfo:=nil;

LibHandle := LoadLibrary(PAnsiChar('modules\'+FName));
if LibHandle >= 32 then

begin


DllInfo:= GetProcAddress(LibHandle,'DllInfo');

if @DllInfo <> nil then begin

LabName:=DllInfo;

end


end;

result:=LabName;

CurrentLabName:=LabName;

FreeLibrary(LibHandle);

end;

// взвращает автора модуля из dll



function GetAuthorInfo(FName:string):string;

var LabAuthor : string;

DllAuthor : function():string; stdcall;

begin
LabAuthor:='';

DllAuthor:=nil;

LibHandle := LoadLibrary(PAnsiChar('modules\'+FName));


if LibHandle >= 32 then

begin


DllAuthor:= GetProcAddress(LibHandle,'DllAuthor');

if @DllAuthor <> nil then

LabAuthor:=DllAuthor

else


LabAuthor:='Неизветсный';
end;

result:=LabAuthor;

CurrentLabName:=LabAuthor;

FreeLibrary(LibHandle);

end;

// инициализирует форму лабораторной работы из dll

procedure GetLabWindow(FName:string);

begin
FLib := LoadLibrary(PChar('modules\'+FName));

@InitPlugin := GetProcAddress(FLib, PChar('InitPlugin'));

@DonePlugin := GetProcAddress(FLib, PChar('DonePlugin'));

@CreateMDI := GetProcAddress(FLib, PChar('CreateMDI'));

InitPlugin(integer(Application), integer(Screen));

end; end.
unit Splash;

{ spalshscreen - экранная заставка перез запуском программы}
interface
uses

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

Dialogs, jpeg, ExtCtrls;
type

TSplashScreen = class(TForm)

SplashImage: TImage;

private


{ Private declarations }

public


{ Public declarations }

end;
var

SplashScreen: TSplashScreen;
implementation
{$R *.dfm}

end.
unit Wizard;



{ форма помощника: вызывается после выбора лабораторной работы либо из меню}
interface
uses

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

Forms, Dialogs, Buttons, XPMan, StdCtrls, FunctionsUnit,DllExplorerUnit;
type

TIntroForm = class(TForm)

sbmanual: TSpeedButton;

XPManifest1: TXPManifest;

sbhelp: TSpeedButton;

sbwork: TSpeedButton;

lblmannual: TLabel;

lblrunwork: TLabel;

lblhelp: TLabel;

sbexit: TSpeedButton;

lblexit: TLabel;

GBIntro: TGroupBox;

procedure sbexitClick(Sender: TObject);

procedure sbmanualClick(Sender: TObject);

procedure sbworkClick(Sender: TObject);

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

procedure sbhelpClick(Sender: TObject);

private


{ Private declarations }

public


{ Public declarations }

end;
var

IntroForm: TIntroForm;
implementation
uses LabChoiseUnit, MainUnit;
{$R *.dfm}
procedure TIntroForm.sbexitClick(Sender: TObject);

begin


ExitProgram();

end;
// вызов справки по лабораторной работе

procedure TIntroForm.sbmanualClick(Sender: TObject);

var hlpfilename: string;

DirHelp: PChar;

begin


hlpfilename:=LabChoise.Labs[LabChoise.cbLabs.ItemIndex].FileName;

Delete(hlpfilename, integer(strlen(PAnsiChar(hlpfilename)))-3, integer(strlen(PAnsiChar(hlpfilename))));

hlpfilename:=hlpfilename+'.chm';
DirHelp:=PChar(ExtractFilePath(Application.ExeName)+'modules/'+hlpfilename);

ShellExecute(Handle,'open',DirHelp,nil,nil,SW_SHOW);

Close;

end;
// вызов формы с ЛР из dll



procedure TIntroForm.sbworkClick(Sender: TObject);

begin


MainForm.ShowExperimentForm();

Close;


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

begin


Action := caFree;

end;
// вызов справки по программе

procedure TIntroForm.sbhelpClick(Sender: TObject);

begin


GetHelp();

end; end.


unit AboutUnit;

{ форма "о программе" }

interface


uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,

Buttons, ExtCtrls, DllExplorerUnit, FunctionsUnit, jpeg;


type

TAboutBox = class(TForm)

Panel1: TPanel;

ProgramIcon: TImage;

ProductName: TLabel;

Version: TLabel;

Copyright: TLabel;

Comments: TLabel;

OKButton: TButton;

lblyear: TLabel;

procedure FormShow(Sender: TObject);

private


{ Private declarations }

public


{ Public declarations }

end;
var

AboutBox: TAboutBox;
implementation
{$R *.dfm}
// берем из dll автора модула

procedure TAboutBox.FormShow(Sender: TObject);

begin

Comments.Caption:='Автор модуля: '+GetAuthorInfo(LabFile);



end;

end.
program PhysLab;


uses

ShareMem,

Windows,

Forms,


DllExplorerUnit in 'DllExplorerUnit.pas',

MainUnit in 'MainUnit.pas' {MainForm},

Wizard in 'Wizard.pas' {IntroForm},

Splash in 'Splash.pas' {SplashScreen},

LabChoiseUnit in 'LabChoiseUnit.pas' {LabChoise},

FunctionsUnit in 'FunctionsUnit.pas',

AboutUnit in 'AboutUnit.pas' {AboutBox};
{$R *.res}

begin


Application.Initialize;

Application.Title := 'Лабораторная работа по физике';


// вызов spalshscreen
SplashScreen := TSplashScreen.Create(Application);

SplashScreen.Show;

SplashScreen.Refresh;

// задержка

sleep(2000*2);
// удаление

splashscreen.free;


Application.CreateForm(TMainForm, MainForm);

Application.CreateForm(TAboutBox, AboutBox);



Application.Run;

end.