| 1 | unit fODMedOut;
 | 
|---|
| 2 | 
 | 
|---|
| 3 | interface
 | 
|---|
| 4 | 
 | 
|---|
| 5 | uses
 | 
|---|
| 6 |   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 | 
|---|
| 7 |   fODBase, ORCtrls, StdCtrls, ORFn, ExtCtrls, uConst, ComCtrls, uCore, Mask,
 | 
|---|
| 8 |   Menus, Buttons;
 | 
|---|
| 9 | 
 | 
|---|
| 10 | type
 | 
|---|
| 11 |   TfrmODMedOut = class(TfrmODBase)
 | 
|---|
| 12 |     lblMedication: TLabel;
 | 
|---|
| 13 |     cboMedication: TORComboBox;
 | 
|---|
| 14 |     lblDosage: TLabel;
 | 
|---|
| 15 |     lblRoute: TLabel;
 | 
|---|
| 16 |     cboRoute: TORComboBox;
 | 
|---|
| 17 |     lblSchedule: TLabel;
 | 
|---|
| 18 |     cboSchedule: TORComboBox;
 | 
|---|
| 19 |     lblDispense: TLabel;
 | 
|---|
| 20 |     cboDispense: TORComboBox;
 | 
|---|
| 21 |     memComments: TMemo;
 | 
|---|
| 22 |     cboPriority: TORComboBox;
 | 
|---|
| 23 |     Bevel1: TBevel;
 | 
|---|
| 24 |     cboMedAlt: TORComboBox;
 | 
|---|
| 25 |     cboInstructions: TORComboBox;
 | 
|---|
| 26 |     lblQuantity: TLabel;
 | 
|---|
| 27 |     cboPickup: TORComboBox;
 | 
|---|
| 28 |     lblPickup: TLabel;
 | 
|---|
| 29 |     cboSC: TORComboBox;
 | 
|---|
| 30 |     lblSC: TLabel;
 | 
|---|
| 31 |     lblRefills: TLabel;
 | 
|---|
| 32 |     txtQuantity: TCaptionEdit;
 | 
|---|
| 33 |     lblComment: TLabel;
 | 
|---|
| 34 |     lblPriority: TLabel;
 | 
|---|
| 35 |     txtRefills: TCaptionEdit;
 | 
|---|
| 36 |     spnRefills: TUpDown;
 | 
|---|
| 37 |     cmdComplex: TButton;
 | 
|---|
| 38 |     btnUnits: TSpeedButton;
 | 
|---|
| 39 |     txtSIG: TCaptionEdit;
 | 
|---|
| 40 |     lblSIG: TLabel;
 | 
|---|
| 41 |     popUnits: TPopupMenu;
 | 
|---|
| 42 |     memComplex: TMemo;
 | 
|---|
| 43 |     procedure cboMedicationNeedData(Sender: TObject; const StartFrom: string;
 | 
|---|
| 44 |       Direction, InsertAt: Integer);
 | 
|---|
| 45 |     procedure cboMedicationSelect(Sender: TObject);
 | 
|---|
| 46 |     procedure FormCreate(Sender: TObject);
 | 
|---|
| 47 |     procedure ControlChange(Sender: TObject);
 | 
|---|
| 48 |     procedure cboDispenseExit(Sender: TObject);
 | 
|---|
| 49 |     procedure cboDispenseMouseClick(Sender: TObject);
 | 
|---|
| 50 |     procedure cboSCEnter(Sender: TObject);
 | 
|---|
| 51 |     procedure txtQuantityEnter(Sender: TObject);
 | 
|---|
| 52 |     procedure btnUnitsClick(Sender: TObject);
 | 
|---|
| 53 |     procedure cmdComplexClick(Sender: TObject);
 | 
|---|
| 54 |     procedure memCommentsEnter(Sender: TObject);
 | 
|---|
| 55 |   private
 | 
|---|
| 56 |     { Private declarations }
 | 
|---|
| 57 |     FLastDrug: Integer;
 | 
|---|
| 58 |     FLastMedID: string;
 | 
|---|
| 59 |     FDispenseMsg: string;
 | 
|---|
| 60 |     FMedCombo: TORComboBox;
 | 
|---|
| 61 |     procedure CheckFormAlt;
 | 
|---|
| 62 |     procedure ResetOnMedChange;
 | 
|---|
| 63 |     procedure SetAskSC;
 | 
|---|
| 64 |     procedure SetAltCombo;
 | 
|---|
| 65 |     procedure SetInstructions;
 | 
|---|
| 66 |     procedure SetOnOISelect;
 | 
|---|
| 67 |     procedure SetMaxRefills;
 | 
|---|
| 68 |     procedure SetupNouns;
 | 
|---|
| 69 |     procedure SetComplex;
 | 
|---|
| 70 |     procedure SetSimple;
 | 
|---|
| 71 |     procedure UnitClick(Sender: TObject);
 | 
|---|
| 72 |   protected
 | 
|---|
| 73 |     procedure InitDialog; override;
 | 
|---|
| 74 |     procedure Validate(var AnErrMsg: string); override;
 | 
|---|
| 75 |   public
 | 
|---|
| 76 |     procedure SetupDialog(OrderAction: Integer; const ID: string); override;
 | 
|---|
| 77 |   end;
 | 
|---|
| 78 | 
 | 
|---|
| 79 | implementation
 | 
|---|
| 80 | 
 | 
|---|
| 81 | {$R *.DFM}
 | 
|---|
| 82 | 
 | 
|---|
| 83 | uses rOrders, rODBase, fODMedFA, fODMedComplex;
 | 
|---|
| 84 | 
 | 
|---|
| 85 | const
 | 
|---|
| 86 |   REFILLS_DFLT  = '0';
 | 
|---|
| 87 |   REFILLS_MAX   = 11;
 | 
|---|
| 88 | 
 | 
|---|
| 89 |   TX_NO_MED     = 'Medication must be entered.';
 | 
|---|
| 90 |   TX_NO_DOSE    = 'Instructions must be entered.';
 | 
|---|
| 91 |   TX_NO_AMPER   = 'Instructions may not contain the ampersand (&) character.';
 | 
|---|
| 92 |   TX_NO_ROUTE   = 'Route must be entered.';
 | 
|---|
| 93 |   TX_NF_ROUTE   = 'Route not found in the Medication Routes file.';
 | 
|---|
| 94 |   TX_NO_SCHED   = 'Schedule must be entered.';
 | 
|---|
| 95 |   TX_NO_PICK    = 'A method for picking up the medication must be entered.';
 | 
|---|
| 96 |   TX_RNG_REFILL = 'The number of refills must be in the range of 0 through ';
 | 
|---|
| 97 |   TX_SCH_QUOTE  = 'Schedule must not have quotemarks in it.';
 | 
|---|
| 98 |   TX_SCH_MINUS  = 'Schedule must not have a dash at the beginning.';
 | 
|---|
| 99 |   TX_SCH_SPACE  = 'Schedule must have only one space in it.';
 | 
|---|
| 100 |   TX_SCH_LEN    = 'Schedule must be less than 70 characters.';
 | 
|---|
| 101 |   TX_SCH_PRN    = 'Schedule cannot include PRN - use Comments to enter PRN.';
 | 
|---|
| 102 |   TX_SCH_ZERO   = 'Schedule cannot be Q0';
 | 
|---|
| 103 |   TX_SCH_LSP    = 'Schedule may not have leading spaces.';
 | 
|---|
| 104 |   TX_SCH_NS     = 'Unable to resolve non-standard schedule.';
 | 
|---|
| 105 |   TX_OUTPT_IV   = 'This patient has not been admitted.  Only IV orders may be entered.';
 | 
|---|
| 106 |   TX_QTY_NV     = 'Unable to validate quantity.';
 | 
|---|
| 107 |   TX_QTY_MAIL   = 'Quantity for mailed items must be a whole number.';
 | 
|---|
| 108 | 
 | 
|---|
| 109 | 
 | 
|---|
| 110 | { TfrmODBase common methods }
 | 
|---|
| 111 | 
 | 
|---|
| 112 | procedure TfrmODMedOut.FormCreate(Sender: TObject);
 | 
|---|
| 113 | const
 | 
|---|
| 114 |   TC_RESTRICT = 'Ordering Restrictions';
 | 
|---|
| 115 | var
 | 
|---|
| 116 |   Restriction: string;
 | 
|---|
| 117 | begin
 | 
|---|
| 118 |   inherited;
 | 
|---|
| 119 |   AllowQuickOrder := True;
 | 
|---|
| 120 |   CheckAuthForMeds(Restriction);
 | 
|---|
| 121 |   if Length(Restriction) > 0 then
 | 
|---|
| 122 |   begin
 | 
|---|
| 123 |     InfoBox(Restriction, TC_RESTRICT, MB_OK);
 | 
|---|
| 124 |     Close;
 | 
|---|
| 125 |     Exit;
 | 
|---|
| 126 |   end;
 | 
|---|
| 127 |   FillerID := 'PSO';                        // does 'on Display' order check **KCM**
 | 
|---|
| 128 |   StatusText('Loading Dialog Definition');
 | 
|---|
| 129 |   Responses.Dialog := 'PSO OERR';           // loads formatting info
 | 
|---|
| 130 |   StatusText('Loading Default Values');
 | 
|---|
| 131 |   CtrlInits.LoadDefaults(ODForMedOut);      // ODForMedOut returns TStrings with defaults
 | 
|---|
| 132 |   InitDialog;
 | 
|---|
| 133 |   CtrlInits.SetControl(cboPickup, 'Pickup'); // do only once, so don't do in InitDialog
 | 
|---|
| 134 |   PreserveControl(cboPickup);
 | 
|---|
| 135 | end;
 | 
|---|
| 136 | 
 | 
|---|
| 137 | procedure TfrmODMedOut.InitDialog;
 | 
|---|
| 138 | begin
 | 
|---|
| 139 |   inherited;
 | 
|---|
| 140 |   FLastDrug := 0;
 | 
|---|
| 141 |   FLastMedID := '';
 | 
|---|
| 142 |   FDispenseMsg := '';
 | 
|---|
| 143 |   FMedCombo := cboMedication;                    // this must be before SetControl(cboMedication)
 | 
|---|
| 144 |   with CtrlInits do
 | 
|---|
| 145 |   begin
 | 
|---|
| 146 |     SetControl(cboMedication, 'ShortList');
 | 
|---|
| 147 |     cboMedication.InsertSeparator;
 | 
|---|
| 148 |     //SetControl(cboMedAlt,     'ShortList'); can't do this since it calls InitLongList
 | 
|---|
| 149 |     SetControl(cboSchedule,   'Schedules');
 | 
|---|
| 150 |     SetControl(cboPriority,   'Priorities');
 | 
|---|
| 151 |     //SetControl(cboPickup,     'Pickup');
 | 
|---|
| 152 |     SetControl(cboSC,         'SCStatus');
 | 
|---|
| 153 |   end;
 | 
|---|
| 154 |   SetAskSC;
 | 
|---|
| 155 |   StatusText('Retrieving List of Medications');
 | 
|---|
| 156 |   cboMedAlt.Visible := False;
 | 
|---|
| 157 |   cboMedication.Visible := True;
 | 
|---|
| 158 |   cboMedication.InitLongList('');
 | 
|---|
| 159 |   ActiveControl := cboMedication; //SetFocusedControl(FMedCombo);
 | 
|---|
| 160 |   SetSimple;
 | 
|---|
| 161 |   StatusText('');
 | 
|---|
| 162 | end;
 | 
|---|
| 163 | 
 | 
|---|
| 164 | procedure TfrmODMedOut.SetupDialog(OrderAction: Integer; const ID: string);
 | 
|---|
| 165 | var
 | 
|---|
| 166 |   AnInstr: string;
 | 
|---|
| 167 | begin
 | 
|---|
| 168 |   inherited;
 | 
|---|
| 169 |   if OrderAction in [ORDER_COPY, ORDER_EDIT] then Responses.Remove('START', 1);
 | 
|---|
| 170 |   if OrderAction in [ORDER_COPY, ORDER_EDIT, ORDER_QUICK] then with Responses do
 | 
|---|
| 171 |   begin
 | 
|---|
| 172 |     Changing := True;
 | 
|---|
| 173 |     SetControl(cboMedication, 'ORDERABLE', 1);
 | 
|---|
| 174 |     ResetOnMedChange;
 | 
|---|
| 175 |     SetOnOISelect;
 | 
|---|
| 176 |     SetAltCombo;
 | 
|---|
| 177 |     //cboMedicationSelect(Self);
 | 
|---|
| 178 |     SetControl(cboDispense,   'DRUG',      1);
 | 
|---|
| 179 |     SetInstructions;
 | 
|---|
| 180 |     SetControl(txtQuantity,   'QTY',       1);
 | 
|---|
| 181 |     SetControl(txtRefills,    'REFILLS',   1);
 | 
|---|
| 182 |     spnRefills.Position := StrToIntDef(txtRefills.Text, 0);
 | 
|---|
| 183 |     SetControl(cboPickup,     'PICKUP',    1);
 | 
|---|
| 184 |     SetControl(memComments,   'COMMENT',   1);
 | 
|---|
| 185 |     SetControl(cboPriority,   'URGENCY',   1);
 | 
|---|
| 186 |     { prevent the SIG from being part of the comments on pre-CPRS prescriptions }
 | 
|---|
| 187 |     if (OrderAction in [ORDER_COPY, ORDER_EDIT]) and (cboInstructions.Text = '') then
 | 
|---|
| 188 |     begin
 | 
|---|
| 189 |       AnInstr := TextForOrder(ID); //'SIG:  ' + memComments.Text;
 | 
|---|
| 190 |       OrderMessage(AnInstr);
 | 
|---|
| 191 |       lblSIG.Visible := True;
 | 
|---|
| 192 |       txtSIG.Visible := True;
 | 
|---|
| 193 |       txtSIG.Text := memComments.Text;
 | 
|---|
| 194 |       memComments.Clear;
 | 
|---|
| 195 |     end;
 | 
|---|
| 196 |     { can't edit the orderable item for a med order that has been released }
 | 
|---|
| 197 |     if (OrderAction = ORDER_EDIT) and OrderIsReleased(EditOrder)
 | 
|---|
| 198 |       then FMedCombo.Enabled := False;
 | 
|---|
| 199 |     Changing := False;
 | 
|---|
| 200 |     ControlChange(Self);
 | 
|---|
| 201 |   end;
 | 
|---|
| 202 |   if OrderAction <> ORDER_EDIT then SetFocusedControl(FMedCombo);
 | 
|---|
| 203 | end;
 | 
|---|
| 204 | 
 | 
|---|
| 205 | procedure TfrmODMedOut.Validate(var AnErrMsg: string);
 | 
|---|
| 206 | var
 | 
|---|
| 207 |   Sched: Integer;
 | 
|---|
| 208 |   RouteID, RouteAbbr: string;
 | 
|---|
| 209 | 
 | 
|---|
| 210 |   procedure SetError(const x: string);
 | 
|---|
| 211 |   begin
 | 
|---|
| 212 |     if Length(AnErrMsg) > 0 then AnErrMsg := AnErrMsg + CRLF;
 | 
|---|
| 213 |     AnErrMsg := AnErrMsg + x;
 | 
|---|
| 214 |   end;
 | 
|---|
| 215 | 
 | 
|---|
| 216 | begin
 | 
|---|
| 217 |   inherited;
 | 
|---|
| 218 |   if Length(cboMedAlt.Text) = 0           then SetError(TX_NO_MED);
 | 
|---|
| 219 |   // if memComplex is Visible, then the dosage fields were validated in fMedComplex
 | 
|---|
| 220 |   if memComplex.Visible = False then
 | 
|---|
| 221 |   begin
 | 
|---|
| 222 |     if Length(cboInstructions.Text) = 0     then SetError(TX_NO_DOSE);
 | 
|---|
| 223 |     if Pos('&', cboInstructions.Text) > 0   then SetError(TX_NO_AMPER);
 | 
|---|
| 224 |     if (Length(cboRoute.Text) = 0) and (not MedIsSupply(cboMedAlt.ItemIEN))
 | 
|---|
| 225 |                                             then SetError(TX_NO_ROUTE);
 | 
|---|
| 226 |     if (Length(cboRoute.Text) > 0) and (cboRoute.ItemIndex < 0) then
 | 
|---|
| 227 |     begin
 | 
|---|
| 228 |       LookupRoute(cboRoute.Text, RouteID, RouteAbbr);
 | 
|---|
| 229 |       if RouteID = '0'
 | 
|---|
| 230 |         then SetError(TX_NF_ROUTE)
 | 
|---|
| 231 |         else Responses.Update('ROUTE', 1, RouteID, RouteAbbr);
 | 
|---|
| 232 |     end;
 | 
|---|
| 233 |     if Length(cboSchedule.Text) = 0         then SetError(TX_NO_SCHED);
 | 
|---|
| 234 |   end;
 | 
|---|
| 235 |   if cboPickup.ItemID = ''                then SetError(TX_NO_PICK);
 | 
|---|
| 236 |   if StrToIntDef(txtRefills.Text, 99) > spnRefills.Max
 | 
|---|
| 237 |     then SetError(TX_RNG_REFILL + IntToStr(spnRefills.Max));
 | 
|---|
| 238 |   with cboSchedule do if Length(Text) > 0 then
 | 
|---|
| 239 |   begin
 | 
|---|
| 240 |     Sched := ValidSchedule(Text);
 | 
|---|
| 241 |     if Sched = -1 then
 | 
|---|
| 242 |     begin
 | 
|---|
| 243 |       if Pos('"', Text) > 0                                 then SetError(TX_SCH_QUOTE);
 | 
|---|
| 244 |       if Copy(Text, 1, 1) = '-'                             then SetError(TX_SCH_MINUS);
 | 
|---|
| 245 |       if Pos(' ', Copy(Text, Pos(' ', Text) + 1, 999)) > 0  then SetError(TX_SCH_SPACE);
 | 
|---|
| 246 |       if Length(Text) > 70                                  then SetError(TX_SCH_LEN);
 | 
|---|
| 247 |       if (Pos('P RN', Text) > 0) or (Pos('PR N', Text) > 0) then SetError(TX_SCH_PRN);
 | 
|---|
| 248 |       if Pos('Q0', Text) > 0                                then SetError(TX_SCH_ZERO);
 | 
|---|
| 249 |       if TrimLeft(Text) <> Text                             then SetError(TX_SCH_LSP);
 | 
|---|
| 250 |     end;
 | 
|---|
| 251 |     if Sched = 0                          then SetError(TX_SCH_NS);
 | 
|---|
| 252 |   end;
 | 
|---|
| 253 |   with txtQuantity do if Length(Text) > 0 then
 | 
|---|
| 254 |   begin
 | 
|---|
| 255 |     if not ValidQuantity(Text)            then SetError(TX_QTY_NV);
 | 
|---|
| 256 |     //if (cboPickup.ItemID = 'M') and (IntToStr(StrToIntDef(Text,-1)) <> Text)
 | 
|---|
| 257 |     //                                      then SetError(TX_QTY_MAIL);
 | 
|---|
| 258 |   end;
 | 
|---|
| 259 | end;
 | 
|---|
| 260 | 
 | 
|---|
| 261 | { cboMedication methods }
 | 
|---|
| 262 | 
 | 
|---|
| 263 | procedure TfrmODMedOut.ResetOnMedChange;
 | 
|---|
| 264 | begin
 | 
|---|
| 265 |   ClearControl(cboDispense);
 | 
|---|
| 266 |   ClearControl(cboInstructions);
 | 
|---|
| 267 |   btnUnits.Caption := '';
 | 
|---|
| 268 |   ResetControl(cboRoute);
 | 
|---|
| 269 |   ResetControl(cboSchedule);
 | 
|---|
| 270 |   ClearControl(txtQuantity);
 | 
|---|
| 271 |   txtRefills.Text := REFILLS_DFLT;
 | 
|---|
| 272 |   spnRefills.Max  := REFILLS_MAX;
 | 
|---|
| 273 |   ClearControl(memComments);
 | 
|---|
| 274 |   ClearControl(memOrder);
 | 
|---|
| 275 | end;
 | 
|---|
| 276 | 
 | 
|---|
| 277 | procedure TfrmODMedOut.SetAltCombo;
 | 
|---|
| 278 | begin
 | 
|---|
| 279 |   with cboMedication do
 | 
|---|
| 280 |   begin
 | 
|---|
| 281 |     FMedCombo := cboMedAlt;
 | 
|---|
| 282 |     if cboMedAlt.Items.Count = 0 then CtrlInits.SetListOnly(cboMedAlt, 'ShortList');
 | 
|---|
| 283 |     cboMedAlt.SetExactByIEN(ItemIEN, TrimRight(Piece(Text, '<', 1)));
 | 
|---|
| 284 |     cboMedication.Visible := False;
 | 
|---|
| 285 |     cboMedAlt.Visible := True;
 | 
|---|
| 286 |   end;
 | 
|---|
| 287 | end;
 | 
|---|
| 288 | 
 | 
|---|
| 289 | procedure TfrmODMedOut.SetOnOISelect;
 | 
|---|
| 290 | begin
 | 
|---|
| 291 |   with CtrlInits do
 | 
|---|
| 292 |   begin
 | 
|---|
| 293 |     FLastMedID := FMedCombo.ItemID;
 | 
|---|
| 294 |     LoadOrderItem(OIForMedOut(FMedCombo.ItemIEN));
 | 
|---|
| 295 |     SetControl(cboDispense,     'Dispense');
 | 
|---|
| 296 |     if cboDispense.Items.Count = 1 then cboDispense.ItemIndex := 0;
 | 
|---|
| 297 |     lblDosage.Caption := DefaultText('Verb');
 | 
|---|
| 298 |     if lblDosage.Caption = '' then lblDosage.Caption := 'Amount';
 | 
|---|
| 299 |     SetControl(cboInstructions, 'Instruct');
 | 
|---|
| 300 |     SetupNouns;
 | 
|---|
| 301 |     SetControl(cboRoute,        'Route');
 | 
|---|
| 302 |     if cboRoute.Items.Count = 1 then cboRoute.ItemIndex := 0;
 | 
|---|
| 303 |     if DefaultText('DefSched') <> '' then cboSchedule.SelectByID(DefaultText('DefSched'));
 | 
|---|
| 304 |     OrderMessage(TextOf('Message'));
 | 
|---|
| 305 |   end;
 | 
|---|
| 306 | end;
 | 
|---|
| 307 | 
 | 
|---|
| 308 | procedure TfrmODMedOut.cboMedicationNeedData(Sender: TObject; const StartFrom: string;
 | 
|---|
| 309 |   Direction, InsertAt: Integer);
 | 
|---|
| 310 | { retrieves a subset of inpatient medication orderable items }
 | 
|---|
| 311 | begin
 | 
|---|
| 312 |   inherited;
 | 
|---|
| 313 |   FMedCombo.ForDataUse(SubSetOfOrderItems(StartFrom, Direction, 'S.O RX'));
 | 
|---|
| 314 | end;
 | 
|---|
| 315 | 
 | 
|---|
| 316 | procedure TfrmODMedOut.cboMedicationSelect(Sender: TObject);
 | 
|---|
| 317 | { sets related controls whenever orderable item changes (MouseClick or Exit) }
 | 
|---|
| 318 | begin
 | 
|---|
| 319 |   inherited;
 | 
|---|
| 320 |   with FMedCombo do
 | 
|---|
| 321 |   begin
 | 
|---|
| 322 |     if ItemID <> FLastMedID then FLastMedID := ItemID else Exit;
 | 
|---|
| 323 |     Changing := True;
 | 
|---|
| 324 |     if Sender <> Self then Responses.Clear;       // Sender=Self when called from SetupDialog
 | 
|---|
| 325 |     ResetOnMedChange;
 | 
|---|
| 326 |     if CharAt(ItemID, 1) = 'Q' then
 | 
|---|
| 327 |     begin
 | 
|---|
| 328 |       Responses.QuickOrder := ExtractInteger(ItemID);
 | 
|---|
| 329 |       Responses.SetControl(FMedCombo, 'ORDERABLE', 1);
 | 
|---|
| 330 |     end;
 | 
|---|
| 331 |     if ItemIEN > 0 then SetOnOISelect;
 | 
|---|
| 332 |   end;
 | 
|---|
| 333 |   with Responses do if QuickOrder > 0 then
 | 
|---|
| 334 |   begin
 | 
|---|
| 335 |     SetControl(FMedCombo,     'ORDERABLE', 1);
 | 
|---|
| 336 |     SetControl(cboDispense,   'DRUG',      1);
 | 
|---|
| 337 |     SetInstructions;
 | 
|---|
| 338 |     SetControl(txtQuantity,   'QTY',       1);
 | 
|---|
| 339 |     SetControl(txtRefills,    'REFILLS',   1);
 | 
|---|
| 340 |     spnRefills.Position := StrToIntDef(txtRefills.Text, 0);
 | 
|---|
| 341 |     SetControl(cboPickup,     'PICKUP',    1);
 | 
|---|
| 342 |     SetControl(memComments,   'COMMENT',   1);
 | 
|---|
| 343 |     SetControl(cboPriority,   'URGENCY',   1);
 | 
|---|
| 344 |   end;
 | 
|---|
| 345 |   Changing := False;
 | 
|---|
| 346 |   ControlChange(Self);
 | 
|---|
| 347 |   if FMedCombo = cboMedication then SetAltCombo;
 | 
|---|
| 348 |   // if the Dispense drug was stuffed - still do the checks (form alt, refills)
 | 
|---|
| 349 |   if cboDispense.ItemIndex > -1 then cboDispenseMouseClick(Self);
 | 
|---|
| 350 | end;
 | 
|---|
| 351 | 
 | 
|---|
| 352 | { cboDispense methods }
 | 
|---|
| 353 | 
 | 
|---|
| 354 | procedure TfrmODMedOut.CheckFormAlt;
 | 
|---|
| 355 | var
 | 
|---|
| 356 |   DrugName, OIName: string;
 | 
|---|
| 357 |   Drug, OI: Integer;
 | 
|---|
| 358 | begin
 | 
|---|
| 359 |   with cboDispense do if (ItemIndex > -1) and (Piece(Items[ItemIndex], U, 4) = 'NF') then
 | 
|---|
| 360 |   begin
 | 
|---|
| 361 |     SelectFormularyAlt(ItemIEN, Drug, OI, DrugName, OIName, PST_OUTPATIENT);
 | 
|---|
| 362 |     if Drug > 0 then
 | 
|---|
| 363 |     begin
 | 
|---|
| 364 |       if FMedCombo.ItemIEN <> OI then
 | 
|---|
| 365 |       begin
 | 
|---|
| 366 |         FMedCombo.InitLongList(OIName);
 | 
|---|
| 367 |         FMedCombo.SelectByIEN(OI);
 | 
|---|
| 368 |         cboMedicationSelect(Self);
 | 
|---|
| 369 |       end;
 | 
|---|
| 370 |       cboDispense.SelectByIEN(Drug);
 | 
|---|
| 371 |     end; {if FormAlt}
 | 
|---|
| 372 |   end; {if ItemIndex}
 | 
|---|
| 373 |   SetAskSC;  // now check enabled for the service connected prompt
 | 
|---|
| 374 | end;
 | 
|---|
| 375 | 
 | 
|---|
| 376 | procedure TfrmODMedOut.SetMaxRefills;
 | 
|---|
| 377 | begin
 | 
|---|
| 378 |   with cboDispense do if (ItemIndex > -1) and (Length(Piece(Items[ItemIndex], U, 6)) > 0) then
 | 
|---|
| 379 |   begin
 | 
|---|
| 380 |     spnRefills.Max := StrToIntDef(Piece(Items[ItemIndex], U, 6), REFILLS_MAX);
 | 
|---|
| 381 |     if StrToIntDef(txtRefills.Text, 0) > spnRefills.Max then
 | 
|---|
| 382 |     begin
 | 
|---|
| 383 |       txtRefills.Text := IntToStr(spnRefills.Max);
 | 
|---|
| 384 |       spnRefills.Position := spnRefills.Max;
 | 
|---|
| 385 |     end;
 | 
|---|
| 386 |   end;
 | 
|---|
| 387 | end;
 | 
|---|
| 388 | 
 | 
|---|
| 389 | procedure TfrmODMedOut.cboDispenseExit(Sender: TObject);
 | 
|---|
| 390 | var
 | 
|---|
| 391 |   AMsg: string;
 | 
|---|
| 392 | begin
 | 
|---|
| 393 |   inherited;
 | 
|---|
| 394 |   SetMaxRefills;
 | 
|---|
| 395 |   with cboDispense do
 | 
|---|
| 396 |   begin
 | 
|---|
| 397 |     if ItemIEN <> FLastDrug then CheckFormAlt;
 | 
|---|
| 398 |     if ItemIEN > 0 then
 | 
|---|
| 399 |     begin
 | 
|---|
| 400 |       AMsg := DispenseMessage(ItemIEN) + CRLF;
 | 
|---|
| 401 |       if memMessage.Text <> AMsg then OrderMessage(AMsg);
 | 
|---|
| 402 |     end;
 | 
|---|
| 403 |     FLastDrug := ItemIEN;
 | 
|---|
| 404 |   end;
 | 
|---|
| 405 | end;
 | 
|---|
| 406 | 
 | 
|---|
| 407 | procedure TfrmODMedOut.cboDispenseMouseClick(Sender: TObject);
 | 
|---|
| 408 | begin
 | 
|---|
| 409 |   inherited;
 | 
|---|
| 410 |   SetMaxRefills;
 | 
|---|
| 411 |   with cboDispense do
 | 
|---|
| 412 |   begin
 | 
|---|
| 413 |     if ItemIEN <> FLastDrug then CheckFormAlt;
 | 
|---|
| 414 |     if ItemIEN > 0 then OrderMessage(DispenseMessage(ItemIEN));
 | 
|---|
| 415 |     FLastDrug := ItemIEN;
 | 
|---|
| 416 |   end;
 | 
|---|
| 417 | end;
 | 
|---|
| 418 | 
 | 
|---|
| 419 | { dosage instructions }
 | 
|---|
| 420 | 
 | 
|---|
| 421 | procedure TfrmODMedOut.SetupNouns;
 | 
|---|
| 422 | var
 | 
|---|
| 423 |   AvailWidth, MaxWidth: Integer;
 | 
|---|
| 424 | begin
 | 
|---|
| 425 |   CtrlInits.SetPopupMenu(popUnits, UnitClick, 'Nouns');
 | 
|---|
| 426 |   if popUnits.Items.Count > 0 then
 | 
|---|
| 427 |   begin
 | 
|---|
| 428 |     // Make sure cboInstructions is at least 40 pixels wide so it can show values
 | 
|---|
| 429 |     // like "1/2".  Allow for a 3 pixel space between the the Units button & Route.
 | 
|---|
| 430 |     AvailWidth := (cboRoute.Left - 3) - (cboInstructions.Left + 40);
 | 
|---|
| 431 |     MaxWidth := popUnits.Tag + 9; // allow 9 pixels for the down arrow & button border
 | 
|---|
| 432 |     if MaxWidth > AvailWidth then MaxWidth := AvailWidth;
 | 
|---|
| 433 |     btnUnits.Width := MaxWidth;
 | 
|---|
| 434 |     btnUnits.Left  := cboRoute.Left - MaxWidth - 3;
 | 
|---|
| 435 |     cboInstructions.Width := btnUnits.Left - cboInstructions.Left;
 | 
|---|
| 436 |     btnUnits.Caption := popUnits.Items[0].Caption;
 | 
|---|
| 437 |     btnUnits.Visible := True;
 | 
|---|
| 438 |   end else
 | 
|---|
| 439 |   begin
 | 
|---|
| 440 |     btnUnits.Visible := False;
 | 
|---|
| 441 |     // Allow for a 6 pixel margin between the Instructions box & Route
 | 
|---|
| 442 |     cboInstructions.Width := cboRoute.Left - cboInstructions.Left - 6;
 | 
|---|
| 443 |   end;
 | 
|---|
| 444 | end;
 | 
|---|
| 445 | 
 | 
|---|
| 446 | procedure TfrmODMedOut.btnUnitsClick(Sender: TObject);
 | 
|---|
| 447 | var
 | 
|---|
| 448 |   APoint: TPoint;
 | 
|---|
| 449 | begin
 | 
|---|
| 450 |   inherited;
 | 
|---|
| 451 |   APoint := btnUnits.ClientToScreen(Point(0, btnUnits.Height));
 | 
|---|
| 452 |   popUnits.Popup(APoint.X, APoint.Y);
 | 
|---|
| 453 | end;
 | 
|---|
| 454 | 
 | 
|---|
| 455 | procedure TfrmODMedOut.UnitClick(Sender: TObject);
 | 
|---|
| 456 | begin
 | 
|---|
| 457 |   btnUnits.Caption := TMenuItem(Sender).Caption;
 | 
|---|
| 458 | end;
 | 
|---|
| 459 | 
 | 
|---|
| 460 | procedure TfrmODMedOut.SetComplex;
 | 
|---|
| 461 | begin
 | 
|---|
| 462 |   lblDosage.Visible := False;;
 | 
|---|
| 463 |   lblRoute.Visible := False;;
 | 
|---|
| 464 |   lblSchedule.Visible := False;;
 | 
|---|
| 465 |   cboInstructions.Visible := False;
 | 
|---|
| 466 |   btnUnits.Visible := False;;
 | 
|---|
| 467 |   cboRoute.Visible := False;
 | 
|---|
| 468 |   cboSchedule.Visible := False;
 | 
|---|
| 469 |   memComplex.Visible := True;
 | 
|---|
| 470 |   cmdComplex.Caption := 'Change Dose...';
 | 
|---|
| 471 | end;
 | 
|---|
| 472 | 
 | 
|---|
| 473 | procedure TfrmODMedOut.SetSimple;
 | 
|---|
| 474 | begin
 | 
|---|
| 475 |   memComplex.Visible := False;
 | 
|---|
| 476 |   lblDosage.Visible := True;;
 | 
|---|
| 477 |   lblRoute.Visible := True;;
 | 
|---|
| 478 |   lblSchedule.Visible := True;;
 | 
|---|
| 479 |   cboInstructions.Visible := True;
 | 
|---|
| 480 |   btnUnits.Visible := (popUnits.Items.Count > 0) or (btnUnits.Caption <> '');
 | 
|---|
| 481 |   cboRoute.Visible := True;
 | 
|---|
| 482 |   cboSchedule.Visible := True;
 | 
|---|
| 483 |   cmdComplex.Caption := 'Complex Dose...';
 | 
|---|
| 484 | end;
 | 
|---|
| 485 | 
 | 
|---|
| 486 | procedure TfrmODMedOut.SetInstructions;
 | 
|---|
| 487 | var
 | 
|---|
| 488 |   x: string;
 | 
|---|
| 489 |   AnInstance: Integer;
 | 
|---|
| 490 | begin
 | 
|---|
| 491 |   case Responses.InstanceCount('INSTR') of
 | 
|---|
| 492 |   0:   begin
 | 
|---|
| 493 |          cboInstructions.ItemIndex := -1;
 | 
|---|
| 494 |          // there may still be a route & schedule (for copied orders)
 | 
|---|
| 495 |          if Responses.EValueFor('MISC', 1) <> ''
 | 
|---|
| 496 |            then btnUnits.Caption := Responses.EValueFor('MISC', 1);
 | 
|---|
| 497 |          Responses.SetControl(cboRoute, 'ROUTE', 1);
 | 
|---|
| 498 |          with cboRoute do if ItemIndex > -1 then Text := DisplayText[ItemIndex];
 | 
|---|
| 499 |          Responses.SetControl(cboSchedule, 'SCHEDULE', 1);
 | 
|---|
| 500 |          SetSimple;
 | 
|---|
| 501 |        end;
 | 
|---|
| 502 |   1:   begin
 | 
|---|
| 503 |          AnInstance := Responses.NextInstance('INSTR', 0);
 | 
|---|
| 504 |          Responses.SetControl(cboInstructions, 'INSTR', AnInstance);
 | 
|---|
| 505 |          btnUnits.Caption := Responses.IValueFor('MISC', AnInstance);
 | 
|---|
| 506 |          Responses.SetControl(cboRoute, 'ROUTE', AnInstance);
 | 
|---|
| 507 |          with cboRoute do if ItemIndex > -1 then Text := DisplayText[ItemIndex];
 | 
|---|
| 508 |          Responses.SetControl(cboSchedule, 'SCHEDULE', AnInstance);
 | 
|---|
| 509 |          SetSimple;
 | 
|---|
| 510 |        end;
 | 
|---|
| 511 |   else begin
 | 
|---|
| 512 |          memComplex.Clear;
 | 
|---|
| 513 |          AnInstance := Responses.NextInstance('INSTR', 0);
 | 
|---|
| 514 |          while AnInstance > 0 do
 | 
|---|
| 515 |          begin
 | 
|---|
| 516 |            x := Responses.EValueFor('INSTR', AnInstance);
 | 
|---|
| 517 |            x := x + ' ' + Responses.EValueFor('MISC', AnInstance);
 | 
|---|
| 518 |            x := x + ' ' + Responses.EValueFor('ROUTE', AnInstance);
 | 
|---|
| 519 |            x := x + ' ' + Responses.EValueFor('SCHEDULE', AnInstance);
 | 
|---|
| 520 |            if Length(Responses.EValueFor('DAYS', AnInstance)) > 0
 | 
|---|
| 521 |              then x := x + ' ' + Responses.EValueFor('DAYS', AnInstance) + ' day(s)';
 | 
|---|
| 522 |            memComplex.Lines.Add(x);
 | 
|---|
| 523 |            AnInstance := Responses.NextInstance('INSTR', AnInstance);
 | 
|---|
| 524 |          end;
 | 
|---|
| 525 |          SetComplex;
 | 
|---|
| 526 |        end;
 | 
|---|
| 527 |   end; {case}
 | 
|---|
| 528 |   memOrder.Text := Responses.OrderText;
 | 
|---|
| 529 | end; {if ExecuteComplexDose}
 | 
|---|
| 530 | 
 | 
|---|
| 531 | procedure TfrmODMedOut.cmdComplexClick(Sender: TObject);
 | 
|---|
| 532 | begin
 | 
|---|
| 533 |   inherited;
 | 
|---|
| 534 |   if FMedCombo.ItemIEN = 0 then
 | 
|---|
| 535 |   begin
 | 
|---|
| 536 |     InfoBox(TX_NO_MED, 'Error', MB_OK);
 | 
|---|
| 537 |     Exit;
 | 
|---|
| 538 |   end;
 | 
|---|
| 539 |   if ExecuteComplexDose(CtrlInits, Responses) then SetInstructions;
 | 
|---|
| 540 | end;
 | 
|---|
| 541 | 
 | 
|---|
| 542 | { quantity }
 | 
|---|
| 543 | 
 | 
|---|
| 544 | procedure TfrmODMedOut.txtQuantityEnter(Sender: TObject);
 | 
|---|
| 545 | begin
 | 
|---|
| 546 |   inherited;
 | 
|---|
| 547 |   with cboDispense do if ItemIEN > 0 then OrderMessage(QuantityMessage(ItemIEN));
 | 
|---|
| 548 | end;
 | 
|---|
| 549 | 
 | 
|---|
| 550 | { service connection }
 | 
|---|
| 551 | 
 | 
|---|
| 552 | procedure TfrmODMedOut.SetAskSC;
 | 
|---|
| 553 | const
 | 
|---|
| 554 |   SC_NO  = 0;
 | 
|---|
| 555 |   SC_YES = 1;
 | 
|---|
| 556 | begin
 | 
|---|
| 557 |   if Patient.ServiceConnected and RequiresCopay(FLastDrug) then
 | 
|---|
| 558 |   begin
 | 
|---|
| 559 |     lblSC.Font.Color := clWindowText;
 | 
|---|
| 560 |     cboSC.Enabled := True;
 | 
|---|
| 561 |     cboSC.Color := clWindow;
 | 
|---|
| 562 |     if Patient.SCPercent > 50 then cboSC.SelectByIEN(SC_YES) else cboSC.SelectByIEN(SC_NO);
 | 
|---|
| 563 |   end else
 | 
|---|
| 564 |   begin
 | 
|---|
| 565 |     lblSC.Font.Color := clGrayText;
 | 
|---|
| 566 |     cboSC.Enabled := False;
 | 
|---|
| 567 |     cboSC.Color := clBtnFace;
 | 
|---|
| 568 |     cboSC.ItemIndex := -1;
 | 
|---|
| 569 |   end;
 | 
|---|
| 570 | end;
 | 
|---|
| 571 | 
 | 
|---|
| 572 | procedure TfrmODMedOut.cboSCEnter(Sender: TObject);
 | 
|---|
| 573 | begin
 | 
|---|
| 574 |   inherited;
 | 
|---|
| 575 |   OrderMessage(RatedDisabilities);
 | 
|---|
| 576 | end;
 | 
|---|
| 577 | 
 | 
|---|
| 578 | { comments }
 | 
|---|
| 579 | 
 | 
|---|
| 580 | procedure TfrmODMedOut.memCommentsEnter(Sender: TObject);
 | 
|---|
| 581 | begin
 | 
|---|
| 582 |   inherited;
 | 
|---|
| 583 |   OrderMessage('');  // make sure Order Message disappears when in comments box
 | 
|---|
| 584 | end;
 | 
|---|
| 585 | 
 | 
|---|
| 586 | { all controls }
 | 
|---|
| 587 | 
 | 
|---|
| 588 | procedure TfrmODMedOut.ControlChange(Sender: TObject);
 | 
|---|
| 589 | begin
 | 
|---|
| 590 |   inherited;
 | 
|---|
| 591 |   if csLoading in ComponentState then Exit;  // to prevent error caused by txtRefills
 | 
|---|
| 592 |   if Changing then Exit;
 | 
|---|
| 593 |   if FMedCombo.ItemIEN = 0 then Exit;        // prevent txtRefills from updating early
 | 
|---|
| 594 |   with FMedCombo do if ItemIEN > 0
 | 
|---|
| 595 |     then Responses.Update('ORDERABLE', 1, ItemID, Piece(Items[ItemIndex], U, 3))
 | 
|---|
| 596 |     else Responses.Update('ORDERABLE', 1, '', '');
 | 
|---|
| 597 |   with cboDispense   do if ItemIEN > 0
 | 
|---|
| 598 |     then Responses.Update('DRUG', 1, ItemID, Piece(Items[ItemIndex], U, 2))
 | 
|---|
| 599 |     else Responses.Update('DRUG', 1, '', '');
 | 
|---|
| 600 |   if memComplex.Visible = False then
 | 
|---|
| 601 |   begin
 | 
|---|
| 602 |     with cboInstructions do Responses.Update('INSTR', 1, Text, Text);
 | 
|---|
| 603 |     with btnUnits        do if Visible then Responses.Update('MISC',  1, Caption, Caption);
 | 
|---|
| 604 |     with cboRoute        do if ItemIndex > -1
 | 
|---|
| 605 |       then Responses.Update('ROUTE', 1, ItemID, Piece(Items[ItemIndex], U, 3)) // abbreviation
 | 
|---|
| 606 |       else Responses.Update('ROUTE', 1, Text, Text);
 | 
|---|
| 607 |     with cboSchedule     do Responses.Update('SCHEDULE', 1, Text, Text);
 | 
|---|
| 608 |   end;
 | 
|---|
| 609 |   with txtQuantity     do Responses.Update('QTY', 1, Text, Text);
 | 
|---|
| 610 |   with txtRefills      do Responses.Update('REFILLS', 1, Text, Text);
 | 
|---|
| 611 |   with cboPickup       do Responses.Update('PICKUP', 1, ItemID, Text);
 | 
|---|
| 612 |   with cboPriority     do Responses.Update('URGENCY', 1, ItemID, Text);
 | 
|---|
| 613 |   with memComments     do Responses.Update('COMMENT', 1, TX_WPTYPE, Text);
 | 
|---|
| 614 |   with cboSC           do if Enabled then Responses.Update('SC', 1, ItemID, Text);
 | 
|---|
| 615 |   memOrder.Text := Responses.OrderText;
 | 
|---|
| 616 | end;
 | 
|---|
| 617 | 
 | 
|---|
| 618 | end.
 | 
|---|
| 619 | 
 | 
|---|