⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 PatientRunner 20 Source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      if (Status='family member') or (Status='other') then
      begin
         Label3.Caption:='';
         Label4.Caption:='';
      end;
      if (Status='retiree') or (Status='TDRL') then
      begin
        Label3.Caption:=Rate+'/'+Rank+'/'+Service;
        Label4.Caption:='';
      end;
      Label5.Caption:='POC: '+POC;
      Label6.Caption:='Allergies: '+Allergies;
    end;
    ShowModal;
  end;
end;

procedure TMainForm.DeletePatientClick(Sender: TObject);
begin
  if PatientListView.Items.Count<=0 then Exit;
  if PatientListView.ItemFocused=nil then Exit;
  if not Assigned(PatientListView.ItemFocused.Data) then Exit;

  if not PPatientRecord(PatientListView.ItemFocused.Data)^.Inactive then
  begin
    MessageDlg('Unable to delete - Patients must be marked inactive prior to deletion', mtError, [mbOk], 0);
    Exit;
  end;

  if PPatientRecord(PatientListView.ItemFocused.Data)^.Author<>
    MainForm.SQLConnection.Params.Values['User_Name'] then
  begin
    MessageDlg('Unable to delete - You are not the provider for this patient', mtError, [mbOk], 0);
    Exit;
  end;

  if MessageDlg('Are you sure you want to delete all records for '+
                PPatientRecord(PatientListView.ItemFocused.Data)^.Firstname+' '+
                PPatientRecord(PatientListView.ItemFocused.Data)^.Lastname+'?',
                mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit;

  //This will first dispose record from item then delete item from list
  //Efficient - No db refresh necessary since item is removed from list

  with SQLQuery do
  begin
    SQL.Clear;
    SQL.Add('delete from patients where patientid='+inttostr(PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID) );
    ExecSQL;

    //delete records from dependent DB's...
    SQL.Clear;
    SQL.Add('delete from notes where patientid='+inttostr(PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID) );
    ExecSQL;

    SQL.Clear;
    SQL.Add('delete from scales where patientid='+inttostr(PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID) );
    ExecSQL;

    SQL.Clear;
    SQL.Add('delete from diagnoses where patientid='+inttostr(PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID) );
    ExecSQL;

    SQL.Clear;
    SQL.Add('delete from medications where patientid='+inttostr(PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID) );
    ExecSQL;
  end;

  //now delete last trace of patient from patient list
  //no need to worry if pointer has been Assign()'d as this has been checked above
  Dispose(PPatientRecord(PatientListView.ItemFocused.Data));
  PatientListView.ItemFocused.Delete;

  PatientListViewClick(Sender);
end;

procedure TMainForm.RefreshPatientsDBClick(Sender: TObject);
var PatientRecordPtr: PPatientRecord;
    SelectedPatientIDHolder, i: integer;
    StatusString, TimeString: string;
    Save_Cursor: TCursor;
begin
  Save_Cursor:=Screen.Cursor;
  Screen.Cursor:=crSQLWait; //alternative could use crHourGlass

  //Populates ListBox with patient names and SSN
  //Each listbox item is associated with PatientID integer that serves as unique master key for DB
  //Dependent DB's such as patient notes use PatientID as unique patient identifier

  //Remember which item is currently selected if any
  SelectedPatientIDHolder:=-1;
  if PatientListView.ItemFocused<>nil then
  begin
    if Assigned(PatientListView.ItemFocused.Data) then
      SelectedPatientIDHolder:=PPatientRecord(PatientListView.ItemFocused.Data)^.PatientID;
  end;

  PatientListView.Items.BeginUpdate;

  //Delete everything from list
  CleanUpPatientListView;

  DateSeparator := '/';
  ShortDateFormat := 'yyyy/mm/dd';
  LongTimeFormat:='hh:nn:ss';

  with SQLQuery do
  begin
    SQL.Clear;

    SQL.Add('select * from patients ');

    if ShowOnlyMyPatientsCheckBox.Checked then
      SQL.Add('where author='''+SQLConnection.Params.Values['User_Name']+''' ');

    if ShowOnlyActivePatientsCheckBox.Checked then
    begin
      if AnsiContainsText(SQL.Text, 'where') then
        SQL.Add('and inactive=0 ')
      else
        SQL.Add('where inactive=0 ');
    end;

    if not AllStatus.Checked then
    begin
      if ActiveDutyStatus.Checked then StatusString:='status=''active duty service member''';
      if FamilyMemberStatus.Checked then StatusString:='status=''family member''';
      if RetireesStatus.Checked then StatusString:='status=''retiree''';
      if TDRLStatus.Checked then StatusString:='status=''tdrl''';
      if OtherStatus.Checked then StatusString:='status=''other''';
      if AnsiContainsText(SQL.Text, 'where') then
        SQL.Add('and '+StatusString+' ')
      else
        SQL.Add('where '+StatusString+' ');
    end;

    //Chances are if you haven't seen a patient in a year he or she isn't coming back
    //Checking only the last year or two significantly speeds up the queries because it cuts
    //the number of patients in half.

    if not TimeAll.Checked then
    begin
      if Time180Days.Checked then TimeString:='lastseendatetime>='''+DatetoStr(Now-180)+'''';
      if Time1Year.Checked then TimeString:='lastseendatetime>='''+DatetoStr(Now-365)+'''';
      if Time2Years.Checked then TimeString:='lastseendatetime>='''+DatetoStr(Now-730)+'''';
      if AnsiContainsText(SQL.Text, 'where') then
        SQL.Add('and '+TimeString+' ')
      else
        SQL.Add('where '+TimeString+' ');
    end;

    //Not a good idea to search by records by age than a certain date since this would involve
    //Linking to LastSeenDate field in Notes DB

    if byName.Checked then SQL.Add('order by lastname'); //asc is default
    if byLastSeenDate.Checked then SQL.Add('order by lastseendatetime desc');
    if byProvider.Checked then SQL.Add('order by author, lastname');
    
    Open;
    First;
    while (not EOF) do
    begin
      new(PatientRecordPtr);
      with PatientRecordPtr^ do
      begin
        PatientID:=FieldByName('patientid').AsInteger;
        Lastname:=FieldByName('lastname').AsString;
        Firstname:=FieldByName('firstname').AsString;
        Status:=FieldByName('status').AsString;
        SSN:=FieldByName('ssn').AsString;
        Birthday:=StrtoDateTime(FieldByName('birthday').AsString);
        IsMale:=Boolean(FieldByName('sex').AsInteger);
        Rate:=FieldByName('rate').AsString;
        Rank:=FieldByName('rank').AsString;
        Service:=FieldByName('service').AsString;
        PayDate:=StrtoDateTime(FieldByName('paydate').AsString);
        Command:=FieldByName('command').AsString;
        POC:=FieldByName('poc').AsString;
        Allergies:=FieldByName('allergies').AsString;
        Inactive:=Boolean(FieldByName('inactive').AsInteger);
        Author:=FieldByName('author').AsString;
        LastSeenDateTime:=StrtoDateTime(FieldByName('lastseendatetime').AsString);
        with PatientListView.Items.Add do
        begin
          Caption:=Lastname+', '+Firstname+' '+SSN;
          SubItems.Add(FormatDateTime('dd mmm yy', LastSeenDateTime) );
          SubItems.Add(Author);
          Data:=TObject(PatientRecordPtr);
        end;
      end;
      Next;
    end;
    Close;
  end;
  PatientListView.Items.EndUpdate;
  Screen.Cursor := Save_Cursor;

  StatusBar.Panels[0].Text:=inttostr(PatientListView.Items.Count)+' total patient(s)';

  //If there are no patietns or there was no previously selected patient just
  //redraw the screen and exit.  Unlike the Patient Explorer Form, there are no
  //editing controls that need to be reset.

  if (SelectedPatientIDHolder=-1) or (PatientListView.Items.Count<=0) then
  begin
    PatientListViewClick(Sender);
    Exit;
  end;

  //At this point, there are patient and we have remembered the PatientID that
  //was previously selected.  We will search through the patients, find and select it.

  for i:=0 to PatientListView.Items.Count-1 do
  begin
    if PPatientRecord(PatientListView.Items[i].Data)^.PatientID = SelectedPatientIDHolder then
    begin
      PatientListView.Selected := PatientListView.Items[i];
      PatientListView.ItemFocused := PatientListView.Items[i];
      Break;
    end;
  end;

  //If the note was found or in the rare case it was not, the redraw routines
  //will clean up.

  PatientListViewClick(Sender);
end;

procedure TMainForm.TemplateManagerClick(Sender: TObject);
begin
  with TemplateManagerForm do
  begin
    Import:=False;
    ShowModal;
  end;
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  RefreshPatientsDBClick(Sender);
end;

procedure TMainForm.EncounterReportGeneratorClick(Sender: TObject);
begin
  EncounterReportGeneratorForm.ShowModal;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var fIni: TRegIniFile;
    SortBy, DutyStatusSelect, TimeSelect: string;
begin
  Caption:=VersionInfo;
  
  fIni:=TRegIniFile.Create('');
  with fIni do
  begin
    RootKey:=HKEY_CURRENT_USER;
    //Set so new users get a full list of patients the first time they use the software
    ShowOnlyMyPatientsCheckBox.Checked:=ReadBool('Software\PatientRunner', 'ShowOnlyMyPatients', False);
    ShowOnlyActivePatientsCheckBox.Checked:=ReadBool('Software\PatientRunner', 'ShowOnlyActivePatients', True);

    SortBy:=ReadString('Software\PatientRunner', 'Sortby', 'Name');
    if SortBy='Name' then byName.Checked:=True;
    if SortBy='LastSeenDate' then byLastSeenDate.Checked:=True;
    if SortBy='Provider' then byProvider.Checked:=True;

    //sort criteria
    //byName.Checked:=ReadBool('Software\PatientRunner', 'SortbyName', True);
    //byLastSeenDate.Checked:=ReadBool('Software\PatientRunner', 'SortbyLastSeenDate', False);
    //byProvider.Checked:=ReadBool('Software\PatientRunner', 'SortbyProvider', False);

    DutyStatusSelect:=ReadString('Software\PatientRunner', 'DutyStatusSelect', 'All');
    if DutyStatusSelect='Active' then ActiveDutyStatus.Checked:=True;
    if DutyStatusSelect='FamilyMember' then FamilyMemberStatus.Checked:=True;
    if DutyStatusSelect='Retiree' then RetireesStatus.Checked:=True;
    if DutyStatusSelect='TDRL' then TDRLStatus.Checked:=True;
    if DutyStatusSelect='Other' then OtherStatus.Checked:=True;
    if DutyStatusSelect='All' then AllStatus.Checked:=True;

    //duty status
    //ActiveDutyStatus.Checked:=ReadBool('Software\PatientRunner', '', False);
    //FamilyMemberStatus.Checked:=ReadBool('Software\PatientRunner', '', False);
    //RetireesStatus.Checked:=ReadBool('Software\PatientRunner', '', False);
    //TDRLStatus.Checked:=ReadBool('Software\PatientRunner', '', False);
    //OtherStatus.Checked:=ReadBool('Software\PatientRunner', '', False);
    //AllStatus.Checked:=ReadBool('Software\PatientRunner', '', True); //default

    TimeSelect:=ReadString('Software\PatientRunner', 'TimeSelect', '1');
    if TimeSelect='Half' then Time180Days.Checked:=True;
    if TimeSelect='1' then Time1Year.Checked:=True;
    if TimeSelect='2' then Time2Years.Checked:=True;
    if TimeSelect='All' then TimeAll.Checked:=True;

    //time
    //Time180Days.Checked:=ReadBool('Software\PatientRunner', '', False);
    //Time1Year.Checked:=ReadBool('Software\PatientRunner', '', True); //default 1 year
    //Time2Years.Checked:=ReadBool('Software\PatientRunner', '', False);
    //TimeAll.Checked:=ReadBool('Software\PatientRunner', '', False);
    Free;
  end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var fIni: TRegIniFile;
begin
  fIni:=TRegIniFile.Create('');
  with fIni do
  begin
    RootKey:=HKEY_CURRENT_USER;
    WriteBool('Software\PatientRunner', 'ShowOnlyMyPatients', ShowOnlyMyPatientsCheckBox.Checked);
    WriteBool('Software\PatientRunner', 'ShowOnlyActivePatients', ShowOnlyActivePatientsCheckBox.Checked);

    if byName.Checked then WriteString('Software\PatientRunner', 'Sortby', 'Name');
    if byLastSeenDate.Checked then WriteString('Software\PatientRunner', 'Sortby', 'LastSeenDate');
    if byProvider.Checked then WriteString('Software\PatientRunner', 'Sortby', 'Provider');

    if ActiveDutyStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'Active');
    if FamilyMemberStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'FamilyMember');
    if RetireesStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'Retiree');
    if TDRLStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'TDRL');
    if OtherStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'Other');
    if AllStatus.Checked then WriteString('Software\PatientRunner', 'DutyStatusSelect', 'All');

    if Time180Days.Checked then WriteString('Software\PatientRunner', 'TimeSelect', 'Half');
    if Time1Year.Checked then WriteString('Software\PatientRunner', 'TimeSelect', '1');
    if Time2Years.Checked then WriteString('Software\PatientRunner', 'TimeSelect', '2');
    if TimeAll.Checked then WriteString('Software\PatientRunner', 'TimeSelect', 'All');

    Free;
  end;

  PatientListView.Items.BeginUpdate;
  CleanupPatientListView;
  PatientListView.Items.EndUpdate;
end;

procedure TMainForm.PatientListViewColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  if Column.Index=0 then byName.Checked:=True;
  if Column.Index=1 then byLastSeenDate.Checked:=True;
  if Column.Index=2 then byProvider.Checked:=True;

  RefreshPatientsDBClick(Sender) //name;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -