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. А. Микляев «Учебник пользователя 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;