Создание информационного банка данных Больница

Министерство образования и науки Республики Казахстан

Карагандинский государственный технический университет



























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

ЗАПИСКА

к курсовому проекту

по дисциплине: «Разработка программного обеспечения»

тема: Создание информационного банка данных «Больница»



















Караганда, 2009


Содержание



Введение

		ТЕХНИЧЕСКОЕ ЗАДАНИЕ

	1.2 Основание для создания

1.3 Цель и назначение подсистемы

1.4 Требования к подсистеме

1.5 Требования к информационному обеспечению

1.6 Требования к лингвистическому обеспечению

1.7 Требования к программному обеспечению

1.8 Требования к техническому обеспечению

1.9 Требования к методическому обеспечению

2. ИНФОРМАЦИОННОЕ ОБЕСПЕЧЕНИЕ

2.1 Структура информационных потоков

2.2 Логическая модель базы данных

2.3 Физическая модель базы данных

3. ЛИНГВИСТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ

3.1 Языки программирования

3.2 Входные – выходные данные

4.3 Выходные языки

4. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

4.1 Общесистемное программное обеспечение

4.2 Базовое программное обеспечение

4.3 Прикладное программное обеспечение

5. МЕТОДИЧЕСКОЕ ОБЕСПЕЧЕНИЕ

5.1 Руководство пользователю

Заключение

Список использованной литературы

Приложение А

Приложение В

Приложение С

Приложение D


Введение



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


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



1.1 Наименование ПК (программного комплекса) и область применения



1.1.1 Разработке подлежит программное обеспечение «Больница»

1.1.2 Данный ПК предназначен для использования больницах

1.1.3 Наименование ПК: программа, позволяющая управлять базой данных пациентов по отделению и номеру палат



1.2 Основание для создания



1.2.1 Обоснования для проведения разработки: основанием для разработки является задание, выданное кафедрой САПР. 

1.2.2 Разработчики ПО: Нарымбекова А., Терехова Е.

1.2.3 Заказчик ПО: кафедра САПР.

1.2.4 Сроки разработки: начало – 01.10.2006 г., окончание – 23.12.2006 г.



1.3 Цель и назначение подсистемы



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

1.3.2 В настоящее время инфраструктура больницы стала очень объёмной, что не позволяет справляться со всеми проблемами, которые появляются в результате работы. Для упрощения было бы полезно разработать программный комплекс, который значительно облегчит процесс поиска, записи, выписки пациента.



1.4 Требования к подсистеме



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



1.5 Требования к информационному обеспечению



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

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

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



1.6 Требования к лингвистическому обеспечению



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

1.6.2 Язык программирования должен быть языком высокого уровня.

1.6.3 Входной язык должен:

– обеспечивать удобочитаемость и компактность описаний;

– должен быть простым в использовании.

1.6.4 Выходной язык должен:

– в наглядной форме предоставлять данные решения задач;

– обеспечивать соответствие результатов проектирования требованиям задачи. 



1.7 Требования к программному обеспечению



1.7.1 Программное обеспечение должно содержать описание общесистемного, базового и прикладного ПО.

1.7.2 В качестве операционных систем должны использоваться Windows, поскольку такие установлены на компьютерах кафедры САПР.

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



1.8 Требования к техническому обеспечению



1.8.1 Техническое обеспечение должно быть выбрано на основе комплекса технических средств кафедры САПР.

1.8.2 Комплекс технических средств должен быть построен на базе ПЭВМ IBM PC или совместимых с ней.

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

1.9 Требования к методическому обеспечению



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


2. Информационное обеспечение



2.1 Структура информационных потоков и документооборота



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





медсестра

выписка

База данных

регисрации

Результаты поиска

поиск

изменения

Рисунок 1.1. Структура информационных потоков медсестры







База данных

удаление и 

добавление

отделений, палат

койкомест







врач





результаты

программы





Рисунок 1.2. Структура информационных потоков врача

2.2 Логическая модель базы данных





otdelenie



№otdel



kolpalat

palata



№otdel2



№palat



1

∞

famil



№palat



№famil

1

∞

palata



№otdel2



№palat



famil



№palat



№famil



lkpalata2



lkotdelenie2



lk№otdel2



☼

~

~

☼

~

☻

☻

~

☼

~

☼

~

*

*

*

*

*

*



2.3 Физическая модель базы данных



Физическая модель базы данных представлена на рисунке в таблице 2.3. Здесь указывается тип каждого поля, его размер. А так же первичные индексы (уникальность, сортировка) и вторичные индексы (связь 1 ко ∞).



Таблица 1. Структура таблицы Pacients.db

Имя поля

Тип

Данные

Индекс 1 

Индекс 2

Famil

Alpha [25]

Фамилия

*



№palat

Long integer

№ палаты

*

*

Diagnoz

Alpha [80]

Диагноз





DataPostup

data

Дата поступления





№famil

autoincrement

счетчик





Таблица 2. Структура таблицы Otdel.db

Имя поля

Тип

Данные

Индекс 1 

Индекс 2

Otdelenie

Alpha [30]

Отделение

*



№otdel

autoincrement

счетчик





Kol_palat

short

Количество палат







Таблица 3. Структура таблицы Palata.db

Имя поля

Тип

Данные

Индекс 1 

Индекс 2

Palata

Alpha [10]

Отделение

*



№otdel2

Long integer

№отделения

*

*

№palat

autoincrement

Счетчик





Kol_pacient

short

Кол. пациентов





Kol_mest

short

Кол. мест






3. Лингвистическое обеспечение



3.1 Языки программирования



Язык ObjectPascal является одним из высокоразвитых языков объектно-ориентированного программирования. И среди других, например, таких как Visual Basic или Visual C++, отличается простотой программного кода, достаточным количеством литературы по этому языку.

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

1) Инкапсуляция. Комбинирование записей с процедурами и функциями, манипулирующими полями этих записей, формирует новый тип данных - объект.

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

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

Теперь уже программист оперирует не просто процедурами и функциями, а целыми объектами.

Объект – совокупность свойств и методов и событий. Что означает «совокупность»? Это значит, что объект состоит из свойств методов и событий.

Свойства – это простые переменные, которые влияют на состояние объекта. Например, ширина, высота – это свойства объекта.

Методы – это те же процедуры и функции, т.е. это то, что объект умеет делать (вычислять). Например, объект может иметь процедуру для вывода какого-то текста на экран. Эта процедура и есть метод объекта.

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

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

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

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

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

Конструкция, имеющая линии управления, ведущие к предыдущим операциям или развилкам, называется циклом.

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

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

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

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

Программа на языке ObjectPascal может использовать блоки кода в программных модулях. Модуль можно рассматривать как мини-программу, которую может использовать ваша прикладная программа. Как и программа, он имеет заголовок (который называется заголовком модуля) и основной блок, ограниченный begin и end.

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



3.2 Входные – выходные данные



Общение с базой данных осуществляется табличным диалогом в экранных формах. 

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

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





больница

база знаний

мышь

клавиатура

монитор

Рисунок 4.1 – Работа экспертной системы в режиме консультации



Разработка сценария диалога

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



Главное меню

Поле для просмотра и выбора

данных

Таблица редактирования

данных



Поле для просмотра данных





Рисунок 3.2 – Схема главного окна (медсестра).

Кнопочная часть

Поле ввода информации для поиска по фамилии

Поле ввода информации для поиска по дате

Поле отображения найденной информации



	Рисунок 3.3– Схема окна поиска

Таблица редактирования данных

Таблица редактирования данных




4. Программное обеспечение



4.1 Общесистемное программное обеспечение



На сегодняшний момент операционная система Windows фирмы Microsoft во всех ее проявлениях, бесспорно, считается самой распространенной операционной системой на ПК: в мире более 150 млн. IBM PC-совместимых компьютеров, и система Windows установлена на 100 млн. из них.

ОС Windows характеризуется тем, что предоставляет приложениям возможность создания пользовательского интерфейса на высоком уровне эргономичности и удобства. В то же время, для работы этой системы требуется от 16 до 128 Мб оперативной памяти в зависимости от версии ОС, что по современным техническим возможностям совсем не много.

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



4.2 Базовое программное обеспечение



В качестве базового ПО принята среда Delphi 7.0 языка программирования ObjectPascal. Пакет Delphi 7.0 установлен на кафедре САПР и стабильно работает под системой Windows XP Professional.

Среди наиболее распространенных объектно-ориентированных сред программирования, Delphi 7.0 является на данный момент единственной средой быстрой разработки приложений (RAD), полностью поддерживающей все ведущие индустриальные стандарты: XML, SOAP, WSDL и XSL, а также появляющиеся платформы – Microsoft.NET и BizTalk, Sun Microsystems ONE, обеспечивая необходимую гибкость, надежность и масштабируемость.

Основной упор в Delphi делается на максимальном реиспользовании кода. Это позволяет разработчикам строить приложения весьма быстро из заранее подготовленных объектов, а также дает им возможность создавать свои собственные объекты для среды Delphi. Никаких ограничений по типам объектов, которые могут создавать разработчики, не существует. Действительно, все в Delphi написано на нем же, поэтому разработчики имеют доступ к тем же объектам и инструментам, которые использовались для создания среды разработки. В результате нет никакой разницы между объектами, поставляемыми Borland или третьими фирмами, и объектами, которые вы можете создать.

Библиотека визуальных компонент (объектов) включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами, управление DDE и OLE. 

Delphi использует структурный объектно-ориентированный язык (Object Pascal), который сочетает с одной стороны выразительную мощь и простоту программирования, а с другой стороны эффективность языка. Программисты немедленно могут начать производить работающие приложения, и им не придется для этого изучать особенности программирования событий в Windows. Delphi полностью поддерживает передовые программные концепции, включая инкапсуляцию, наследование, полиморфизм и управление событиями. 

Основные причины выбора языка ObjectPascal:

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

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

– Объектно-ориентированное программирование (ООП) в визуальной среде. 

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

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

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



4.3 Прикладное программное обеспечение



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






Модуль «Unit2»





Модуль «UnitFilter»



Проект





Модуль «UnitGlavVrach»



База данных





Модуль «UnitMedSestra»





Модуль «Unitpassword»





Рисунок 3.1 – Структура прикладного ПО



Таблица 3. Основные файлы программы

Файлы

Назначение

Unit2.pas

исходный файл с модулем для формы «Unit2»

UnitFilter.pas

исходный файл с модулем для формы «UnitFilter»

UnitGlavVrach.pas

исходный файл с модулем для формы «UnitGlavVrach»

UnitMedSestra.pas

исходный файл с модулем для формы «UnitMedSestra»

UnitPassword.pas

исходный файл с модулем для формы «UnitPassword»

ProjectHospital.dpr

исходный файл проекта

ProjectHospital.exe

автономный исполнимый файл, запускающий приложение



Модуль «Unit2» проекта «Больница» служит приветствием проекта. Модуль «UnitMedSestra» обеспечивает основную работу программы, «UnitFiter» обеспечивает поиск информации, «UnitGlavVrach» обеспечивает работу программы для врача и «UnitPassword» обеспечивает защиту информации.



Наименование процедуры (функции)

Краткое описание

Модуль «Unit2»

procedure TForm2.FormPaint

Закрашивание формы при запуске программы

Модуль «UnitMedSestra»

Procedure N1Click

Вызов формы с паролем

procedure mnFindClick

Вызов формы для поиска пациента

procedure tbPalataBeforeDelete

Каскадное удаление палаты при отсутствие в ней пациентов

procedure tbOtdelBeforeDelete

Каскадное удаление отделения, если все палаты пустые 

procedure tbPalataAfterPost

После создания палаты создаем список пациентов в ней путем копирования из списка отделения

procedure tbPacientAfterPost

После добавления пациента в палату она на одного занимается

procedure tbOtdelAfterScroll

После выбора отделения обновляется поле списка для выбора палаты

procedure tbPalataBeforeDelete

Невозможно удалить палату при наличие в ней пациентов

procedure tbOtdelBeforeDelete

Невозможно удалить отделение пока все палаты не пустые

 procedure tbPacientBeforeInsert

Блокируется добавление записи при вызове из сетки

procedure FormCanResize



procedure FormClose



procedure FormShow



Модуль «UnitFilter»

procedure btnFilterClick

Поиск пациента по дате

procedure btnFamilClick

Поиск пациента по фамилии

procedure FormShow



procedure FormCanResize



Модуль «UnitPassword»

procedure FormShow



procedure Timer1Timer

Появление формы с паролем

Таблица 1. Основные процедуры и функции




5. Методическое обеспечение



5.1 Руководство пользователю



После запуска приложения на экране появляется заставка программы (см. Рисунок 2).





Рисунок 2. Заставка приложения



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





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



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





Рисунок 5. Поиск студента



В этой форме необходимо нажать кнопку «фамилия», если поиск производится по фамилии, затем задать фамилию пациента и нажать ОК, или если поиск производится по дате, нажать «дата» и ввести количество дней. Пример поиска показан на Рисунке 6 (а) и (б).





	Рисунок 6(а) Поиск по фамилии

	

	

	Рисунок 6 (б). Поиск по дате

	

	После осуществления поиска при щелчке по одному из найденных пациентов, в главной форме произойдет локализация на данном пациенте (см. Рисунок 7).

	

	

	 

	

	

	

	

	

	

	

	Рисунок 7. Пример поиска

	

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

	

	

	Рисунок 8. Форма с паролем

	

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

	

	

	Рисунок 9. форма для главврача


Заключение



База данных «Больница», разработанная в ходе выполнения проекта, является актуальной на сегодняшний день, так как все больницы нуждаются в автоматизации управления. Нами были приобретены навыки программирования на языке Object Pascal в среде Delphi 7.0. Также мы научились разрабатывать собственные алгоритмы для решения поставленных задач, овладели методами и средствами отладки и тестирования программ.

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


Список используемой литературы

	

	А.Я. Архангельский Программирование в Delphi 7

		А. Микляев «Учебник пользователя IBM PC», Москва – 2000

	
Приложение А

	

	Листинг модуля «Unit2.pas»

	

	procedure TForm2.FormPaint(Sender: TObject);

	var y:integer; red:byte;

	const text='База данных больницы';

	begin

	with Canvas do

	begin

	 for y := 0 to Form2.Height-1 do

	 begin

	 red:=round($FF*(Form2.Height-y)/Form2.Height);

	 pen.Color:=rgb(red,0,0);

	 moveTo(0,y);

	 LineTo(Form2.Width-1,y)

	 end; // for

	 Font.Size:=32;

	 Font.Style:=[fsBold,fsItalic,fsUnderLine];

	 Font.Name:='Times New Roman Cyr';

	 Brush.Style:=bsClear;

	 Font.Color:=clBlack;

	 TextOut(40,30,Text); 

	 Font.Color:=clWhite;

	 TextOut(36,26,Text);

	end;// with

	

	end;

	

	procedure TForm2.Button1Click(Sender: TObject);

	begin

	close

	end;


Приложение B



Листинг модуля «UnitMedSestra.pas»



procedure TFormMedSestra.N1Click(Sender: TObject);

begin

FormDeactivate(Self);

if (FormPassword.ShowModal=mrOk) and

(FormPassword.Edit1.Text='1') then

FormGlavVrach.Showmodal;

FormActivate(Self);

end;



procedure TFormMedSestra.FormShow(Sender: TObject);

begin

tbOtdel.Open;

tbPalata.Open;

tbPacient.Open;

form2.ShowModal;

DBLookupComboBox1.KeyValue:=tbOtdel.fieldByName('Notdel').AsInteger

end;



procedure TFormMedSestra.FormClose(Sender: TObject;

 var Action: TCloseAction);

begin

tbOtdel.Close;

tbPalata.Close;

tbPacient.Close; 

end;



procedure TFormMedSestra.tbPacientAfterDelete(DataSet: TDataSet);

begin // после удаления пациента палата на одного освобождается

tbPalata.Edit;

tbPalata.FieldByName('Kol_pacient').AsInteger:=

tbPalata.FieldByName('Kol_pacient').AsInteger-1;

tbPalata.Post; 

if FormFilter.Visible then // если поисковая форма видима - информация на ней должна быть актуальна

begin

 FormFilter.tbPalata2.Refresh;

 FormFilter.tbPacient2.Refresh;

end;

end;



procedure TFormMedSestra.tbPacientBeforePost(DataSet: TDataSet);

begin // невозможно сохранить запись с пустыми полями: "фамилия и диагноз"

PacSt:= tbPacient.State;

if tbPacient.FieldByName('Famil').AsString='' then

 if tbPacient.FieldByName('Diagnoz').AsString='' then

 begin

 tbPacient.Cancel;

 Abort

 end

 else

 begin

 ShowMessage('Введите фамилию');

 Abort

 end

end;



procedure TFormMedSestra.tbPacientAfterPost(DataSet: TDataSet);

begin // после добавления(но не после редактирования) пациента палата на одного занимается

if PacSt=dsInsert then begin

tbPalata.Edit;

tbPalata.FieldByName('Kol_pacient').AsInteger:=

tbPalata.FieldByName('Kol_pacient').AsInteger+1;

tbPalata.Post;

end;

if FormFilter.Visible then // если поисковая форма видима - информация на ней должна быть актуальна

begin

 FormFilter.tbPalata2.Refresh;

 FormFilter.tbPacient2.Refresh;

end;



end;



procedure TFormMedSestra.tbPacientBeforeInsert(DataSet: TDataSet);

begin // невозможно добавить пациента, если вся палата занята

if tbPalata.FieldByName('Kol_pacient').AsInteger=

 tbPalata.FieldByName('Kol_mest').AsInteger then abort;

end;



procedure TFormMedSestra.tbPacientNewRecord(DataSet: TDataSet);

begin // маленький сервис с вставкой текущей даты при добавлении пациента(уменьшается вероятность ошибки при вводе даты)

tbPacient.FieldByName('DataPostup').AsDateTime:=now;

end;



procedure TFormMedSestra.mnFindClick(Sender: TObject);

begin

FormFilter.Show

end;



procedure TFormMedSestra.tbOtdelAfterScroll(DataSet: TDataSet);

begin

if tbOtdel.fieldByName('Notdel').AsInteger>0 then // без этой проверки добавление отделения

 // в DBGrid стрелкой вниз не выполняется

DBLookupComboBox1.KeyValue:=tbOtdel.fieldByName('Notdel').AsInteger;

StaticText1.Caption:=tbOtdel.fieldByName('Kol_palat').AsString;

end;



procedure TFormMedSestra.tbPalataAfterScroll(DataSet: TDataSet);

begin

if tbPalata.fieldByName('Npalat').AsInteger>0 then // без этой проверки добавление палаты

 // в DBGrid стрелкой вниз не выполняется

DBLookupListBox1.KeyValue:=tbPalata.fieldByName('Npalat').AsInteger

end;



procedure TFormMedSestra.tbPalataBeforeDelete(DataSet: TDataSet);

begin

if tbPalata.FieldByName('Kol_Pacient').AsInteger>0 then

begin

 windows.beep(400,200);

 windows.beep(200,200);

 ShowMessage('удаление палаты не возможно при наличии в ней пациентов');

 abort

end;

end; 



procedure TFormMedSestra.tbPalataAfterDelete(DataSet: TDataSet);

begin

tbOtdel.Edit;

tbOtdel.FieldByName('Kol_palat').AsInteger:=

tbOtdel.FieldByName('Kol_palat').AsInteger-1;

tbOtdel.Post

end;



procedure TFormMedSestra.tbOtdelBeforeDelete(DataSet: TDataSet);

begin

tbPalata.First;

while not tbPalata.Eof do

begin

 if tbPalata.FieldByName('Kol_Pacient').AsInteger >0 then

 begin

 windows.beep(400,200);

 windows.beep(500,200);

 windows.beep(600,200);

 ShowMessage('невозможно удалить отделение, так как не все палаты пустые');

 abort;

 end;

 tbPalata.Next

end; // палаты каскадно будут удаляться, если ни в одной из них не пациентов

while not tbPalata.Bof do tbPalata.Delete

end;



procedure TFormMedSestra.tbPalataBeforePost(DataSet: TDataSet);

begin

if tbPalata.FieldByName('Kol_mest').AsInteger < tbPalata.FieldByName('Kol_pacient').AsInteger then

begin

 windows.beep(500,200);

 windows.beep(300,200);

 windows.beep(200,200);

 ShowMessage('количество койкомест нельзя делать меньше, чем количество пациентов');

 abort;

end;

PalSt:=tbPalata.State

end;



procedure TFormMedSestra.tbPalataAfterPost(DataSet: TDataSet);

begin

if PalSt=dsInsert then begin

tbOtdel.Edit;

tbOtdel.FieldByName('Kol_palat').AsInteger:=

tbOtdel.FieldByName('Kol_palat').AsInteger+1;

tbOtdel.Post;

end;

end;



procedure TFormMedSestra.DBLookupComboBox1DropDown(Sender: TObject);

begin // при выпадении списка, StaticText1 - черное на белом

StaticText1.Font.Color:=clBlack;

StaticText1.Color:=clWhite

end;



procedure TFormMedSestra.DBLookupComboBox1CloseUp(Sender: TObject);

begin // при захлопывании списка, StaticText1 - белое на синем

StaticText1.Font.Color:=clWhite;

StaticText1.Color:=clHighLight

end;



procedure TFormMedSestra.DBLookupComboBox1Exit(Sender: TObject);

begin // при потере фокуса, StaticText1 - черное на белом

StaticText1.Font.Color:=clBlack;

StaticText1.Color:=clWhite

end;



procedure TFormMedSestra.DBLookupComboBox1Enter(Sender: TObject);

begin // при получении фокуса, StaticText1 - белое на синем

StaticText1.Font.Color:=clWhite;

StaticText1.Color:=clHighLight

end;



procedure TFormMedSestra.FormDeactivate(Sender: TObject);

begin // при деактивации формы и если список в фокусе, StaticText1 - черное на белом

if FormMedSestra.ActiveControl= DBLookupComboBox1 then

begin

 StaticText1.Font.Color:=clBlack;

 StaticText1.Color:=clWhite

end;

end;



procedure TFormMedSestra.FormActivate(Sender: TObject);

begin // при активации формы и если список в фокусе, StaticText1 - белое на синем

if FormMedSestra.ActiveControl= DBLookupComboBox1 then

begin

 StaticText1.Font.Color:=clWhite;

 StaticText1.Color:=clHighLight

end;

end;



procedure TFormMedSestra.FormCanResize(Sender: TObject; var NewWidth,

 NewHeight: Integer; var Resize: Boolean);

begin

NewWidth:=width

end;




Приложение C



Листинг модуля «UnitPassword»



procedure TFormPassword.FormShow(Sender: TObject);

begin

AlphaBlendValue:=0;

Timer1.Enabled:=true;

edit1.SetFocus;

edit1.Clear

end;



procedure TFormPassword.Timer1Timer(Sender: TObject);

begin

if AlphaBlendValue<255 then

AlphaBlendValue:=AlphaBlendValue+15

else

Timer1.Enabled:=false

end;


Приложение D



Листинг модуля «UnitFilter»



procedure TFormFilter.EdFilterKeyPress(Sender: TObject; var Key: Char);

begin

if not (key in ['0'..'9',#8]) then key:=#0

end;



procedure TFormFilter.btnFilterClick(Sender: TObject); 

var a:TDate;

begin

 try

a:=date-StrToInt(EdFilter.Text);

except

showMessage('укажите количество дней');

exit

end;

tbPacient2.Filter:= 'DataPostup<='+QuotedStr(DateToStr(a));

end;



procedure TFormFilter.FormShow(Sender: TObject);

begin

tbPacient2.Open;

tbPalata2.Open;

end;



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

begin

tbPacient2.Close;

tbPalata2.Close;

end;



procedure TFormFilter.btnFamilClick(Sender: TObject);

begin

tbPacient2.Filter:='Famil='+QuotedStr(EdFamil.Text);

end;



procedure TFormFilter.tbPacient2AfterScroll(DataSet: TDataSet);

begin

FormMedSestra.tbOtdel.Locate('Notdel',tbPacient2.FieldByName('lkNotdel2').AsInteger,[]);

FormMedSestra.tbPalata.Locate('Npalat',tbPacient2.FieldByName('Npalat').AsInteger,[]);

FormMedSestra.tbPacient.Locate('Nfamil',tbPacient2.FieldByName('Nfamil').AsInteger,[]);

end;



procedure TFormFilter.SpeedButton1Click(Sender: TObject);

begin

EdFamil.Enabled:=true;

btnFamil.Enabled:=true;

EdFilter.Enabled:=false;

btnFilter.Enabled:=false

end;



procedure TFormFilter.SpeedButton2Click(Sender: TObject);

begin

EdFamil.Enabled:=false;

btnFamil.Enabled:=false;

EdFilter.Enabled:=true;

btnFilter.Enabled:=true

end;



procedure TFormFilter.FormCanResize(Sender: TObject; var NewWidth,

 NewHeight: Integer; var Resize: Boolean);

begin

NewWidth:=Width

end;







17