Министерство образования и науки Республики Казахстан
Карагандинский государственный технический университет
ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
к курсовому проекту
по дисциплине: «Разработка программного обеспечения»
тема: Создание информационного банка данных «Больница»
Караганда, 2009
Содержание
Введение
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
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 Логическая модель базы данных
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 является одним из высокоразвитых языков объектно-ориентированного программирования. И среди других, например, таких как VisualBasic или VisualC++, отличается простотой программного кода, достаточным количеством литературы по этому языку.
Объектно-ориентированное программирование представляет собой метод программирования, который весьма близко напоминает наше поведение. Оно является естественной эволюцией более ранних нововведений в разработке языков программирования. Объектно-ориентированное программирование является более структурным, чем все предыдущие разработки, касающиеся структурного программирования. Оно также является более модульным и более абстрактным, чем предыдущие попытки абстрагирования данных и переноса деталей программирования на внутренний уровень. Объектно-ориентированный язык программирования характеризуется тремя основными свойствами:
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, а именно, WindowsXPProfessional. Этот выбор был сделан по ряду следующих причин. Во-первых, она является одной из наиболее распространенных на сегодняшний день. Во-вторых, в ОС Windows надежность компьютера повышается за счет применения новых мастеров, служебных программ и ресурсов, обеспечивающих бесперебойную работу системы. В-третьих, в состав Windows входит ряд программ, совместное применение которых повышает производительность компьютера. В-четвертых, на кафедре САПР установлена именно эта операционная система.
4.2 Базовое программное обеспечени
е
В качестве базового ПО принята среда Delphi 7.0 языка программирования ObjectPascal. Пакет Delphi 7.0 установлен на кафедре САПР и стабильно работает под системой WindowsXPProfessional.
Среди наиболее распространенных объектно-ориентированных сред программирования, 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).
Рисунок 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. Также мы научились разрабатывать собственные алгоритмы для решения поставленных задач, овладели методами и средствами отладки и тестирования программ.
Разработанная нами программа устойчиво выполняет все свои функции, но для использования ее в больницах, она требует некоторых доработок: программным путем обеспечить безопасность данных, расширить возможности поиска (поиск по двум и более полям), и т.д.
Список используемой литературы
1. А.Я. Архангельский Программирование в Delphi 7
2. А. Микляев «Учебник пользователя IBMPC», Москва – 2000
Приложение А
Листингмодуля «Unit2.pas»
procedure TForm2.FormPaint(Sender: TObject);
var y:integer; red:byte;
consttext='База данных больницы';
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;
|