| [453] | 1 | //kt -- Modified with SourceScanner on 8/8/2007 | 
|---|
|  | 2 | unit fODBase; | 
|---|
|  | 3 |  | 
|---|
|  | 4 | {$OPTIMIZATION OFF}                              // REMOVE AFTER UNIT IS DEBUGGED | 
|---|
|  | 5 |  | 
|---|
|  | 6 | interface | 
|---|
|  | 7 |  | 
|---|
|  | 8 | uses | 
|---|
|  | 9 | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, | 
|---|
|  | 10 | ORCtrls, ORFn, uConst, rOrders, rODBase, uCore, ComCtrls, ExtCtrls, Menus, Mask, | 
|---|
|  | 11 | Buttons, UBAGlobals, UBACore, DKLang; | 
|---|
|  | 12 |  | 
|---|
|  | 13 | type | 
|---|
|  | 14 | TCtrlInit = class | 
|---|
|  | 15 | private | 
|---|
|  | 16 | Name:   string; | 
|---|
|  | 17 | Text:   string; | 
|---|
|  | 18 | ListID: string; | 
|---|
|  | 19 | List:   TStringList; | 
|---|
|  | 20 | public | 
|---|
|  | 21 | constructor Create; | 
|---|
|  | 22 | destructor Destroy; override; | 
|---|
|  | 23 | end; | 
|---|
|  | 24 |  | 
|---|
|  | 25 | TCtrlInits = class | 
|---|
|  | 26 | private | 
|---|
|  | 27 | FDfltList: TList; | 
|---|
|  | 28 | FOIList:   TList; | 
|---|
|  | 29 | procedure ExtractInits(Src: TStrings; Dest: TList); | 
|---|
|  | 30 | function FindInitByName(const AName: string): TCtrlInit; | 
|---|
|  | 31 | public | 
|---|
|  | 32 | constructor Create; | 
|---|
|  | 33 | destructor Destroy; override; | 
|---|
|  | 34 | procedure ClearOI; | 
|---|
|  | 35 | function DefaultText(const ASection: string): string; | 
|---|
|  | 36 | procedure LoadDefaults(Src: TStrings); | 
|---|
|  | 37 | procedure LoadOrderItem(Src: TStrings); | 
|---|
|  | 38 | procedure SetControl(AControl: TControl; const ASection: string); | 
|---|
|  | 39 | procedure SetListOnly(AControl: TControl; const ASection: string); | 
|---|
|  | 40 | procedure SetPopupMenu(AMenu: TPopupMenu; AClickEvent: TNotifyEvent; const ASection: string); | 
|---|
|  | 41 | function TextOf(const ASection: string): string; | 
|---|
|  | 42 | end; | 
|---|
|  | 43 |  | 
|---|
|  | 44 | TResponses = class | 
|---|
|  | 45 | private | 
|---|
|  | 46 | FDialog: string; | 
|---|
|  | 47 | FResponseList: TList; | 
|---|
|  | 48 | FPrompts: TList; | 
|---|
|  | 49 | FCopyOrder: string; | 
|---|
|  | 50 | FEditOrder: string; | 
|---|
|  | 51 | FTransferOrder: string; | 
|---|
|  | 52 | FDisplayGroup: Integer; | 
|---|
|  | 53 | FQuickOrder: Integer; | 
|---|
|  | 54 | FOrderChecks: TStringList; | 
|---|
|  | 55 | FVarLeading:  string; | 
|---|
|  | 56 | FVarTrailing: string; | 
|---|
|  | 57 | FEventType: Char; | 
|---|
|  | 58 | FEventIFN: Integer; | 
|---|
|  | 59 | FEventName: string; | 
|---|
|  | 60 | FSpecialty: Integer; | 
|---|
|  | 61 | FEffective: TFMDateTime; | 
|---|
|  | 62 | FParentEvent: TParentEvent; | 
|---|
|  | 63 | FLogTime:   TFMDateTime; | 
|---|
|  | 64 | FViewName: string; | 
|---|
|  | 65 | FCancel: boolean; | 
|---|
|  | 66 | FOrderContainsObjects: boolean; | 
|---|
|  | 67 | function FindResponseByIEN(APromptIEN, AnInstance: Integer): TResponse; | 
|---|
|  | 68 | function GetOrderText: string; | 
|---|
|  | 69 | function IENForPrompt(const APromptID: string): Integer; | 
|---|
|  | 70 | procedure SetDialog(Value: string); | 
|---|
|  | 71 | procedure SetCopyOrder(const AnID: string); | 
|---|
|  | 72 | procedure SetEditOrder(const AnID: string); | 
|---|
|  | 73 | procedure SetQuickOrder(AnIEN: Integer); | 
|---|
|  | 74 | procedure SetQuickOrderByID(const AnID: string); | 
|---|
|  | 75 | procedure FormatResponse(var FormattedText: string; var ExcludeText: Boolean; | 
|---|
|  | 76 | APrompt: TPrompt; const x: string; AnInstance: Integer); | 
|---|
|  | 77 | function FindPromptByIEN(AnIEN: Integer): TPrompt; | 
|---|
|  | 78 | procedure AppendChildren(var ParentText: string; ChildPrompts: string; AnInstance: Integer); | 
|---|
|  | 79 | procedure BuildOCItems(AList: TStringList; var AStartDtTm: string; const AFillerID: string); | 
|---|
|  | 80 | public | 
|---|
|  | 81 | constructor Create; | 
|---|
|  | 82 | destructor Destroy; override; | 
|---|
|  | 83 | procedure Clear; overload; | 
|---|
|  | 84 | procedure Clear(const APromptID: string; SaveInstance: Integer = 0); overload; | 
|---|
|  | 85 | function EValueFor(const APromptID: string; AnInstance: Integer): string; | 
|---|
|  | 86 | function GetIENForPrompt(const APromptID: string): Integer; | 
|---|
|  | 87 | function FindResponseByName(const APromptID: string; AnInstance: Integer): TResponse; | 
|---|
|  | 88 | function PromptExists(const APromptID: string):boolean; | 
|---|
|  | 89 | function InstanceCount(const APromptID: string): Integer; | 
|---|
|  | 90 | function IValueFor(const APromptID: string; AnInstance: Integer): string; | 
|---|
|  | 91 | function NextInstance(const APromptID: string; LastInstance: Integer): Integer; | 
|---|
|  | 92 | function OrderCRC: string; | 
|---|
|  | 93 | procedure Remove(const APromptID: string; AnInstance: Integer); | 
|---|
|  | 94 | procedure SaveQuickOrder(var ANewIEN: Integer; const ADisplayName: string); | 
|---|
|  | 95 | procedure SaveOrder(var AnOrder: TOrder; DlgIEN: Integer; IsIMOOrder: boolean = False); | 
|---|
|  | 96 | procedure SetControl(AControl: TControl; const APromptID: string; AnInstance: Integer); | 
|---|
|  | 97 | procedure SetEventDelay(AnEvent: TOrderDelayEvent); | 
|---|
|  | 98 | procedure SetPromptFormat(const APromptID, NewFormat: string); | 
|---|
|  | 99 | procedure Update(const APromptID: string; AnInstance: Integer; | 
|---|
|  | 100 | const AnIValue, AnEValue: string); | 
|---|
|  | 101 | property Dialog: string            read FDialog         write SetDialog; | 
|---|
|  | 102 | property DisplayGroup: Integer     read FDisplayGroup   write FDisplayGroup; | 
|---|
|  | 103 | property CopyOrder:    string      read FCopyOrder      write SetCopyOrder; | 
|---|
|  | 104 | property EditOrder:    string      read FEditOrder;  //  write SetEditOrder; | 
|---|
|  | 105 | property TransferOrder:string      read FTransferOrder  write FTransferOrder; | 
|---|
|  | 106 | property EventType:    Char        read FEventType; | 
|---|
|  | 107 | property EventIFN:     integer     read FEventIFN       write FEventIFN; | 
|---|
|  | 108 | property EventName:    string      read FEventName      write FEventName; | 
|---|
|  | 109 | property LogTime:      TFMDateTime read FLogTime        write FLogTime; | 
|---|
|  | 110 | property QuickOrder:   Integer     read FQuickOrder     write SetQuickOrder; | 
|---|
|  | 111 | property OrderChecks:  TStringList read FOrderChecks    write FOrderChecks; | 
|---|
|  | 112 | property OrderText:    string      read GetOrderText; | 
|---|
|  | 113 | property VarLeading:   string      read FVarLeading     write FVarLeading; | 
|---|
|  | 114 | property VarTrailing:  string      read FVarTrailing    write FVarTrailing; | 
|---|
|  | 115 | property TheList:      TList       read FResponseList   write FResponseList; | 
|---|
|  | 116 | property Cancel:       boolean     read FCancel         write FCancel; | 
|---|
|  | 117 | property OrderContainsObjects: boolean read FOrderContainsObjects write FOrderContainsObjects; | 
|---|
|  | 118 | end; | 
|---|
|  | 119 |  | 
|---|
|  | 120 | TCallOnExit = procedure; | 
|---|
|  | 121 |  | 
|---|
|  | 122 | TfrmODBase = class(TfrmAutoSz) | 
|---|
|  | 123 | memOrder: TCaptionMemo; | 
|---|
|  | 124 | cmdAccept: TButton; | 
|---|
|  | 125 | cmdQuit: TButton; | 
|---|
|  | 126 | pnlMessage: TPanel; | 
|---|
|  | 127 | imgMessage: TImage; | 
|---|
|  | 128 | memMessage: TRichEdit; | 
|---|
|  | 129 | procedure cmdQuitClick(Sender: TObject); | 
|---|
|  | 130 | procedure cmdAcceptClick(Sender: TObject); | 
|---|
|  | 131 | procedure FormKeyPress(Sender: TObject; var Key: Char); | 
|---|
|  | 132 | procedure FormCreate(Sender: TObject); | 
|---|
|  | 133 | procedure FormDestroy(Sender: TObject); | 
|---|
|  | 134 | procedure FormClose(Sender: TObject; var Action: TCloseAction); | 
|---|
|  | 135 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
|---|
|  | 136 | procedure memMessageMouseUp(Sender: TObject; Button: TMouseButton; | 
|---|
|  | 137 | Shift: TShiftState; X, Y: Integer); | 
|---|
|  | 138 | procedure pnlMessageExit(Sender: TObject); | 
|---|
|  | 139 | procedure pnlMessageMouseDown(Sender: TObject; Button: TMouseButton; | 
|---|
|  | 140 | Shift: TShiftState; X, Y: Integer); | 
|---|
|  | 141 | procedure pnlMessageMouseMove(Sender: TObject; Shift: TShiftState; X, | 
|---|
|  | 142 | Y: Integer); | 
|---|
|  | 143 | private | 
|---|
|  | 144 | FIsSupply:  Boolean; | 
|---|
|  | 145 | FAbortOrder:   Boolean; | 
|---|
|  | 146 | FAllowQO:      Boolean; | 
|---|
|  | 147 | FAutoAccept:   Boolean; | 
|---|
|  | 148 | FClosing:      Boolean; | 
|---|
|  | 149 | FChanging:     Boolean; | 
|---|
|  | 150 | FDialogIEN:    Integer; | 
|---|
|  | 151 | FDisplayGroup: Integer; | 
|---|
|  | 152 | FFillerID:     string; | 
|---|
|  | 153 | FFromQuit:     Boolean; | 
|---|
|  | 154 | FAcceptOK:     Boolean; | 
|---|
|  | 155 | FCtrlInits:    TCtrlInits; | 
|---|
|  | 156 | FResponses:    TResponses; | 
|---|
|  | 157 | FPreserve:     TList; | 
|---|
|  | 158 | FRefNum:       Integer; | 
|---|
|  | 159 | FOrderAction:  Integer; | 
|---|
|  | 160 | FKeyVariables: string; | 
|---|
|  | 161 | FCallOnExit:   TCallOnExit; | 
|---|
|  | 162 | FTestMode:     Boolean; | 
|---|
|  | 163 | FDlgFormID:    Integer; | 
|---|
|  | 164 | FDfltCopay:    String; | 
|---|
|  | 165 | FEvtForPassDischarge:  Char; | 
|---|
|  | 166 | FEvtID    :    Integer; | 
|---|
|  | 167 | FEvtType  :    Char; | 
|---|
|  | 168 | FEvtName  :    string; | 
|---|
|  | 169 | FIncludeOIPI:  boolean; | 
|---|
|  | 170 | FIsIMO:        boolean;  //imo | 
|---|
|  | 171 | FMessageClickX: integer; | 
|---|
|  | 172 | FMessageClickY: integer; | 
|---|
|  | 173 | function AcceptOrderChecks: Boolean; | 
|---|
|  | 174 | procedure ClearDialogControls; | 
|---|
|  | 175 | function GetKeyVariable(const Index: string): string; | 
|---|
|  | 176 | function GetEffectiveDate: TFMDateTime; | 
|---|
|  | 177 | procedure SetDisplayGroup(Value: Integer); | 
|---|
|  | 178 | procedure SetFillerID(const Value: string); | 
|---|
|  | 179 | procedure DoSetFontSize( FontSize: integer); | 
|---|
|  | 180 | protected | 
|---|
|  | 181 | function LESValidationCheck: boolean; | 
|---|
|  | 182 | procedure InitDialog; virtual; | 
|---|
|  | 183 | procedure SetDialogIEN(Value: Integer); virtual; | 
|---|
|  | 184 | procedure Validate(var AnErrMsg: string); virtual; | 
|---|
|  | 185 | function ValidSave: Boolean; | 
|---|
|  | 186 | procedure ShowOrderMessage(Show: boolean); | 
|---|
|  | 187 | public | 
|---|
|  | 188 | function OrderForInpatient: Boolean; | 
|---|
|  | 189 | procedure SetDefaultCoPay(AnOrderID: string); | 
|---|
|  | 190 | procedure OrderMessage(const AMessage: string); | 
|---|
|  | 191 | procedure PreserveControl(AControl: TControl); | 
|---|
|  | 192 | procedure SetupDialog(OrderAction: Integer; const ID: string); virtual; | 
|---|
|  | 193 | procedure SetFontSize( FontSize: integer); virtual; | 
|---|
|  | 194 | procedure SetKeyVariables(const VarStr: string); | 
|---|
|  | 195 | procedure TabClose(var CanClose: Boolean); | 
|---|
|  | 196 | property AbortOrder:  Boolean       read FAbortOrder   write FAbortOrder; | 
|---|
|  | 197 | property AcceptOK:  Boolean         read FAcceptOK; | 
|---|
|  | 198 | property AllowQuickOrder: Boolean   read FAllowQO      write FAllowQO; | 
|---|
|  | 199 | property AutoAccept: Boolean        read FAutoAccept   write FAutoAccept; | 
|---|
|  | 200 | property CallOnExit: TCallOnExit    read FCallOnExit   write FCallOnExit; | 
|---|
|  | 201 | property Changing:  Boolean         read FChanging     write FChanging; | 
|---|
|  | 202 | property Closing:   Boolean         read FClosing; | 
|---|
|  | 203 | property CtrlInits: TCtrlInits      read FCtrlInits    write FCtrlInits; | 
|---|
|  | 204 | property DialogIEN: Integer         read FDialogIEN    write SetDialogIEN; | 
|---|
|  | 205 | property DisplayGroup: Integer      read FDisplayGroup write SetDisplayGroup; | 
|---|
|  | 206 | property EffectiveDate: TFMDateTime read GetEffectiveDate; | 
|---|
|  | 207 | property FillerID: string           read FFillerID     write SetFillerID; | 
|---|
|  | 208 | property KeyVariable[const Index: string]: string read GetKeyVariable; | 
|---|
|  | 209 | property RefNum: Integer            read FRefNum       write FRefNum; | 
|---|
|  | 210 | property Responses: TResponses      read FResponses    write FResponses; | 
|---|
|  | 211 | property TestMode: Boolean          read FTestMode     write FTestMode; | 
|---|
|  | 212 | property DlgFormID: Integer         read FDlgFormID    write FDlgFormID; | 
|---|
|  | 213 | property DfltCopay: string          read FDfltCopay    write FDfltCopay; | 
|---|
|  | 214 | property EvtForPassDischarge: Char  read FEvtForPassDischarge  write FEvtForPassDischarge; | 
|---|
|  | 215 | property EvtID: integer             read FEvtID        write FEvtID; | 
|---|
|  | 216 | property EvtType: Char              read FEvtType      write FEvtType; | 
|---|
|  | 217 | property EvtName: String            read FEvtName      write FEvtName; | 
|---|
|  | 218 | property IncludeOIPI: boolean       read FIncludeOIPI  write FIncludeOIPI; | 
|---|
|  | 219 | property IsIMO:boolean              read FIsIMO        write FIsIMO; | 
|---|
|  | 220 | property IsSupply: boolean          read FIsSupply     write FIsSupply; | 
|---|
|  | 221 | end; | 
|---|
|  | 222 |  | 
|---|
|  | 223 | var | 
|---|
|  | 224 | frmODBase: TfrmODBase; | 
|---|
|  | 225 | XfInToOutNow :boolean = False;       // it's used only for transfering Inpatient Meds to OutPatient Med for | 
|---|
|  | 226 | // immediately release (NO EVENT DELAY) | 
|---|
|  | 227 | XferOuttoInOnMeds : boolean = False; // it's used only for transfering Outpatient Meds to Inpatient Med for | 
|---|
|  | 228 | // immediately release (NO EVENT DELAY) | 
|---|
|  | 229 | ImmdCopyAct: boolean  = False; | 
|---|
|  | 230 | IsUDGroup: boolean = False;     // it's only used for copy inpatient med order. | 
|---|
|  | 231 | DEASig: string;                 // digital signature | 
|---|
|  | 232 | DupORIFN: string;               // it's used to identify the order number for duplicate orders in order checking | 
|---|
|  | 233 | NoFresh: boolean = False;        // EDO use only | 
|---|
|  | 234 | SaveAsCurrent: boolean = False;  // EDO use only | 
|---|
|  | 235 | CIDCOkToSave: boolean;   // CIDC only, used for consult orders. | 
|---|
|  | 236 | OrderSource: string = ''; | 
|---|
|  | 237 | EventDefaultOD: integer = 0;    // If it's event default dialog? | 
|---|
|  | 238 | IsTransferAction: boolean = False; | 
|---|
|  | 239 |  | 
|---|
|  | 240 | procedure ClearControl(AControl: TControl); | 
|---|
|  | 241 | procedure ResetControl(AControl: TControl); | 
|---|
|  | 242 |  | 
|---|
|  | 243 | implementation | 
|---|
|  | 244 |  | 
|---|
|  | 245 | {$R *.DFM} | 
|---|
|  | 246 |  | 
|---|
|  | 247 | uses fOCAccept, uODBase, rCore, rMisc, fODMessage, | 
|---|
|  | 248 | fTemplateDialog, uEventHooks, uTemplates, rConsults,fOrders,uOrders, | 
|---|
|  | 249 | fFrame, uTemplateFields, fClinicWardMeds; | 
|---|
|  | 250 |  | 
|---|
|  | 251 | //const | 
|---|
|  | 252 | //TX_ACCEPT = 'Accept the following order?' + CRLF + CRLF;  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 253 | //TX_ACCEPT_CAP = 'Unsaved Order';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 254 | //TC_ORDERCHECKS = 'Order Checks';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 255 |  | 
|---|
|  | 256 | { Procedures shared with descendent forms } | 
|---|
|  | 257 |  | 
|---|
|  | 258 | var | 
|---|
|  | 259 | TX_ACCEPT       : string;  //kt | 
|---|
|  | 260 | TX_ACCEPT_CAP   : string;  //kt | 
|---|
|  | 261 | TC_ORDERCHECKS  : string;  //kt | 
|---|
|  | 262 |  | 
|---|
|  | 263 |  | 
|---|
|  | 264 | procedure SetupVars; | 
|---|
|  | 265 | //kt Added entire function to replace constant declarations 8/8/2007 | 
|---|
|  | 266 | begin | 
|---|
|  | 267 | TX_ACCEPT := DKLangConstW('fODBase_Accept_the_following_orderx') + CRLF + CRLF; | 
|---|
|  | 268 | TX_ACCEPT_CAP := DKLangConstW('fODBase_Unsaved_Order'); | 
|---|
|  | 269 | TC_ORDERCHECKS := DKLangConstW('fODBase_Order_Checks'); | 
|---|
|  | 270 | end; | 
|---|
|  | 271 |  | 
|---|
|  | 272 | procedure ClearControl(AControl: TControl); | 
|---|
|  | 273 | { clears a control, removes text and listbox items } | 
|---|
|  | 274 | begin | 
|---|
|  | 275 | if AControl is TLabel then with TLabel(AControl) do Caption := '' | 
|---|
|  | 276 | else if AControl is TStaticText then with TStaticText(AControl) do Caption := '' | 
|---|
|  | 277 | else if AControl is TButton then with TButton(AControl) do Caption := '' | 
|---|
|  | 278 | else if AControl is TEdit then with TEdit(AControl) do Text := '' | 
|---|
|  | 279 | else if AControl is TMemo then with TMemo(AControl) do Clear | 
|---|
|  | 280 | else if AControl is TRichEdit then with TRichEdit(AControl) do Clear | 
|---|
|  | 281 | else if AControl is TORListBox then with TORListBox(AControl) do Clear | 
|---|
|  | 282 | else if AControl is TListBox then with TListBox(AControl) do Clear | 
|---|
|  | 283 | else if AControl is TORComboBox then with TORComboBox(AControl) do | 
|---|
|  | 284 | begin | 
|---|
|  | 285 | Items.Clear; | 
|---|
|  | 286 | Text := ''; | 
|---|
|  | 287 | end | 
|---|
|  | 288 | else if AControl is TComboBox then with TComboBox(AControl) do | 
|---|
|  | 289 | begin | 
|---|
|  | 290 | Clear; | 
|---|
|  | 291 | Text := ''; | 
|---|
|  | 292 | end; | 
|---|
|  | 293 | end; | 
|---|
|  | 294 |  | 
|---|
|  | 295 | procedure ResetControl(AControl: TControl); | 
|---|
|  | 296 | { clears text, deselects items, does not remove listbox or combobox items } | 
|---|
|  | 297 | begin | 
|---|
|  | 298 | if AControl is TLabel then with TLabel(AControl) do Caption := '' | 
|---|
|  | 299 | else if AControl is TStaticText then with TStaticText(AControl) do Caption := '' | 
|---|
|  | 300 | else if AControl is TButton then with TButton(AControl) do Caption := '' | 
|---|
|  | 301 | else if AControl is TEdit then with TEdit(AControl) do Text := '' | 
|---|
|  | 302 | else if AControl is TMemo then with TMemo(AControl) do Clear | 
|---|
|  | 303 | else if AControl is TRichEdit then with TRichEdit(AControl) do Clear | 
|---|
|  | 304 | else if AControl is TListBox then with TListBox(AControl) do ItemIndex := -1 | 
|---|
|  | 305 | else if AControl is TORComboBox then with TORComboBox(AControl) do | 
|---|
|  | 306 | begin | 
|---|
|  | 307 | Text := ''; | 
|---|
|  | 308 | ItemIndex := -1; | 
|---|
|  | 309 | end | 
|---|
|  | 310 | else if AControl is TComboBox then with TComboBox(AControl) do | 
|---|
|  | 311 | begin | 
|---|
|  | 312 | Text := ''; | 
|---|
|  | 313 | ItemIndex := -1; | 
|---|
|  | 314 | end; | 
|---|
|  | 315 | end; | 
|---|
|  | 316 |  | 
|---|
|  | 317 | { TCtrlInit methods } | 
|---|
|  | 318 |  | 
|---|
|  | 319 | constructor TCtrlInit.Create; | 
|---|
|  | 320 | begin | 
|---|
|  | 321 | List := TStringList.Create; | 
|---|
|  | 322 | end; | 
|---|
|  | 323 |  | 
|---|
|  | 324 | destructor TCtrlInit.Destroy; | 
|---|
|  | 325 | begin | 
|---|
|  | 326 | List.Free; | 
|---|
|  | 327 | inherited Destroy; | 
|---|
|  | 328 | end; | 
|---|
|  | 329 |  | 
|---|
|  | 330 | { TCtrlInits methods } | 
|---|
|  | 331 |  | 
|---|
|  | 332 | constructor TCtrlInits.Create; | 
|---|
|  | 333 | { create lists to store initial value for dialog and selected orderable item } | 
|---|
|  | 334 | begin | 
|---|
|  | 335 | FDfltList := TList.Create; | 
|---|
|  | 336 | FOIList   := TList.Create; | 
|---|
|  | 337 | end; | 
|---|
|  | 338 |  | 
|---|
|  | 339 | destructor TCtrlInits.Destroy; | 
|---|
|  | 340 | { free the objects used to store initialization information } | 
|---|
|  | 341 | var | 
|---|
|  | 342 | i: Integer; | 
|---|
|  | 343 | begin | 
|---|
|  | 344 | { free the objects in the lists first } | 
|---|
|  | 345 | with FDfltList do for i := 0 to Count - 1 do TCtrlInit(Items[i]).Free; | 
|---|
|  | 346 | FDfltList.Free; | 
|---|
|  | 347 | ClearOI; | 
|---|
|  | 348 | FOIList.Free; | 
|---|
|  | 349 | inherited Destroy; | 
|---|
|  | 350 | end; | 
|---|
|  | 351 |  | 
|---|
|  | 352 | procedure TCtrlInits.ClearOI; | 
|---|
|  | 353 | { clears the records in FOIList, but not FDfltList } | 
|---|
|  | 354 | var | 
|---|
|  | 355 | i: Integer; | 
|---|
|  | 356 | begin | 
|---|
|  | 357 | with FOIList do for i := 0 to Count - 1 do TCtrlInit(Items[i]).Free; | 
|---|
|  | 358 | FOIList.Clear; | 
|---|
|  | 359 | end; | 
|---|
|  | 360 |  | 
|---|
|  | 361 | procedure TCtrlInits.ExtractInits(Src: TStrings; Dest: TList); | 
|---|
|  | 362 | { load a list with TCtrlInit records (source strings are those passed from server } | 
|---|
|  | 363 | var | 
|---|
|  | 364 | i: Integer; | 
|---|
|  | 365 | ACtrlInit: TCtrlInit; | 
|---|
|  | 366 | begin | 
|---|
|  | 367 | i := 0; | 
|---|
|  | 368 | while i < Src.Count do | 
|---|
|  | 369 | begin | 
|---|
|  | 370 | if CharAt(Src[i], 1) = '~' then | 
|---|
|  | 371 | begin | 
|---|
|  | 372 | ACtrlInit := TCtrlInit.Create; | 
|---|
|  | 373 | with ACtrlInit do | 
|---|
|  | 374 | begin | 
|---|
|  | 375 | Name := Copy(Src[i], 2, Length(Src[i])); | 
|---|
|  | 376 | List := TStringList.Create; | 
|---|
|  | 377 | Inc(i); | 
|---|
|  | 378 | while (i < Src.Count) and (CharAt(Src[i], 1) <> '~') do | 
|---|
|  | 379 | begin | 
|---|
|  | 380 | if CharAt(Src[i], 1) = 'i' then List.Add(Copy(Src[i], 2, 255)); | 
|---|
|  | 381 | if CharAt(Src[i], 1) = 't' then List.Add(Copy(Src[i], 2, 255)); | 
|---|
|  | 382 | if CharAt(Src[i], 1) = 'd' then | 
|---|
|  | 383 | begin | 
|---|
|  | 384 | Text := Piece(Src[i], U, 2); | 
|---|
|  | 385 | ListID := Copy(Piece(Src[i], U, 1), 2, 255); | 
|---|
|  | 386 | end; | 
|---|
|  | 387 | Inc(i); | 
|---|
|  | 388 | end; {while i & CharAt...} | 
|---|
|  | 389 | Dest.Add(ACtrlInit); | 
|---|
|  | 390 | end; {with ACtrlDflt} | 
|---|
|  | 391 | end; {if CharAt} | 
|---|
|  | 392 | end; {while i} | 
|---|
|  | 393 | end; | 
|---|
|  | 394 |  | 
|---|
|  | 395 |  | 
|---|
|  | 396 | procedure TCtrlInits.LoadDefaults(Src: TStrings); | 
|---|
|  | 397 | { loads control initialization information for the dialog } | 
|---|
|  | 398 | begin | 
|---|
|  | 399 | FDfltList.Clear; | 
|---|
|  | 400 | ExtractInits(Src, FDfltList); | 
|---|
|  | 401 | end; | 
|---|
|  | 402 |  | 
|---|
|  | 403 | procedure TCtrlInits.LoadOrderItem(Src: TStrings); | 
|---|
|  | 404 | { loads control initialization information for the orderable item } | 
|---|
|  | 405 | begin | 
|---|
|  | 406 | ClearOI; | 
|---|
|  | 407 | ExtractInits(Src, FOIList); | 
|---|
|  | 408 | end; | 
|---|
|  | 409 |  | 
|---|
|  | 410 | function TCtrlInits.FindInitByName(const AName: string): TCtrlInit; | 
|---|
|  | 411 | { look first in FOIList, then in FDfltList for initial values identified by name (~section) } | 
|---|
|  | 412 | var | 
|---|
|  | 413 | i: Integer; | 
|---|
|  | 414 | begin | 
|---|
|  | 415 | Result := nil; | 
|---|
|  | 416 | with FOIList do | 
|---|
|  | 417 | for i := 0 to Count - 1 do if TCtrlInit(Items[i]).Name = AName then | 
|---|
|  | 418 | begin | 
|---|
|  | 419 | Result := TCtrlInit(Items[i]); | 
|---|
|  | 420 | break; | 
|---|
|  | 421 | end; | 
|---|
|  | 422 | if Result = nil then with FDfltList do | 
|---|
|  | 423 | for i := 0 to Count - 1 do if TCtrlInit(Items[i]).Name = AName then | 
|---|
|  | 424 | begin | 
|---|
|  | 425 | Result := TCtrlInit(Items[i]); | 
|---|
|  | 426 | break; | 
|---|
|  | 427 | end; | 
|---|
|  | 428 | end; | 
|---|
|  | 429 |  | 
|---|
|  | 430 | procedure TCtrlInits.SetControl(AControl: TControl; const ASection: string); | 
|---|
|  | 431 | { initializes a control to the information in a section (~section from server) } | 
|---|
|  | 432 | var | 
|---|
|  | 433 | CtrlInit: TCtrlInit; | 
|---|
|  | 434 | begin | 
|---|
|  | 435 | ClearControl(AControl); | 
|---|
|  | 436 | CtrlInit := FindInitByName(ASection); | 
|---|
|  | 437 | if CtrlInit = nil then Exit; | 
|---|
|  | 438 | if AControl is TLabel then with TLabel(AControl) do Caption := CtrlInit.Text | 
|---|
|  | 439 | else if AControl is TStaticText then with TStaticText(AControl) do Caption := CtrlInit.Text | 
|---|
|  | 440 | else if AControl is TButton then with TButton(AControl) do Caption := CtrlInit.Text | 
|---|
|  | 441 | else if AControl is TEdit then with TEdit(AControl) do Text := CtrlInit.Text | 
|---|
|  | 442 | else if AControl is TMemo then with TMemo(AControl) do Lines.Assign(CtrlInit.List) | 
|---|
|  | 443 | else if AControl is TRichEdit then with TRichEdit(AControl) do Lines.Assign(CtrlInit.List) | 
|---|
|  | 444 | else if AControl is TORListBox then with TORListBox(AControl) do Items.Assign(CtrlInit.List) | 
|---|
|  | 445 | else if AControl is TListBox then with TListBox(AControl) do Items.Assign(CtrlInit.List) | 
|---|
|  | 446 | else if AControl is TComboBox then with TComboBox(AControl) do | 
|---|
|  | 447 | begin | 
|---|
|  | 448 | Items.Assign(CtrlInit.List); | 
|---|
|  | 449 | Text := CtrlInit.Text; | 
|---|
|  | 450 | end | 
|---|
|  | 451 | else if AControl is TORComboBox then with TORComboBox(AControl) do | 
|---|
|  | 452 | begin | 
|---|
|  | 453 | Items.Assign(CtrlInit.List); | 
|---|
|  | 454 | if LongList then InitLongList(Text) else Text := CtrlInit.Text; | 
|---|
|  | 455 | SelectByID(CtrlInit.ListID); | 
|---|
|  | 456 | end; | 
|---|
|  | 457 | { need to add SelectByID for combobox & listbox } | 
|---|
|  | 458 | end; | 
|---|
|  | 459 |  | 
|---|
|  | 460 | procedure TCtrlInits.SetListOnly(AControl: TControl; const ASection: string); | 
|---|
|  | 461 | { assigns list portion to a control from a section (used to set ShortList for meds) } | 
|---|
|  | 462 | var | 
|---|
|  | 463 | CtrlInit: TCtrlInit; | 
|---|
|  | 464 | begin | 
|---|
|  | 465 | CtrlInit := FindInitByName(ASection); | 
|---|
|  | 466 | if CtrlInit = nil then Exit; | 
|---|
|  | 467 | if      AControl is TMemo       then with TMemo(AControl)       do Lines.Assign(CtrlInit.List) | 
|---|
|  | 468 | else if AControl is TORListBox  then with TORListBox(AControl)  do Items.Assign(CtrlInit.List) | 
|---|
|  | 469 | else if AControl is TListBox    then with TListBox(AControl)    do Items.Assign(CtrlInit.List) | 
|---|
|  | 470 | else if AControl is TComboBox   then with TComboBox(AControl)   do Items.Assign(CtrlInit.List) | 
|---|
|  | 471 | else if AControl is TORComboBox then with TORComboBox(AControl) do Items.Assign(CtrlInit.List); | 
|---|
|  | 472 | end; | 
|---|
|  | 473 |  | 
|---|
|  | 474 | procedure TCtrlInits.SetPopupMenu(AMenu: TPopupMenu; AClickEvent: TNotifyEvent; const ASection: string); | 
|---|
|  | 475 | { populates a popup menu with items in a list, leaves the maximum text width in Tag } | 
|---|
|  | 476 | var | 
|---|
|  | 477 | i, MaxWidth: Integer; | 
|---|
|  | 478 | CtrlInit: TCtrlInit; | 
|---|
|  | 479 | AMenuItem: TMenuItem; | 
|---|
|  | 480 | begin | 
|---|
|  | 481 | CtrlInit := FindInitByName(ASection); | 
|---|
|  | 482 | // clear the current menu entries | 
|---|
|  | 483 | for i := AMenu.Items.Count - 1 downto 0 do | 
|---|
|  | 484 | begin | 
|---|
|  | 485 | AMenuItem := AMenu.Items[i]; | 
|---|
|  | 486 | if AMenuItem <> nil then | 
|---|
|  | 487 | begin | 
|---|
|  | 488 | AMenu.Items.Delete(i); | 
|---|
|  | 489 | AMenuItem.Free; | 
|---|
|  | 490 | end; | 
|---|
|  | 491 | end; | 
|---|
|  | 492 | MaxWidth := 0; | 
|---|
|  | 493 | for i := 0 to CtrlInit.List.Count - 1 do | 
|---|
|  | 494 | begin | 
|---|
|  | 495 | AMenuItem := TMenuItem.Create(Application); | 
|---|
|  | 496 | AMenuItem.Caption := CtrlInit.List[i]; | 
|---|
|  | 497 | AMenuItem.OnClick := AClickEvent; | 
|---|
|  | 498 | AMenu.Items.Add(AMenuItem); | 
|---|
|  | 499 | MaxWidth := HigherOf(MaxWidth, Application.MainForm.Canvas.TextWidth(CtrlInit.List[i])); | 
|---|
|  | 500 | end; | 
|---|
|  | 501 | AMenu.Tag := MaxWidth; | 
|---|
|  | 502 | end; | 
|---|
|  | 503 |  | 
|---|
|  | 504 | function TCtrlInits.DefaultText(const ASection: string): string; | 
|---|
|  | 505 | var | 
|---|
|  | 506 | CtrlInit: TCtrlInit; | 
|---|
|  | 507 | begin | 
|---|
|  | 508 | Result := ''; | 
|---|
|  | 509 | CtrlInit := FindInitByName(ASection); | 
|---|
|  | 510 | if CtrlInit <> nil then Result := CtrlInit.ListID; | 
|---|
|  | 511 | end; | 
|---|
|  | 512 |  | 
|---|
|  | 513 | function TCtrlInits.TextOf(const ASection: string): string; | 
|---|
|  | 514 | var | 
|---|
|  | 515 | CtrlInit: TCtrlInit; | 
|---|
|  | 516 | begin | 
|---|
|  | 517 | Result := ''; | 
|---|
|  | 518 | CtrlInit := FindInitByName(ASection); | 
|---|
|  | 519 | if CtrlInit <> nil then Result := CtrlInit.List.Text; | 
|---|
|  | 520 | end; | 
|---|
|  | 521 |  | 
|---|
|  | 522 | { TResponses methods } | 
|---|
|  | 523 |  | 
|---|
|  | 524 | function SortPromptsBySequence(Item1, Item2: Pointer): Integer; | 
|---|
|  | 525 | { compare function used to sort formatting info by sequence - used by TResponses.SetDialog} | 
|---|
|  | 526 | var | 
|---|
|  | 527 | Prompt1, Prompt2: TPrompt; | 
|---|
|  | 528 | begin | 
|---|
|  | 529 | Prompt1 := TPrompt(Item1); | 
|---|
|  | 530 | Prompt2 := TPrompt(Item2); | 
|---|
|  | 531 | if Prompt1.Sequence < Prompt2.Sequence then Result := -1 | 
|---|
|  | 532 | else if Prompt1.Sequence > Prompt2.Sequence then Result := 1 | 
|---|
|  | 533 | else Result := 0; | 
|---|
|  | 534 | end; | 
|---|
|  | 535 |  | 
|---|
|  | 536 | constructor TResponses.Create; | 
|---|
|  | 537 | begin | 
|---|
|  | 538 | FResponseList := TList.Create; | 
|---|
|  | 539 | FPrompts := TList.Create; | 
|---|
|  | 540 | FOrderChecks := TStringList.Create; | 
|---|
|  | 541 | FEventType := #0; | 
|---|
|  | 542 | FParentEvent := TParentEvent.Create; | 
|---|
|  | 543 | FLogTime := 0; | 
|---|
|  | 544 | end; | 
|---|
|  | 545 |  | 
|---|
|  | 546 | destructor TResponses.Destroy; | 
|---|
|  | 547 | { frees all response objects before freeing list } | 
|---|
|  | 548 | var | 
|---|
|  | 549 | i: Integer; | 
|---|
|  | 550 | begin | 
|---|
|  | 551 | Clear; | 
|---|
|  | 552 | FOrderChecks.Free; | 
|---|
|  | 553 | FResponseList.Free; | 
|---|
|  | 554 | with FPrompts do for i := 0 to Count - 1 do TPrompt(Items[i]).Free; | 
|---|
|  | 555 | FPrompts.Free; | 
|---|
|  | 556 | inherited Destroy; | 
|---|
|  | 557 | end; | 
|---|
|  | 558 |  | 
|---|
|  | 559 | procedure TResponses.Clear; | 
|---|
|  | 560 | { clears all information in the response multiple } | 
|---|
|  | 561 | var | 
|---|
|  | 562 | i: Integer; | 
|---|
|  | 563 | begin | 
|---|
|  | 564 | FVarLeading  := ''; | 
|---|
|  | 565 | FVarTrailing := ''; | 
|---|
|  | 566 | FQuickOrder  := 0; | 
|---|
|  | 567 | //FCopyOrder  := '';  // don't clear FCopyOrder either? | 
|---|
|  | 568 | // don't clear FEditOrder or it will cause a new order to be created instead of an edit | 
|---|
|  | 569 | with FResponseList do for i := 0 to Count - 1 do TResponse(Items[i]).Free; | 
|---|
|  | 570 | FResponseList.Clear; | 
|---|
|  | 571 | FOrderChecks.Clear; | 
|---|
|  | 572 | end; | 
|---|
|  | 573 |  | 
|---|
|  | 574 | procedure TResponses.Clear(const APromptID: string; SaveInstance: Integer = 0); | 
|---|
|  | 575 | var | 
|---|
|  | 576 | AResponse: TResponse; | 
|---|
|  | 577 | i: Integer; | 
|---|
|  | 578 | begin | 
|---|
|  | 579 | with FResponseList do | 
|---|
|  | 580 | for i := Count - 1 downto SaveInstance do | 
|---|
|  | 581 | begin | 
|---|
|  | 582 | AResponse := TResponse(Items[i]); | 
|---|
|  | 583 | if AResponse.PromptID = APromptID then | 
|---|
|  | 584 | begin | 
|---|
|  | 585 | AResponse.Free; | 
|---|
|  | 586 | FResponseList.Delete(i); | 
|---|
|  | 587 | end; {if AResponse} | 
|---|
|  | 588 | end; {for} | 
|---|
|  | 589 | end; | 
|---|
|  | 590 |  | 
|---|
|  | 591 | procedure TResponses.SetDialog(Value: string); | 
|---|
|  | 592 | { loads formatting information for a dialog } | 
|---|
|  | 593 | var | 
|---|
|  | 594 | i: Integer; | 
|---|
|  | 595 | begin | 
|---|
|  | 596 | with FPrompts do for i := 0 to Count - 1 do TPrompt(Items[i]).Free; | 
|---|
|  | 597 | FPrompts.Clear; | 
|---|
|  | 598 | FDialog := Value; | 
|---|
|  | 599 | LoadDialogDefinition(FPrompts, FDialog); | 
|---|
|  | 600 | FPrompts.Sort(SortPromptsBySequence); | 
|---|
|  | 601 | end; | 
|---|
|  | 602 |  | 
|---|
|  | 603 | procedure TResponses.SetCopyOrder(const AnID: string); | 
|---|
|  | 604 | { sets responses to the values for an order that is created by copying } | 
|---|
|  | 605 | var | 
|---|
|  | 606 | HasObjects: boolean; | 
|---|
|  | 607 | begin | 
|---|
|  | 608 | if AnID = '' then | 
|---|
|  | 609 | begin | 
|---|
|  | 610 | FCopyOrder := AnID; | 
|---|
|  | 611 | Exit; | 
|---|
|  | 612 | end; | 
|---|
|  | 613 | Clear; | 
|---|
|  | 614 | LoadResponses(FResponseList, AnID, HasObjects);                      // Example AnID=C123456;1-3604 | 
|---|
|  | 615 | FCopyOrder := Copy(Piece(AnID, '-', 1), 2, Length(AnID)); | 
|---|
|  | 616 | FOrderContainsObjects := HasObjects; | 
|---|
|  | 617 | end; | 
|---|
|  | 618 |  | 
|---|
|  | 619 | procedure TResponses.SetEditOrder(const AnID: string); | 
|---|
|  | 620 | { sets responses to the values for an order that is about to be edited } | 
|---|
|  | 621 | var | 
|---|
|  | 622 | HasObjects: boolean; | 
|---|
|  | 623 | begin | 
|---|
|  | 624 | Clear; | 
|---|
|  | 625 | LoadResponses(FResponseList, AnID, HasObjects);                      // Example AnID=X123456;1 | 
|---|
|  | 626 | FEditOrder := Copy(Piece(AnID, '-', 1), 2, Length(AnID)); | 
|---|
|  | 627 | FOrderContainsObjects := HasObjects; | 
|---|
|  | 628 | end; | 
|---|
|  | 629 |  | 
|---|
|  | 630 | procedure TResponses.SetQuickOrder(AnIEN: Integer); | 
|---|
|  | 631 | { sets responses to a quick order value - this is used by the QuickOrder property} | 
|---|
|  | 632 | var | 
|---|
|  | 633 | HasObjects: boolean; | 
|---|
|  | 634 | begin | 
|---|
|  | 635 | Clear; | 
|---|
|  | 636 | LoadResponses(FResponseList, IntToStr(AnIEN), HasObjects);           // Example AnIEN=134 | 
|---|
|  | 637 | FQuickOrder := AnIEN; | 
|---|
|  | 638 | FOrderContainsObjects := HasObjects; | 
|---|
|  | 639 | end; | 
|---|
|  | 640 |  | 
|---|
|  | 641 | procedure TResponses.SetQuickOrderByID(const AnID: string); | 
|---|
|  | 642 | { sets responses to a quick order value } | 
|---|
|  | 643 | var | 
|---|
|  | 644 | HasObjects: boolean; | 
|---|
|  | 645 | begin | 
|---|
|  | 646 | Clear; | 
|---|
|  | 647 | LoadResponses(FResponseList, AnID, HasObjects);                      // Example AnID=134-3645 | 
|---|
|  | 648 | FQuickOrder := StrToIntDef(Piece(AnID, '-', 1), 0);      // 2nd '-' piece is $H seconds | 
|---|
|  | 649 | FOrderContainsObjects := HasObjects; | 
|---|
|  | 650 | end; | 
|---|
|  | 651 |  | 
|---|
|  | 652 | procedure TResponses.BuildOCItems(AList: TStringList; var AStartDtTm: string; | 
|---|
|  | 653 | const AFillerID: string); | 
|---|
|  | 654 | var | 
|---|
|  | 655 | i, TheInstance: Integer; | 
|---|
|  | 656 | OrderableIEN, PkgPart: string; | 
|---|
|  | 657 | begin | 
|---|
|  | 658 | if EditOrder <> '' then DupORIFN := EditOrder; | 
|---|
|  | 659 | if CopyOrder <> '' then DupORIFN := CopyOrder; | 
|---|
|  | 660 | //if {(CopyOrder <> '') or} (EditOrder <> '') then Exit;  // only check new orders | 
|---|
|  | 661 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 662 | if (PromptID = 'ORDERABLE') or (PromptID = 'ADDITIVE') then | 
|---|
|  | 663 | begin | 
|---|
|  | 664 | OrderableIEN := IValue; | 
|---|
|  | 665 | TheInstance := Instance; | 
|---|
|  | 666 | PkgPart := ''; | 
|---|
|  | 667 | if AFillerID = 'LR' then PkgPart := '^LR^' + IValueFor('SPECIMEN', TheInstance); | 
|---|
|  | 668 | if (AFillerID = 'PSI') or (AFillerID = 'PSO') or (AFillerID = 'PSH') | 
|---|
|  | 669 | then PkgPart := U + AFillerID + U + IValueFor('DRUG', TheInstance); | 
|---|
|  | 670 | // was -- then PkgPart := '^PS^' + IValueFor('DRUG', TheInstance); | 
|---|
|  | 671 | if AFillerID = 'PSIV' then | 
|---|
|  | 672 | begin | 
|---|
|  | 673 | if PromptID = 'ORDERABLE' then PkgPart := '^PSIV^B;' + IValueFor('VOLUME', TheInstance); | 
|---|
|  | 674 | if PromptID = 'ADDITIVE'  then PkgPart := '^PSIV^A'; | 
|---|
|  | 675 | end; | 
|---|
|  | 676 | AList.Add(OrderableIEN + PkgPart); | 
|---|
|  | 677 | end; | 
|---|
|  | 678 | AStartDtTm := IValueFor('START', 1); | 
|---|
|  | 679 | end; | 
|---|
|  | 680 |  | 
|---|
|  | 681 | function TResponses.EValueFor(const APromptID: string; AnInstance: Integer): string; | 
|---|
|  | 682 | var | 
|---|
|  | 683 | i: Integer; | 
|---|
|  | 684 | begin | 
|---|
|  | 685 | Result := ''; | 
|---|
|  | 686 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 687 | if (PromptID = APromptID) and (Instance = AnInstance) then | 
|---|
|  | 688 | begin | 
|---|
|  | 689 | Result := EValue; | 
|---|
|  | 690 | break; | 
|---|
|  | 691 | end; | 
|---|
|  | 692 | end; | 
|---|
|  | 693 |  | 
|---|
|  | 694 | function TResponses.IValueFor(const APromptID: string; AnInstance: Integer): string; | 
|---|
|  | 695 | var | 
|---|
|  | 696 | i: Integer; | 
|---|
|  | 697 | begin | 
|---|
|  | 698 | Result := ''; | 
|---|
|  | 699 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 700 | if (PromptID = APromptID) and (Instance = AnInstance) then | 
|---|
|  | 701 | begin | 
|---|
|  | 702 | Result := IValue; | 
|---|
|  | 703 | break; | 
|---|
|  | 704 | end; | 
|---|
|  | 705 | end; | 
|---|
|  | 706 |  | 
|---|
|  | 707 | function TResponses.PromptExists(const APromptID: string): boolean; | 
|---|
|  | 708 | var | 
|---|
|  | 709 | i: Integer; | 
|---|
|  | 710 | begin | 
|---|
|  | 711 | Result := False; | 
|---|
|  | 712 | with FPrompts do for i := 0 to Count - 1 do with TPrompt(Items[i]) do | 
|---|
|  | 713 | if (ID = APromptID) then Result :=  True; | 
|---|
|  | 714 | end; | 
|---|
|  | 715 |  | 
|---|
|  | 716 | function TResponses.FindResponseByName(const APromptID: string; AnInstance: Integer): TResponse; | 
|---|
|  | 717 | var | 
|---|
|  | 718 | i: Integer; | 
|---|
|  | 719 | begin | 
|---|
|  | 720 | Result := nil; | 
|---|
|  | 721 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 722 | if (PromptID = APromptID) and (Instance = AnInstance) then | 
|---|
|  | 723 | begin | 
|---|
|  | 724 | Result := TResponse(Items[i]); | 
|---|
|  | 725 | break; | 
|---|
|  | 726 | end; | 
|---|
|  | 727 | end; | 
|---|
|  | 728 |  | 
|---|
|  | 729 | function TResponses.IENForPrompt(const APromptID: string): Integer; | 
|---|
|  | 730 | var | 
|---|
|  | 731 | i: Integer; | 
|---|
|  | 732 | begin | 
|---|
|  | 733 | Result := 0; | 
|---|
|  | 734 | with FPrompts do for i := 0 to Count - 1 do with TPrompt(Items[i]) do | 
|---|
|  | 735 | if (ID = APromptID) then | 
|---|
|  | 736 | begin | 
|---|
|  | 737 | Result := IEN; | 
|---|
|  | 738 | break; | 
|---|
|  | 739 | end; | 
|---|
|  | 740 | end; | 
|---|
|  | 741 |  | 
|---|
|  | 742 | function TResponses.InstanceCount(const APromptID: string): Integer; | 
|---|
|  | 743 | var | 
|---|
|  | 744 | i: Integer; | 
|---|
|  | 745 | begin | 
|---|
|  | 746 | Result := 0; | 
|---|
|  | 747 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 748 | if (PromptID = APromptID) then Inc(Result); | 
|---|
|  | 749 | end; | 
|---|
|  | 750 |  | 
|---|
|  | 751 | function TResponses.NextInstance(const APromptID: string; LastInstance: Integer): Integer; | 
|---|
|  | 752 | var | 
|---|
|  | 753 | i: Integer; | 
|---|
|  | 754 | begin | 
|---|
|  | 755 | Result := 0; | 
|---|
|  | 756 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 757 | if (PromptID = APromptID) and (Instance > LastInstance) and | 
|---|
|  | 758 | ((Result = 0) or ((Result > 0) and (Instance < Result))) then Result := Instance; | 
|---|
|  | 759 | end; | 
|---|
|  | 760 |  | 
|---|
|  | 761 | function TResponses.FindResponseByIEN(APromptIEN, AnInstance: Integer): TResponse; | 
|---|
|  | 762 | var | 
|---|
|  | 763 | i: Integer; | 
|---|
|  | 764 | begin | 
|---|
|  | 765 | Result := nil; | 
|---|
|  | 766 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 767 | if (PromptIEN = APromptIEN) and (Instance = AnInstance) then | 
|---|
|  | 768 | begin | 
|---|
|  | 769 | Result := TResponse(Items[i]); | 
|---|
|  | 770 | break; | 
|---|
|  | 771 | end; | 
|---|
|  | 772 | end; | 
|---|
|  | 773 |  | 
|---|
|  | 774 | procedure TResponses.FormatResponse(var FormattedText: string; var ExcludeText: Boolean; | 
|---|
|  | 775 | APrompt: TPrompt; const x: string; AnInstance: Integer); | 
|---|
|  | 776 | var | 
|---|
|  | 777 | AValue: string; | 
|---|
|  | 778 | PromptIEN: Integer; | 
|---|
|  | 779 | Related: TResponse; | 
|---|
|  | 780 | begin | 
|---|
|  | 781 | FormattedText := ''; | 
|---|
|  | 782 | ExcludeText := True; | 
|---|
|  | 783 | with APrompt do | 
|---|
|  | 784 | begin | 
|---|
|  | 785 | if FmtCode = '@' then Exit;                // skip this response | 
|---|
|  | 786 | if CharAt(FmtCode, 1) = '@' then           // exclude if related response exists | 
|---|
|  | 787 | begin | 
|---|
|  | 788 | PromptIEN := StrToIntDef(Copy(FmtCode, 2, Length(FmtCode)), 0); | 
|---|
|  | 789 | if (FindResponseByIEN(PromptIEN, AnInstance) <> nil) then Exit; | 
|---|
|  | 790 | end; | 
|---|
|  | 791 | if CharAt(FmtCode, 1) = '*' then           // include if related response exists | 
|---|
|  | 792 | begin | 
|---|
|  | 793 | PromptIEN := StrToIntDef(Copy(FmtCode, 2, Length(FmtCode)), 0); | 
|---|
|  | 794 | if FindResponseByIEN(PromptIEN, AnInstance) = nil then Exit; | 
|---|
|  | 795 | end; | 
|---|
|  | 796 | if CharAt(FmtCode, 1) = '#' then           // include if related response = value | 
|---|
|  | 797 | begin | 
|---|
|  | 798 | AValue := Copy(FmtCode, Pos('=', FmtCode) + 1, Length(FmtCode)); | 
|---|
|  | 799 | PromptIEN := StrToIntDef(Copy(Piece(FmtCode, '=', 1), 2, Length(FmtCode)), 0); | 
|---|
|  | 800 | Related := FindResponseByIEN(PromptIEN, AnInstance); | 
|---|
|  | 801 | if Related = nil then Exit; | 
|---|
|  | 802 | if not (Related.EValue = AValue) then Exit; | 
|---|
|  | 803 | end; | 
|---|
|  | 804 | if CharAt(FmtCode, 1) = '=' then           // exclude if related response has same text | 
|---|
|  | 805 | begin | 
|---|
|  | 806 | PromptIEN := StrToIntDef(Copy(FmtCode, 2, Length(FmtCode)), 0); | 
|---|
|  | 807 | Related := FindResponseByIEN(PromptIEN, AnInstance); | 
|---|
|  | 808 | if (Related <> nil) and ((Pos(Related.EValue, x) > 0) or (Pos(x, Related.EValue) > 0)) then Exit; | 
|---|
|  | 809 | end; | 
|---|
|  | 810 | ExcludeText := False; | 
|---|
|  | 811 | if (Length(x) = 0) or (CompareText(x, Omit) = 0) then Exit; | 
|---|
|  | 812 | FormattedText := x; | 
|---|
|  | 813 | if IsChild and (Length(Leading) > 0) and (CharAt(Leading, 1) <> '@') | 
|---|
|  | 814 | then FormattedText := Leading + ' ' + FormattedText; | 
|---|
|  | 815 | if IsChild and (Length(Trailing) > 0) and (CharAt(Trailing, 1) <> '@') | 
|---|
|  | 816 | then FormattedText := FormattedText + ' ' + Trailing; | 
|---|
|  | 817 | end; {with APrompt} | 
|---|
|  | 818 | end; | 
|---|
|  | 819 |  | 
|---|
|  | 820 | function TResponses.FindPromptByIEN(AnIEN: Integer): TPrompt; | 
|---|
|  | 821 | var | 
|---|
|  | 822 | i: Integer; | 
|---|
|  | 823 | begin | 
|---|
|  | 824 | Result := nil; | 
|---|
|  | 825 | with FPrompts do for i := 0 to Count - 1 do with TPrompt(Items[i]) do | 
|---|
|  | 826 | if IEN = AnIEN then | 
|---|
|  | 827 | begin | 
|---|
|  | 828 | Result := TPrompt(Items[i]); | 
|---|
|  | 829 | break; | 
|---|
|  | 830 | end; | 
|---|
|  | 831 | end; | 
|---|
|  | 832 |  | 
|---|
|  | 833 | procedure TResponses.AppendChildren(var ParentText: string; ChildPrompts: string; AnInstance: Integer); | 
|---|
|  | 834 | var | 
|---|
|  | 835 | x, Segment: string; | 
|---|
|  | 836 | Boundary, ChildIEN: Integer; | 
|---|
|  | 837 | ExcludeText: Boolean; | 
|---|
|  | 838 | AResponse: TResponse; | 
|---|
|  | 839 | APrompt: TPrompt; | 
|---|
|  | 840 | begin | 
|---|
|  | 841 | while Length(ChildPrompts) > 0 do | 
|---|
|  | 842 | begin | 
|---|
|  | 843 | Boundary := Pos('~', ChildPrompts); | 
|---|
|  | 844 | if Boundary = 0 then Boundary := Length(ChildPrompts) + 1; | 
|---|
|  | 845 | Segment := Copy(ChildPrompts, 1, Boundary - 1); | 
|---|
|  | 846 | Delete(ChildPrompts, 1, Boundary); | 
|---|
|  | 847 | ChildIEN := StrToIntDef(Segment, 0); | 
|---|
|  | 848 | APrompt := FindPromptByIEN(ChildIEN); | 
|---|
|  | 849 | if APrompt <> nil then | 
|---|
|  | 850 | begin | 
|---|
|  | 851 | AResponse := FindResponseByIEN(APrompt.IEN, AnInstance); | 
|---|
|  | 852 | if AResponse <> nil then | 
|---|
|  | 853 | begin | 
|---|
|  | 854 | FormatResponse(x, ExcludeText, APrompt, AResponse.EValue, AnInstance); | 
|---|
|  | 855 | //x := FormatResponse(APrompt, AResponse.EValue, AnInstance); | 
|---|
|  | 856 | if not ExcludeText then | 
|---|
|  | 857 | begin | 
|---|
|  | 858 | if (Length(ParentText) > 0) and (Length(x) > 0) then ParentText := ParentText + ' '; | 
|---|
|  | 859 | ParentText := ParentText + x; | 
|---|
|  | 860 | end; {if not ExcludeText} | 
|---|
|  | 861 | end; {if AResponse} | 
|---|
|  | 862 | end; {if APrompt} | 
|---|
|  | 863 | end; {while Length} | 
|---|
|  | 864 | end; {AppendChildren} | 
|---|
|  | 865 |  | 
|---|
|  | 866 | function TResponses.GetOrderText: string; | 
|---|
|  | 867 | { loop thru the response objects and build the order text } | 
|---|
|  | 868 | var | 
|---|
|  | 869 | i, AnInstance, NumInstance: Integer; | 
|---|
|  | 870 | x, Segment: string; | 
|---|
|  | 871 | ExcludeText, StartNewline: Boolean; | 
|---|
|  | 872 | AResponse: TResponse; | 
|---|
|  | 873 | APrompt: TPrompt; | 
|---|
|  | 874 | begin | 
|---|
|  | 875 | Result := ''; | 
|---|
|  | 876 | with FPrompts do for i := 0 to Count - 1 do | 
|---|
|  | 877 | begin | 
|---|
|  | 878 | APrompt := TPrompt(Items[i]); | 
|---|
|  | 879 | if APrompt.Sequence = 0 then Continue;   // skip if prompt not in formatting sequence | 
|---|
|  | 880 | NumInstance := 0; | 
|---|
|  | 881 | Segment := ''; | 
|---|
|  | 882 | AnInstance := NextInstance(APrompt.ID, 0); | 
|---|
|  | 883 | while AnInstance > 0 do | 
|---|
|  | 884 | begin | 
|---|
|  | 885 | Inc(NumInstance); | 
|---|
|  | 886 | AResponse := FindResponseByName(APrompt.ID, AnInstance); | 
|---|
|  | 887 | FormatResponse(x, ExcludeText, APrompt, AResponse.EValue, AnInstance); | 
|---|
|  | 888 | //x := FormatResponse(APrompt, AResponse.EValue, AnInstance); | 
|---|
|  | 889 | if not ExcludeText then | 
|---|
|  | 890 | begin | 
|---|
|  | 891 | if Length(APrompt.Children) > 0 then AppendChildren(x, APrompt.Children, AnInstance); | 
|---|
|  | 892 | if Length(x) > 0 then | 
|---|
|  | 893 | begin | 
|---|
|  | 894 | // should the newline property be checked for children, too? | 
|---|
|  | 895 | if APrompt.NewLine and (Length(Result) > 0) then x := CRLF + x; | 
|---|
|  | 896 | if NumInstance > 1     then Segment := Segment + ','; | 
|---|
|  | 897 | if Length(Segment) > 0 then Segment := Segment + ' '; | 
|---|
|  | 898 | Segment := Segment + x; | 
|---|
|  | 899 | end; {if Length(x)} | 
|---|
|  | 900 | end; {if not ExcudeText} | 
|---|
|  | 901 | AnInstance := NextInstance(APrompt.ID, AnInstance); | 
|---|
|  | 902 | end; {while AnInstance} | 
|---|
|  | 903 | if NumInstance > 0 then with APrompt do | 
|---|
|  | 904 | begin | 
|---|
|  | 905 | if Length(Segment) > 0 then | 
|---|
|  | 906 | begin | 
|---|
|  | 907 | if Copy(Segment, 1, 2) = CRLF then | 
|---|
|  | 908 | begin | 
|---|
|  | 909 | Segment := Copy(Segment, 3, Length(Segment)); | 
|---|
|  | 910 | StartNewline := True; | 
|---|
|  | 911 | end | 
|---|
|  | 912 | else StartNewline := False; | 
|---|
|  | 913 | if (Length(Leading) > 0) then | 
|---|
|  | 914 | begin | 
|---|
|  | 915 | if (CharAt(Leading, 1) <> '@') | 
|---|
|  | 916 | then Segment := Leading + ' ' + Segment | 
|---|
|  | 917 | else Segment := FVarLeading + ' ' + Segment; | 
|---|
|  | 918 | end; {if Length(Leading)} | 
|---|
|  | 919 | if StartNewline then Segment := CRLF + Segment; | 
|---|
|  | 920 | if (Length(Trailing) > 0) then | 
|---|
|  | 921 | begin | 
|---|
|  | 922 | if (CharAt(Trailing, 1) <> '@') | 
|---|
|  | 923 | then Segment := Segment + ' ' + Trailing | 
|---|
|  | 924 | else Segment := Segment + ' ' + FVarTrailing; | 
|---|
|  | 925 | end; {if Length(Trailing)} | 
|---|
|  | 926 | end; {if Length(Segment)} | 
|---|
|  | 927 | if Length(Result) > 0 then Result := Result + ' '; | 
|---|
|  | 928 | Result := Result + Segment; | 
|---|
|  | 929 | end; {with APrompt} | 
|---|
|  | 930 | end; {with FPrompts} | 
|---|
|  | 931 | end; {GetOrderText} | 
|---|
|  | 932 |  | 
|---|
|  | 933 | procedure TResponses.Update(const APromptID: string; AnInstance: Integer; | 
|---|
|  | 934 | const AnIValue, AnEValue: string); | 
|---|
|  | 935 | { for a given Prompt,Instance update or create the associated response object } | 
|---|
|  | 936 | var | 
|---|
|  | 937 | AResponse: TResponse; | 
|---|
|  | 938 | begin | 
|---|
|  | 939 | AResponse := FindResponseByName(APromptID, AnInstance); | 
|---|
|  | 940 | if AResponse = nil then | 
|---|
|  | 941 | begin | 
|---|
|  | 942 | AResponse := TResponse.Create; | 
|---|
|  | 943 | AResponse.PromptID := APromptID; | 
|---|
|  | 944 | AResponse.PromptIEN := IENForPrompt(APromptID); | 
|---|
|  | 945 | AResponse.Instance := AnInstance; | 
|---|
|  | 946 | FResponseList.Add(AResponse); | 
|---|
|  | 947 | end; | 
|---|
|  | 948 | AResponse.IValue := AnIValue; | 
|---|
|  | 949 | AResponse.EValue := AnEValue; | 
|---|
|  | 950 | end; | 
|---|
|  | 951 |  | 
|---|
|  | 952 | function TResponses.OrderCRC: string; | 
|---|
|  | 953 | const | 
|---|
|  | 954 | CRC_WIDTH = 8; | 
|---|
|  | 955 | var | 
|---|
|  | 956 | i: Integer; | 
|---|
|  | 957 | x: string; | 
|---|
|  | 958 | tmplst: TStringList; | 
|---|
|  | 959 | begin | 
|---|
|  | 960 | tmplst := TStringList.Create; | 
|---|
|  | 961 | try | 
|---|
|  | 962 | with FResponseList do for i := 0 to Count - 1 do with TResponse(Items[i]) do | 
|---|
|  | 963 | begin | 
|---|
|  | 964 | if IValue = TX_WPTYPE then x := EValue else x := IValue; | 
|---|
|  | 965 | tmplst.Add(IntToStr(PromptIEN) + U + IntToStr(Instance) + U + x); | 
|---|
|  | 966 | end; | 
|---|
|  | 967 | Result := IntToHex(CRCForStrings(tmplst), CRC_WIDTH); | 
|---|
|  | 968 | finally | 
|---|
|  | 969 | tmplst.Free; | 
|---|
|  | 970 | end; | 
|---|
|  | 971 | end; | 
|---|
|  | 972 |  | 
|---|
|  | 973 | procedure TResponses.Remove(const APromptID: string; AnInstance: Integer); | 
|---|
|  | 974 | var | 
|---|
|  | 975 | AResponse: TResponse; | 
|---|
|  | 976 | begin | 
|---|
|  | 977 | AResponse := FindResponseByName(APromptID, AnInstance); | 
|---|
|  | 978 | if AResponse <> nil then | 
|---|
|  | 979 | begin | 
|---|
|  | 980 | FResponseList.Remove(AResponse); | 
|---|
|  | 981 | AResponse.Free; | 
|---|
|  | 982 | end; | 
|---|
|  | 983 | end; | 
|---|
|  | 984 |  | 
|---|
|  | 985 | procedure TResponses.SaveQuickOrder(var ANewIEN: Integer; const ADisplayName: string); | 
|---|
|  | 986 | begin | 
|---|
|  | 987 | if FDisplayGroup = ClinDisp then  //Clin. Meds share same quick order definition with Inpt. Meds | 
|---|
|  | 988 | PutQuickOrder(ANewIEN, OrderCRC, ADisplayName, InptDisp, FResponseList) | 
|---|
|  | 989 | else | 
|---|
|  | 990 | PutQuickOrder(ANewIEN, OrderCRC, ADisplayName, FDisplayGroup, FResponseList) | 
|---|
|  | 991 | end; | 
|---|
|  | 992 |  | 
|---|
|  | 993 | procedure TResponses.SaveOrder(var AnOrder: TOrder; DlgIEN: Integer; IsIMOOrder: boolean); | 
|---|
|  | 994 | var | 
|---|
|  | 995 | ConstructOrder: TConstructOrder; | 
|---|
|  | 996 | i,j: integer; | 
|---|
|  | 997 | QOUDGroup: boolean; | 
|---|
|  | 998 | NewPtEvtPtr: Integer;  // ptr to #100.2 | 
|---|
|  | 999 | APtEvtPtr: string; | 
|---|
|  | 1000 | begin | 
|---|
|  | 1001 | //IMOLoc := 0; | 
|---|
|  | 1002 | NewPtEvtPtr := 0; | 
|---|
|  | 1003 | QOUDGroup := False; | 
|---|
|  | 1004 | if FQuickOrder > 0 then | 
|---|
|  | 1005 | begin | 
|---|
|  | 1006 | DlgIEN := FQuickOrder; | 
|---|
|  | 1007 | QOUDGroup := CheckQOGroup( IntToStr(FQuickOrder) ); | 
|---|
|  | 1008 | end; | 
|---|
|  | 1009 | AnOrder.EditOf := FEditOrder;  // null if new order, otherwise ORIFN of original order | 
|---|
|  | 1010 | with ConstructOrder do | 
|---|
|  | 1011 | begin | 
|---|
|  | 1012 | if XfInToOutNow then | 
|---|
|  | 1013 | DialogName := FDialog + '^O' | 
|---|
|  | 1014 | else DialogName := FDialog; | 
|---|
|  | 1015 | LeadText     := FVarLeading; | 
|---|
|  | 1016 | TrailText    := FVarTrailing; | 
|---|
|  | 1017 | DGroup       := FDisplayGroup; | 
|---|
|  | 1018 | OrderItem    := DlgIEN; | 
|---|
|  | 1019 | DelayEvent   := FEventType; | 
|---|
|  | 1020 | Specialty    := FSpecialty; | 
|---|
|  | 1021 | Effective    := FEffective; | 
|---|
|  | 1022 | LogTime      := FLogTime; | 
|---|
|  | 1023 | OCList       := FOrderChecks; | 
|---|
|  | 1024 | DigSig       := DEASig; | 
|---|
|  | 1025 | IsIMODialog  := IsIMOOrder;       //IMO | 
|---|
|  | 1026 | if IsIMODialog then | 
|---|
|  | 1027 | DGroup := ClinDisp; | 
|---|
|  | 1028 | //AGP Change 26.35, 26.41 8518 added text order | 
|---|
|  | 1029 | //AGP Change 26.55 remove IMO functionality for inpatient | 
|---|
|  | 1030 | (*if (Patient.Inpatient = true) and (IsValidIMOLoc(encounter.Location,Patient.DFN)=true) and | 
|---|
|  | 1031 | ((ConstructOrder.DialogName = 'PSJ OR PAT OE') or (ConstructOrder.DialogName = 'PSJI OR PAT FLUID OE') or | 
|---|
|  | 1032 | (ConstructOrder.DialogName = 'OR GXTEXT WORD PROCESSING ORDE')) and | 
|---|
|  | 1033 | ((FEditOrder = '') and (Self.FEventName = '') and (Self.FCopyOrder = '')) then | 
|---|
|  | 1034 | begin | 
|---|
|  | 1035 | if frmClinicWardMeds.ClinicOrWardLocation(Encounter.location) = Encounter.Location then | 
|---|
|  | 1036 | begin | 
|---|
|  | 1037 | ConstructOrder.IsIMODialog := True; | 
|---|
|  | 1038 | ConstructOrder.DGroup := ClinDisp; | 
|---|
|  | 1039 | end | 
|---|
|  | 1040 | else IMOLoc := Patient.Location; | 
|---|
|  | 1041 | end; *) | 
|---|
|  | 1042 | //AGP Change 26.51, change logic to set text orders to IMO for outpatients at an outpatient location. | 
|---|
|  | 1043 | //AGP Text orders are only treated as IMO if the order display group is a nursing display group | 
|---|
|  | 1044 | if (Patient.Inpatient = False) and (IsValidIMOLoc(encounter.Location,Patient.DFN)=true) and | 
|---|
|  | 1045 | (((pos('OR GXTEXT WORD PROCESSING ORDE',ConstructOrder.DialogName)>0) and (ConstructOrder.DGroup = NurDisp)) or | 
|---|
|  | 1046 | ((ConstructOrder.DialogName = 'OR GXMISC GENERAL') and (ConstructOrder.DGroup = NurDisp)) or | 
|---|
|  | 1047 | ((ConstructOrder.DialogName = 'OR GXTEXT TEXT ONLY ORDER') and (ConstructOrder.DGroup = NurDisp))) and //AGP Change CQ #10757 | 
|---|
|  | 1048 | ((FEditOrder = '') and (Self.FEventName = '') and (Self.FCopyOrder = '')) then | 
|---|
|  | 1049 | begin | 
|---|
|  | 1050 | ConstructOrder.IsIMODialog := True; | 
|---|
|  | 1051 | ConstructOrder.DGroup := ClinDisp; | 
|---|
|  | 1052 | end; | 
|---|
|  | 1053 | IsEventDefaultOR := EventDefaultOD; | 
|---|
|  | 1054 | if IsUDGroup or QOUDGroup then | 
|---|
|  | 1055 | begin | 
|---|
|  | 1056 | for i := 0 to FResponseList.Count - 1 do | 
|---|
|  | 1057 | if UpperCase(TResponse(FResponseList.Items[i]).PromptID) = 'PICKUP' then | 
|---|
|  | 1058 | begin | 
|---|
|  | 1059 | FResponseList.Delete(i); | 
|---|
|  | 1060 | Break; | 
|---|
|  | 1061 | end; | 
|---|
|  | 1062 | end; | 
|---|
|  | 1063 |  | 
|---|
|  | 1064 | if SaveAsCurrent then | 
|---|
|  | 1065 | ConstructOrder.DelayEvent := #0; | 
|---|
|  | 1066 |  | 
|---|
|  | 1067 | ResponseList := FResponseList; | 
|---|
|  | 1068 | if (FEventIFN>0) and (EventExist(Patient.DFN, FEventIFN)>0) then | 
|---|
|  | 1069 | begin | 
|---|
|  | 1070 | APtEvtPtr   := IntToStr(EventExist(Patient.DFN, FEventIFN)); | 
|---|
|  | 1071 | PTEventPtr  := APtEvtPtr; | 
|---|
|  | 1072 | //PutNewOrder(AnOrder, ConstructOrder, OrderSource, IMOLoc); | 
|---|
|  | 1073 | PutNewOrder(AnOrder, ConstructOrder, OrderSource); | 
|---|
|  | 1074 | if not SaveAsCurrent then | 
|---|
|  | 1075 | begin | 
|---|
|  | 1076 | AnOrder.EventPtr  := PTEventPtr; | 
|---|
|  | 1077 | //      AnOrder.EventName := 'Delayed ' + MixedCase(Piece(EventInfo(APtEvtPtr),'^',4));  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1078 | AnOrder.EventName := DKLangConstW('fODBase_Delayed') + MixedCase(Piece(EventInfo(APtEvtPtr),'^',4)); //kt added 8/8/2007 | 
|---|
|  | 1079 | end; | 
|---|
|  | 1080 | end | 
|---|
|  | 1081 | else | 
|---|
|  | 1082 | begin | 
|---|
|  | 1083 | //PutNewOrder(AnOrder, ConstructOrder, OrderSource, IMOLoc); | 
|---|
|  | 1084 | PutNewOrder(AnOrder, ConstructOrder, OrderSource); | 
|---|
|  | 1085 | if not SaveAsCurrent then | 
|---|
|  | 1086 | begin | 
|---|
|  | 1087 | if (FEventIFN > 0) and (FParentEvent.ParentIFN > 0) then | 
|---|
|  | 1088 | begin | 
|---|
|  | 1089 | {For a child event, create a parent event in 100.2 first} | 
|---|
|  | 1090 | SaveEvtForOrder(Patient.DFN, FParentEvent.ParentIFN, AnOrder.ID); | 
|---|
|  | 1091 | NewPtEvtPtr := EventExist(Patient.DFN, FParentEvent.ParentIFN); | 
|---|
|  | 1092 | AnOrder.EventPtr := IntToStr(NewPtEvtPtr); | 
|---|
|  | 1093 | //        AnOrder.EventName := 'Delayed ' + MixedCase(Piece(EventInfo(IntToStr(NewPtEvtPtr)),'^',4));  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1094 | AnOrder.EventName := DKLangConstW('fODBase_Delayed') + MixedCase(Piece(EventInfo(IntToStr(NewPtEvtPtr)),'^',4)); //kt added 8/8/2007 | 
|---|
|  | 1095 | {Then create the child event in 100.2} | 
|---|
|  | 1096 | SaveEvtForOrder(Patient.DFN, FEventIFN, ''); | 
|---|
|  | 1097 | NewPtEvtPtr := EventExist(Patient.DFN, FEventIFN); | 
|---|
|  | 1098 | end | 
|---|
|  | 1099 | else if (FEventIFN > 0) and (FParentEvent.ParentIFN = 0) then | 
|---|
|  | 1100 | begin | 
|---|
|  | 1101 | SaveEvtForOrder(Patient.DFN, FEventIFN, AnOrder.ID); | 
|---|
|  | 1102 | NewPtEvtPtr := EventExist(Patient.DFN, FEventIFN); | 
|---|
|  | 1103 | AnOrder.EventPtr := IntToStr(NewPtEvtPtr); | 
|---|
|  | 1104 | //        AnOrder.EventName := 'Delayed ' + MixedCase(Piece(EventInfo(IntToStr(NewPtEvtPtr)),'^',4));  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1105 | AnOrder.EventName := DKLangConstW('fODBase_Delayed') + MixedCase(Piece(EventInfo(IntToStr(NewPtEvtPtr)),'^',4)); //kt added 8/8/2007 | 
|---|
|  | 1106 | end; | 
|---|
|  | 1107 | if FEventIFN > 0 then | 
|---|
|  | 1108 | begin | 
|---|
|  | 1109 | for j := 1 to frmOrders.lstSheets.Items.Count - 1 do | 
|---|
|  | 1110 | begin | 
|---|
|  | 1111 | if FEventIFN = StrToInt( Piece(Piece(frmOrders.lstSheets.Items[j],'^',1),';',1) ) then | 
|---|
|  | 1112 | begin | 
|---|
|  | 1113 | frmOrders.lstSheets.Items[j] := IntToStr( NewPtEvtPtr) + '^' + Piece(frmOrders.lstSheets.Items[j],'^',2); | 
|---|
|  | 1114 | frmOrders.lstSheets.ItemIndex := j; | 
|---|
|  | 1115 | end; | 
|---|
|  | 1116 | end; | 
|---|
|  | 1117 | end; | 
|---|
|  | 1118 | end; | 
|---|
|  | 1119 | end; | 
|---|
|  | 1120 | DEASig := ''; //PKI | 
|---|
|  | 1121 | end; | 
|---|
|  | 1122 | AnOrder.EditOf := FEditOrder; | 
|---|
|  | 1123 | {Begin BillingAware} | 
|---|
|  | 1124 | if  rpcGetBAMasterSwStatus then | 
|---|
|  | 1125 | begin | 
|---|
|  | 1126 | UBAGlobals.BAOrderID := ''; | 
|---|
|  | 1127 | UBAGlobals.BAOrderID := AnOrder.ID; | 
|---|
|  | 1128 | end; | 
|---|
|  | 1129 | {Begin BillingAware} | 
|---|
|  | 1130 | end; | 
|---|
|  | 1131 |  | 
|---|
|  | 1132 | procedure TResponses.SetControl(AControl: TControl; const APromptID: string; AnInstance: Integer); | 
|---|
|  | 1133 | { sets the value of a control, uses ID string & instance to find the right response entry } | 
|---|
|  | 1134 | var | 
|---|
|  | 1135 | i: Integer; | 
|---|
|  | 1136 | AResponse: TResponse; | 
|---|
|  | 1137 | IEN: integer; | 
|---|
|  | 1138 | HasObjects: boolean; | 
|---|
|  | 1139 |  | 
|---|
|  | 1140 | procedure AssignBPText(List: TStrings; const Value: string); | 
|---|
|  | 1141 | var | 
|---|
|  | 1142 | tmp, cptn, DocInfo: string; | 
|---|
|  | 1143 | LType: TTemplateLinkType; | 
|---|
|  | 1144 |  | 
|---|
|  | 1145 | begin | 
|---|
|  | 1146 | DocInfo := ''; | 
|---|
|  | 1147 | LType := DisplayGroupToLinkType(DisplayGroup); | 
|---|
|  | 1148 | //  cptn := 'Reason for Request: ' + EValueFor('ORDERABLE', 1);  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1149 | cptn := DKLangConstW('fODBase_Reason_for_Requestx')+' ' + EValueFor(DKLangConstW('fODBase_ORDERABLE'), 1); //kt added 8/8/2007 | 
|---|
|  | 1150 | tmp := Value; | 
|---|
|  | 1151 | case LType of | 
|---|
|  | 1152 | ltConsult:   IEN := StrToIntDef(GetServiceIEN(IValueFor('ORDERABLE', 1)),0); | 
|---|
|  | 1153 | ltProcedure: IEN := StrToIntDef(GetProcedureIEN(IValueFor('ORDERABLE', 1)),0); | 
|---|
|  | 1154 | else         IEN := 0; | 
|---|
|  | 1155 | end; | 
|---|
|  | 1156 | ExpandOrderObjects(tmp, HasObjects); | 
|---|
|  | 1157 | FOrderContainsObjects := FOrderContainsObjects or HasObjects; | 
|---|
|  | 1158 | if IEN <> 0 then | 
|---|
|  | 1159 | begin | 
|---|
|  | 1160 | // template will execute on copy order if commented out  (tried to eliminate for CSV v22, RV) | 
|---|
|  | 1161 | // | 
|---|
|  | 1162 | //if (Length(tmp) > 0) and (not HasTemplateField(tmp)) then | 
|---|
|  | 1163 | //  CheckBoilerplate4Fields(tmp, cptn) | 
|---|
|  | 1164 | //else | 
|---|
|  | 1165 | ExecuteTemplateOrBoilerPlate(tmp, IEN, LType, nil, cptn, DocInfo); | 
|---|
|  | 1166 | end | 
|---|
|  | 1167 | else | 
|---|
|  | 1168 | CheckBoilerplate4Fields(tmp, cptn); | 
|---|
|  | 1169 | List.Text := tmp; | 
|---|
|  | 1170 | end; | 
|---|
|  | 1171 |  | 
|---|
|  | 1172 | begin | 
|---|
|  | 1173 | AResponse := FindResponseByName(APromptID, AnInstance); | 
|---|
|  | 1174 | if AResponse = nil then Exit; | 
|---|
|  | 1175 | if AControl is TLabel then with TLabel(AControl) do Caption := AResponse.EValue | 
|---|
|  | 1176 | else if AControl is TStaticText then with TStaticText(AControl) do Caption := AResponse.EValue | 
|---|
|  | 1177 | else if AControl is TButton then with TButton(AControl) do Caption := AResponse.EValue | 
|---|
|  | 1178 | else if AControl is TEdit then with TEdit(AControl) do Text := AResponse.EValue | 
|---|
|  | 1179 | else if AControl is TMaskEdit then with TMaskEdit(AControl) do Text := AResponse.EValue | 
|---|
|  | 1180 | else if AControl is TCheckBox then with TCheckBox(AControl) do | 
|---|
|  | 1181 | Checked := (StrToIntDef(AResponse.IValue,0) > 0) or | 
|---|
|  | 1182 | (UpperCase(AResponse.IValue) = 'Y') | 
|---|
|  | 1183 | else if AControl is TMemo then with TMemo(AControl) do AssignBPText(Lines, AResponse.EValue) | 
|---|
|  | 1184 | else if AControl is TRichEdit then with TRichEdit(AControl) do AssignBPText(Lines, AResponse.EValue) | 
|---|
|  | 1185 | else if AControl is TORListBox then with TORListBox(AControl) do | 
|---|
|  | 1186 | begin | 
|---|
|  | 1187 | for i := 0 to Items.Count - 1 do | 
|---|
|  | 1188 | if Piece(Items[i], U, 1) = AResponse.IValue then ItemIndex := i; | 
|---|
|  | 1189 | end | 
|---|
|  | 1190 | else if AControl is TListBox then with TListBox(AControl) do | 
|---|
|  | 1191 | begin | 
|---|
|  | 1192 | for i := 0 to Items.Count - 1 do | 
|---|
|  | 1193 | if Items[i] = AResponse.EValue then ItemIndex := i; | 
|---|
|  | 1194 | end | 
|---|
|  | 1195 | else if AControl is TComboBox then with TComboBox(AControl) do | 
|---|
|  | 1196 | begin | 
|---|
|  | 1197 | for i := 0 to Items.Count - 1 do | 
|---|
|  | 1198 | if Items[i] = AResponse.EValue then ItemIndex := i; | 
|---|
|  | 1199 | Text := AResponse.EValue; | 
|---|
|  | 1200 | end | 
|---|
|  | 1201 | else if AControl is TORComboBox then with TORComboBox(AControl) do | 
|---|
|  | 1202 | begin | 
|---|
|  | 1203 | if LongList then InitLongList(AResponse.EValue); | 
|---|
|  | 1204 | SelectByID(AResponse.IValue); | 
|---|
|  | 1205 | if (not LongList) and (ItemIndex < 0) then Text := AResponse.EValue; | 
|---|
|  | 1206 | end; | 
|---|
|  | 1207 | end; | 
|---|
|  | 1208 |  | 
|---|
|  | 1209 | procedure TResponses.SetEventDelay(AnEvent: TOrderDelayEvent); | 
|---|
|  | 1210 | begin | 
|---|
|  | 1211 | with AnEvent do if EventType in ['A','D','T','M','O'] then | 
|---|
|  | 1212 | begin | 
|---|
|  | 1213 | FEventIFN  := EventIFN; | 
|---|
|  | 1214 | FEventName := EventName; | 
|---|
|  | 1215 | FEventType := EventType; | 
|---|
|  | 1216 | FSpecialty := Specialty; | 
|---|
|  | 1217 | FEffective := Effective; | 
|---|
|  | 1218 | //  FViewName := 'Delayed ' + MixedCase(EventName);  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1219 | FViewName := DKLangConstW('fODBase_Delayed') + MixedCase(EventName); //kt added 8/8/2007 | 
|---|
|  | 1220 | FParentEvent := TParentEvent(AnEvent.TheParent); | 
|---|
|  | 1221 | end; | 
|---|
|  | 1222 | end; | 
|---|
|  | 1223 |  | 
|---|
|  | 1224 | procedure TResponses.SetPromptFormat(const APromptID, NewFormat: string); | 
|---|
|  | 1225 | var | 
|---|
|  | 1226 | i: Integer; | 
|---|
|  | 1227 | begin | 
|---|
|  | 1228 | with FPrompts do for i := 0 to Count - 1 do with TPrompt(Items[i]) do | 
|---|
|  | 1229 | if (ID = APromptID) then FmtCode := NewFormat; | 
|---|
|  | 1230 | end; | 
|---|
|  | 1231 |  | 
|---|
|  | 1232 | { Private calls } | 
|---|
|  | 1233 |  | 
|---|
|  | 1234 | procedure TfrmODBase.ClearDialogControls; | 
|---|
|  | 1235 | var | 
|---|
|  | 1236 | i: Integer; | 
|---|
|  | 1237 | begin | 
|---|
|  | 1238 | FChanging := True; | 
|---|
|  | 1239 | for i := 0 to ControlCount - 1 do | 
|---|
|  | 1240 | begin | 
|---|
|  | 1241 | // need to check if control is container & clear it's children also | 
|---|
|  | 1242 | if (Controls[i] is TLabel) or (Controls[i] is TButton) or (Controls[i] is TStaticText) then Continue; | 
|---|
|  | 1243 | if FPreserve.IndexOf(Controls[i]) < 0 then ClearControl(Controls[i]); | 
|---|
|  | 1244 | end; | 
|---|
|  | 1245 | FChanging := False; | 
|---|
|  | 1246 | ShowOrderMessage( False ); | 
|---|
|  | 1247 | end; | 
|---|
|  | 1248 |  | 
|---|
|  | 1249 | procedure TfrmODBase.SetDisplayGroup(Value: Integer); | 
|---|
|  | 1250 | begin | 
|---|
|  | 1251 | FDisplayGroup := Value; | 
|---|
|  | 1252 | Responses.FDisplayGroup := Value; | 
|---|
|  | 1253 | end; | 
|---|
|  | 1254 |  | 
|---|
|  | 1255 | procedure TfrmODBase.SetFillerID(const Value: string); | 
|---|
|  | 1256 | var | 
|---|
|  | 1257 | x: string; | 
|---|
|  | 1258 | begin | 
|---|
|  | 1259 | SetupVars;  //kt added 8/8/2007 to replace constants with vars. | 
|---|
|  | 1260 | FFillerID := Value; | 
|---|
|  | 1261 | if AddFillerAppID(FFillerID) and OrderChecksEnabled then | 
|---|
|  | 1262 | begin | 
|---|
|  | 1263 | //  StatusText('Order Checking...');  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1264 | StatusText(DKLangConstW('fODBase_Order_Checkingxxx')); //kt added 8/8/2007 | 
|---|
|  | 1265 | if Patient.DFN = '' then exit;  //kt added 6/18/08 | 
|---|
|  | 1266 | //kt note: A better solution to the line above would be to trigger a selection | 
|---|
|  | 1267 | //kt       of a valid patient at this point, if I could figure out how to do that... | 
|---|
|  | 1268 | x := OrderChecksOnDisplay(FillerID);  //kt <-- Expects Patient.DFN to hold valid number... | 
|---|
|  | 1269 | StatusText(''); | 
|---|
|  | 1270 | if Length(x) > 0 then InfoBox(x, TC_ORDERCHECKS, MB_OK); | 
|---|
|  | 1271 | end; | 
|---|
|  | 1272 | end; | 
|---|
|  | 1273 |  | 
|---|
|  | 1274 | { Protected Calls (used by descendant forms) } | 
|---|
|  | 1275 |  | 
|---|
|  | 1276 | procedure TfrmODBase.InitDialog; | 
|---|
|  | 1277 | begin | 
|---|
|  | 1278 | ClearDialogControls; | 
|---|
|  | 1279 | Responses.Clear; | 
|---|
|  | 1280 | FAcceptOK := False; | 
|---|
|  | 1281 | FAbortOrder := False; | 
|---|
|  | 1282 | end; | 
|---|
|  | 1283 |  | 
|---|
|  | 1284 | function TfrmODBase.OrderForInpatient: Boolean; | 
|---|
|  | 1285 | var | 
|---|
|  | 1286 | AnEventType: Char; | 
|---|
|  | 1287 | begin | 
|---|
|  | 1288 | AnEventType := OrderEventTypeOnCreate; | 
|---|
|  | 1289 | // if event type = #0, then it wasn't passed or we're not in create | 
|---|
|  | 1290 | if AnEventType = #0 then AnEventType := Responses.FEventType; | 
|---|
|  | 1291 | case AnEventType of | 
|---|
|  | 1292 | 'A','O': Result := True; | 
|---|
|  | 1293 | 'D': Result := False; | 
|---|
|  | 1294 | 'T': | 
|---|
|  | 1295 | begin | 
|---|
|  | 1296 | if IsPassEvt1(FEvtID,'T') then  Result := False | 
|---|
|  | 1297 | else Result := True; | 
|---|
|  | 1298 | end | 
|---|
|  | 1299 | else Result := Patient.Inpatient; | 
|---|
|  | 1300 | end; | 
|---|
|  | 1301 | end; | 
|---|
|  | 1302 |  | 
|---|
|  | 1303 | procedure TfrmODBase.ShowOrderMessage(Show: boolean); | 
|---|
|  | 1304 | begin | 
|---|
|  | 1305 | if Show then | 
|---|
|  | 1306 | begin | 
|---|
|  | 1307 | pnlMessage.Visible := True; | 
|---|
|  | 1308 | pnlMessage.BringToFront; | 
|---|
|  | 1309 | memMessage.TabStop := True; | 
|---|
|  | 1310 | end | 
|---|
|  | 1311 | else | 
|---|
|  | 1312 | begin | 
|---|
|  | 1313 | pnlMessage.Visible := False; | 
|---|
|  | 1314 | pnlMessage.SendToBack; | 
|---|
|  | 1315 | memMessage.TabStop := False; | 
|---|
|  | 1316 | end; | 
|---|
|  | 1317 | end; | 
|---|
|  | 1318 |  | 
|---|
|  | 1319 | procedure TfrmODBase.OrderMessage(const AMessage: string); | 
|---|
|  | 1320 | {Caller needs to set pnlMessage.TabOrder} | 
|---|
|  | 1321 | begin | 
|---|
|  | 1322 | memMessage.Lines.SetText(PChar(AMessage)); | 
|---|
|  | 1323 | //begin CQ: 2640 | 
|---|
|  | 1324 | memMessage.SelStart := 0; // Put at first character | 
|---|
|  | 1325 | SendMessage(memMessage.Handle, WM_VSCROLL, SB_TOP, 0); | 
|---|
|  | 1326 | //End CQ: 2640 | 
|---|
|  | 1327 | ShowOrderMessage(ContainsVisibleChar(AMessage)); | 
|---|
|  | 1328 | end; | 
|---|
|  | 1329 |  | 
|---|
|  | 1330 | procedure TfrmODBase.PreserveControl(AControl: TControl); | 
|---|
|  | 1331 | begin | 
|---|
|  | 1332 | FPreserve.Add(AControl); | 
|---|
|  | 1333 | end; | 
|---|
|  | 1334 |  | 
|---|
|  | 1335 | procedure TfrmODBase.SetDialogIEN(Value: Integer); | 
|---|
|  | 1336 | begin | 
|---|
|  | 1337 | FDialogIEN := Value; | 
|---|
|  | 1338 | end; | 
|---|
|  | 1339 |  | 
|---|
|  | 1340 | procedure TfrmODBase.SetupDialog(OrderAction: Integer; const ID: string); | 
|---|
|  | 1341 | begin | 
|---|
|  | 1342 | FOrderAction := OrderAction; | 
|---|
|  | 1343 | FAbortOrder := False; | 
|---|
|  | 1344 | case OrderAction of | 
|---|
|  | 1345 | ORDER_NEW:   {nothing}; | 
|---|
|  | 1346 | ORDER_EDIT:  Responses.SetEditOrder(ID); | 
|---|
|  | 1347 | ORDER_COPY:  Responses.SetCopyOrder(ID); | 
|---|
|  | 1348 | ORDER_QUICK: Responses.SetQuickOrderByID(ID); | 
|---|
|  | 1349 | end; | 
|---|
|  | 1350 | //if Responses.FEventType in ['A','D','T','M','O'] then Caption := Caption + ' (Delayed ' + Responses.FEventName + ')'; // ' (Event Delayed)';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1351 | if Responses.FEventType in ['A','D','T','M','O'] then Caption := Caption + DKLangConstW('fODBase_xDelayed')+' ' + Responses.FEventName + ')'; // DKLangConstW('fODBase_xEvent_Delayedx'); //kt added 8/8/2007 | 
|---|
|  | 1352 | //if OrderAction in [ORDER_EDIT, ORDER_COPY] then cmdQuit.Caption := 'Cancel';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1353 | if OrderAction in [ORDER_EDIT, ORDER_COPY] then cmdQuit.Caption := DKLangConstW('fODBase_Cancel'); //kt added 8/8/2007 | 
|---|
|  | 1354 | end; | 
|---|
|  | 1355 |  | 
|---|
|  | 1356 | function TfrmODBase.GetEffectiveDate: TFMDateTime; | 
|---|
|  | 1357 | begin | 
|---|
|  | 1358 | Result := Responses.FEffective; | 
|---|
|  | 1359 | end; | 
|---|
|  | 1360 |  | 
|---|
|  | 1361 | function TfrmODBase.GetKeyVariable(const Index: string): string; | 
|---|
|  | 1362 | begin | 
|---|
|  | 1363 | if      UpperCase(Index) = 'LRFZX'    then Result := Piece(FKeyVariables, U, 1) | 
|---|
|  | 1364 | else if UpperCase(Index) = 'LRFSAMP'  then Result := Piece(FKeyVariables, U, 2) | 
|---|
|  | 1365 | else if UpperCase(Index) = 'LRFSPEC'  then Result := Piece(FKeyVariables, U, 3) | 
|---|
|  | 1366 | else if UpperCase(Index) = 'LRFDATE'  then Result := Piece(FKeyVariables, U, 4) | 
|---|
|  | 1367 | else if UpperCase(Index) = 'LRFURG'   then Result := Piece(FKeyVariables, U, 5) | 
|---|
|  | 1368 | else if UpperCase(Index) = 'LRFSCH'   then Result := Piece(FKeyVariables, U, 6) | 
|---|
|  | 1369 | else if UpperCase(Index) = 'PSJNOPC'  then Result := Piece(FKeyVariables, U, 7) | 
|---|
|  | 1370 | else if UpperCase(Index) = 'GMRCNOPD' then Result := Piece(FKeyVariables, U, 8) | 
|---|
|  | 1371 | else if UpperCase(Index) = 'GMRCNOAT' then Result := Piece(FKeyVariables, U, 9) | 
|---|
|  | 1372 | else if UpperCase(Index) = 'GMRCREAF' then Result := Piece(FKeyVariables, U, 10) | 
|---|
|  | 1373 | else                                       Result := ''; | 
|---|
|  | 1374 | end; | 
|---|
|  | 1375 |  | 
|---|
|  | 1376 | procedure TfrmODBase.SetKeyVariables(const VarStr: string); | 
|---|
|  | 1377 | begin | 
|---|
|  | 1378 | FKeyVariables := VarStr; | 
|---|
|  | 1379 | end; | 
|---|
|  | 1380 |  | 
|---|
|  | 1381 | procedure TfrmODBase.Validate(var AnErrMsg: string); | 
|---|
|  | 1382 | //const | 
|---|
|  | 1383 | //TX_OR_DISABLED = 'Ordering has been disabled.  Press Quit.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1384 | //TX_PAST_START  = 'The start date may not be earlier than the present.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1385 | //TX_NO_LOCATION = 'A location must be identified.' + CRLF +  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1386 | //                 '(Select File | Update Provider/Location)';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1387 | //TX_NO_PROVIDER = 'A provider who is authorized to write orders must be indentified.' + CRLF +  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1388 | //                 '(Select File | Update Provider/Location)';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1389 | var | 
|---|
|  | 1390 | StartStr,x: string; | 
|---|
|  | 1391 | StartDt: TFMDateTime; | 
|---|
|  | 1392 | TX_OR_DISABLED : string; //kt | 
|---|
|  | 1393 | TX_PAST_START  : string; //kt | 
|---|
|  | 1394 | TX_NO_LOCATION : string; //kt | 
|---|
|  | 1395 | TX_NO_PROVIDER : string; //kt | 
|---|
|  | 1396 |  | 
|---|
|  | 1397 | begin | 
|---|
|  | 1398 | TX_OR_DISABLED := DKLangConstW('fODBase_Ordering_has_been_disabledx__Press_Quitx'); //kt added 8/8/2007 | 
|---|
|  | 1399 | TX_PAST_START  := DKLangConstW('fODBase_The_start_date_may_not_be_earlier_than_the_presentx'); //kt added 8/8/2007 | 
|---|
|  | 1400 | TX_NO_LOCATION := DKLangConstW('fODBase_A_location_must_be_identifiedx') + CRLF + //kt added 8/8/2007 | 
|---|
|  | 1401 | DKLangConstW('fODBase_xSelect_File_x_Update_ProviderxLocationx'); //kt added 8/8/2007 | 
|---|
|  | 1402 | TX_NO_PROVIDER := DKLangConstW('fODBase_A_provider_who_is_authorized_to_write_orders_must_be_indentifiedx') + CRLF + //kt added 8/8/2007 | 
|---|
|  | 1403 | DKLangConstW('fODBase_xSelect_File_x_Update_ProviderxLocationx'); //kt added 8/8/2007 | 
|---|
|  | 1404 |  | 
|---|
|  | 1405 | AnErrMsg := ''; | 
|---|
|  | 1406 | //if User.NoOrdering then AnErrMsg := 'Ordering has been disabled.  Press Quit.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1407 | if User.NoOrdering then AnErrMsg := DKLangConstW('fODBase_Ordering_has_been_disabledx__Press_Quitx'); //kt added 8/8/2007 | 
|---|
|  | 1408 | // take this out if we <don't> need to check for earlier start date/times | 
|---|
|  | 1409 | // should this check be against FMNow?? | 
|---|
|  | 1410 | StartStr := Piece(Responses.IValueFor('START', 1), '.', 1); | 
|---|
|  | 1411 | if not IsFMDateTime(StartStr) | 
|---|
|  | 1412 | then StartDt := StrToFMDateTime(StartStr) | 
|---|
|  | 1413 | else StartDt := StrToFloat(StartStr); | 
|---|
|  | 1414 | if (StartDt > 0) and (StartDt < FMToday) | 
|---|
|  | 1415 | //  then AnErrMsg := 'The start date may not be earlier than the present.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1416 | then AnErrMsg := DKLangConstW('fODBase_The_start_date_may_not_be_earlier_than_the_presentx'); //kt added 8/8/2007 | 
|---|
|  | 1417 | //frmFrame.UpdatePtInfoOnRefresh; | 
|---|
|  | 1418 | if (not Patient.Inpatient) and (Responses.EventIFN > 0) then x := '' | 
|---|
|  | 1419 | else | 
|---|
|  | 1420 | begin | 
|---|
|  | 1421 | if Encounter.Location = 0 then AnErrMsg := TX_NO_LOCATION; | 
|---|
|  | 1422 | end; | 
|---|
|  | 1423 | if (Encounter.Provider = 0) or (PersonHasKey(Encounter.Provider, 'PROVIDER') = False) | 
|---|
|  | 1424 | then AnErrMsg := TX_NO_PROVIDER; | 
|---|
|  | 1425 | if IsPFSSActive and Responses.PromptExists('VISITSTR') then | 
|---|
|  | 1426 | Responses.Update('VISITSTR', 1, Encounter.VisitStr, Encounter.VisitStr); | 
|---|
|  | 1427 | end; | 
|---|
|  | 1428 |  | 
|---|
|  | 1429 | { Form Calls } | 
|---|
|  | 1430 |  | 
|---|
|  | 1431 | procedure TfrmODBase.FormCreate(Sender: TObject); | 
|---|
|  | 1432 | begin | 
|---|
|  | 1433 | inherited; | 
|---|
|  | 1434 | memOrder.Color := ReadOnlyColor; | 
|---|
|  | 1435 | FAcceptOK   := False; | 
|---|
|  | 1436 | FAutoAccept := False; | 
|---|
|  | 1437 | FChanging   := False; | 
|---|
|  | 1438 | FClosing    := False; | 
|---|
|  | 1439 | FFromQuit   := False; | 
|---|
|  | 1440 | FTestMode   := False; | 
|---|
|  | 1441 | FIncludeOIPI := True; | 
|---|
|  | 1442 | FEvtForPassDischarge := #0; | 
|---|
|  | 1443 | FCtrlInits  := TCtrlInits.Create; | 
|---|
|  | 1444 | FResponses  := TResponses.Create; | 
|---|
|  | 1445 | FPreserve   := TList.Create; | 
|---|
|  | 1446 | FIsIMO      := False;          //imo | 
|---|
|  | 1447 | FIsSupply := False; | 
|---|
|  | 1448 | {This next bit is mostly for the font size.  It also sets the default size of | 
|---|
|  | 1449 | order forms if it is not in the database.  This is handy if a new user wants | 
|---|
|  | 1450 | to have large fonts.  However, in the general case, this will be resized | 
|---|
|  | 1451 | through rMisc.SetFormPosition.} | 
|---|
|  | 1452 | if not AutoSizeDisabled then | 
|---|
|  | 1453 | ResizeFormToFont(self); | 
|---|
|  | 1454 | DoSetFontSize(MainFontSize); | 
|---|
|  | 1455 |  | 
|---|
|  | 1456 | imgMessage.Picture.Icon.Handle := LoadIcon(0, IDI_ASTERISK); | 
|---|
|  | 1457 | //if User.NoOrdering then cmdAccept.Enabled := False; | 
|---|
|  | 1458 | if uCore.User.NoOrdering then cmdAccept.Enabled := False; | 
|---|
|  | 1459 | FDlgFormID := OrderFormIDOnCreate; | 
|---|
|  | 1460 | FEvtID     := OrderEventIDOnCreate; | 
|---|
|  | 1461 | FEvtType   := OrderEventTypeOnCreate; | 
|---|
|  | 1462 | FEvtName   := OrderEventNameOnCreate; | 
|---|
|  | 1463 | end; | 
|---|
|  | 1464 |  | 
|---|
|  | 1465 | procedure TfrmODBase.FormDestroy(Sender: TObject); | 
|---|
|  | 1466 | begin | 
|---|
|  | 1467 | FCtrlInits.Free; | 
|---|
|  | 1468 | FResponses.Free; | 
|---|
|  | 1469 | FPreserve.Free; | 
|---|
|  | 1470 | //DestroyingOrderDialog; | 
|---|
|  | 1471 | if Assigned(FCallOnExit) then FCallOnExit; | 
|---|
|  | 1472 | if (Owner <> nil) and (Owner is TWinControl) | 
|---|
|  | 1473 | then SendMessage(TWinControl(Owner).Handle, UM_DESTROY, FRefNum, 0); | 
|---|
|  | 1474 | inherited; | 
|---|
|  | 1475 | end; | 
|---|
|  | 1476 |  | 
|---|
|  | 1477 | procedure TfrmODBase.FormKeyPress(Sender: TObject; var Key: Char); | 
|---|
|  | 1478 | { causes RETURN to be treated as pressing a tab key (need to have user preference) } | 
|---|
|  | 1479 | begin | 
|---|
|  | 1480 | inherited; | 
|---|
|  | 1481 | if (Key = #13) and not (ActiveControl is TCustomMemo) then | 
|---|
|  | 1482 | begin | 
|---|
|  | 1483 | Key := #0; | 
|---|
|  | 1484 | Perform(WM_NEXTDLGCTL, 0, 0); | 
|---|
|  | 1485 | end; | 
|---|
|  | 1486 | end; | 
|---|
|  | 1487 |  | 
|---|
|  | 1488 | { Accept & Quit Buttons } | 
|---|
|  | 1489 |  | 
|---|
|  | 1490 | function TfrmODBase.AcceptOrderChecks: Boolean; | 
|---|
|  | 1491 | { returns True if order was accepted with order checks, false if order should be cancelled } | 
|---|
|  | 1492 | var | 
|---|
|  | 1493 | StartDtTm: string; | 
|---|
|  | 1494 | OIList: TStringList; | 
|---|
|  | 1495 | begin | 
|---|
|  | 1496 | Result := True; | 
|---|
|  | 1497 | Responses.OrderChecks.Clear; | 
|---|
|  | 1498 | if not OrderChecksEnabled then Exit; | 
|---|
|  | 1499 | OIList := TStringList.Create; | 
|---|
|  | 1500 | try | 
|---|
|  | 1501 | //  StatusText('Order Checking...');  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1502 | StatusText(DKLangConstW('fODBase_Order_Checkingxxx')); //kt added 8/8/2007 | 
|---|
|  | 1503 | Responses.BuildOCItems(OIList, StartDtTm, FillerID); | 
|---|
|  | 1504 | OrderChecksOnAccept(Responses.OrderChecks, FillerID, StartDtTm, OIList, DupORIFN); | 
|---|
|  | 1505 | DupORIFN := ''; | 
|---|
|  | 1506 | StatusText(''); | 
|---|
|  | 1507 | Result :=  AcceptOrderWithChecks(Responses.OrderChecks); | 
|---|
|  | 1508 | finally | 
|---|
|  | 1509 | OIList.Free; | 
|---|
|  | 1510 | end; | 
|---|
|  | 1511 | end; | 
|---|
|  | 1512 |  | 
|---|
|  | 1513 | function TfrmODBase.ValidSave: Boolean; | 
|---|
|  | 1514 | //const | 
|---|
|  | 1515 | //TX_NO_SAVE     = 'This order cannot be saved for the following reason(s):' + CRLF + CRLF;  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1516 | //TX_NO_SAVE_CAP = 'Unable to Save Order';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1517 | //TX_SAVE_ERR    = 'Unexpected error - it was not possible to save this order.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1518 | var | 
|---|
|  | 1519 | ErrMsg: string; | 
|---|
|  | 1520 | NewOrder: TOrder; | 
|---|
|  | 1521 | CanSign, OrderAction: Integer; | 
|---|
|  | 1522 | //thisSourceOrder: TOrder; | 
|---|
|  | 1523 | TX_NO_SAVE     : string; //kt | 
|---|
|  | 1524 | TX_NO_SAVE_CAP : string; //kt | 
|---|
|  | 1525 | TX_SAVE_ERR    : string; //kt | 
|---|
|  | 1526 | begin | 
|---|
|  | 1527 | TX_NO_SAVE     := DKLangConstW('fODBase_This_order_cannot_be_saved_for_the_following_reasonxsxx') + CRLF + CRLF; //kt added 8/8/2007 | 
|---|
|  | 1528 | TX_NO_SAVE_CAP := DKLangConstW('fODBase_Unable_to_Save_Order'); //kt added 8/8/2007 | 
|---|
|  | 1529 | TX_SAVE_ERR    := DKLangConstW('fODBase_Unexpected_error_x_it_was_not_possible_to_save_this_orderx'); //kt added 8/8/2007 | 
|---|
|  | 1530 | Result := True; | 
|---|
|  | 1531 | Validate(ErrMsg); | 
|---|
|  | 1532 | if Length(ErrMsg) > 0 then | 
|---|
|  | 1533 | begin | 
|---|
|  | 1534 | InfoBox(TX_NO_SAVE + ErrMsg, TX_NO_SAVE_CAP, MB_OK); | 
|---|
|  | 1535 | Result := False; | 
|---|
|  | 1536 | Exit; | 
|---|
|  | 1537 | end; | 
|---|
|  | 1538 | if not AcceptOrderChecks then | 
|---|
|  | 1539 | begin | 
|---|
|  | 1540 | if AskAnotherOrder(DialogIEN) then | 
|---|
|  | 1541 | InitDialog           // ClearDialogControls is in InitDialog | 
|---|
|  | 1542 | else | 
|---|
|  | 1543 | begin | 
|---|
|  | 1544 | ClearDialogControls;    // to allow form to close without prompting to save order | 
|---|
|  | 1545 | Close; | 
|---|
|  | 1546 | end; | 
|---|
|  | 1547 | Result := False; | 
|---|
|  | 1548 | Exit; | 
|---|
|  | 1549 | end; | 
|---|
|  | 1550 | if FTestMode then | 
|---|
|  | 1551 | begin | 
|---|
|  | 1552 | Result := False; | 
|---|
|  | 1553 | Exit; | 
|---|
|  | 1554 | end; | 
|---|
|  | 1555 | // LES validation checking for changed lab order | 
|---|
|  | 1556 | if not LESValidationCheck then Exit; | 
|---|
|  | 1557 | NewOrder := TOrder.Create; | 
|---|
|  | 1558 |  | 
|---|
|  | 1559 | Responses.SaveOrder(NewOrder, DialogIEN, FIsIMO); | 
|---|
|  | 1560 |  | 
|---|
|  | 1561 | if frmOrders.IsDefaultDlg then | 
|---|
|  | 1562 | begin | 
|---|
|  | 1563 | frmOrders.EventDefaultOrder := NewOrder.ID; | 
|---|
|  | 1564 | frmOrders.EvtOrderList.Add(NewOrder.EventPtr + '^' + NewOrder.ID); | 
|---|
|  | 1565 | frmOrders.IsDefaultDlg := False; | 
|---|
|  | 1566 | end; | 
|---|
|  | 1567 | if Length(DfltCopay)>0 then SetDefaultCoPayToNewOrder(NewOrder.ID, DfltCopay); | 
|---|
|  | 1568 | if (Length(FEvtName)>0) then | 
|---|
|  | 1569 | begin | 
|---|
|  | 1570 | //  NewOrder.EventName := 'Delayed ' + MixedCase(FEvtName);  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1571 | NewOrder.EventName := DKLangConstW('fODBase_Delayed') + MixedCase(FEvtName); //kt added 8/8/2007 | 
|---|
|  | 1572 | FEvtName := ''; | 
|---|
|  | 1573 | end; | 
|---|
|  | 1574 | if not ProcessOrderAcceptEventHook(NewOrder.ID, NewOrder.DGroup) then | 
|---|
|  | 1575 | begin | 
|---|
|  | 1576 | if NewOrder.ID <> '' then | 
|---|
|  | 1577 | begin | 
|---|
|  | 1578 | if (Encounter.Provider = User.DUZ) and User.CanSignOrders | 
|---|
|  | 1579 | then CanSign := CH_SIGN_YES | 
|---|
|  | 1580 | else CanSign := CH_SIGN_NA; | 
|---|
|  | 1581 | if NewOrder.Signature = OSS_NOT_REQUIRE then CanSign := CH_SIGN_NA; | 
|---|
|  | 1582 | Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, Responses.FViewName, CanSign); | 
|---|
|  | 1583 |  | 
|---|
|  | 1584 | UBAGlobals.TargetOrderID := NewOrder.ID; | 
|---|
|  | 1585 |  | 
|---|
|  | 1586 | if Responses.EditOrder = '' then OrderAction := ORDER_NEW else OrderAction := ORDER_EDIT; | 
|---|
|  | 1587 | SendMessage(Application.MainForm.Handle, UM_NEWORDER, OrderAction, Integer(NewOrder)); | 
|---|
|  | 1588 | end | 
|---|
|  | 1589 | else InfoBox(TX_SAVE_ERR, TX_NO_SAVE_CAP, MB_OK); | 
|---|
|  | 1590 | end; | 
|---|
|  | 1591 | NewOrder.Free;      // free here - recieving forms should get own copy using assign | 
|---|
|  | 1592 | end; | 
|---|
|  | 1593 |  | 
|---|
|  | 1594 | procedure TfrmODBase.cmdAcceptClick(Sender: TObject); | 
|---|
|  | 1595 | //const | 
|---|
|  | 1596 | //TX_CMPTEVT = ' occurred since you started writing delayed orders. '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1597 | //  + 'The orders that were entered and signed have now been released. '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1598 | //  + 'Any unsigned orders will be released immediately upon signature. '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1599 | //  + 'To write new delayed orders for this event you need to click the write delayed orders button again and select the appropriate event. '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1600 | //  + 'Orders delayed to this same event will remain delayed until the event occurs again.'  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1601 | //  + 'The Orders tab will now be refreshed and switched to the Active Orders view. '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1602 | //  + 'If you wish to continue to write active orders for this patient, '  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1603 | //  + 'close this message window and continue as usual.';  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1604 | var | 
|---|
|  | 1605 | theGrpName: string; | 
|---|
|  | 1606 | alreadyClosed: boolean; | 
|---|
|  | 1607 | TX_CMPTEVT : string; //kt | 
|---|
|  | 1608 | begin | 
|---|
|  | 1609 | TX_CMPTEVT := DKLangConstW('fODBase_occurred_since_you_started_writing_delayed_ordersx') //kt added 8/8/2007 | 
|---|
|  | 1610 | + DKLangConstW('fODBase_The_orders_that_were_entered_and_signed_have_now_been_releasedx') //kt added 8/8/2007 | 
|---|
|  | 1611 | + DKLangConstW('fODBase_Any_unsigned_orders_will_be_released_immediately_upon_signaturex') //kt added 8/8/2007 | 
|---|
|  | 1612 | + #13#13 | 
|---|
|  | 1613 | + DKLangConstW('fODBase_To_write_new_delayed_orders_for_this_event_you_need_to_click_the_write_delayed_orders_button_again_and_select_the_appropriate_eventx') //kt added 8/8/2007 | 
|---|
|  | 1614 | + DKLangConstW('fODBase_Orders_delayed_to_this_same_event_will_remain_delayed_until_the_event_occurs_againx') //kt added 8/8/2007 | 
|---|
|  | 1615 | + #13#13 | 
|---|
|  | 1616 | + DKLangConstW('fODBase_The_Orders_tab_will_now_be_refreshed_and_switched_to_the_Active_Orders_viewx') //kt added 8/8/2007 | 
|---|
|  | 1617 | + DKLangConstW('fODBase_If_you_wish_to_continue_to_write_active_orders_for_this_patientx') //kt added 8/8/2007 | 
|---|
|  | 1618 | + DKLangConstW('fODBase_close_this_message_window_and_continue_as_usualx'); //kt added 8/8/2007 | 
|---|
|  | 1619 | FAcceptOK := False; | 
|---|
|  | 1620 | CIDCOkToSave := False; | 
|---|
|  | 1621 | alreadyClosed := False; | 
|---|
|  | 1622 | self.Responses.Cancel := False; | 
|---|
|  | 1623 | if frmOrders <> nil then | 
|---|
|  | 1624 | begin | 
|---|
|  | 1625 | if (frmOrders.TheCurrentView <> nil) and (frmOrders.TheCurrentView.EventDelay.PtEventIFN>0) and IsCompletedPtEvt(frmOrders.TheCurrentView.EventDelay.PtEventIFN) then | 
|---|
|  | 1626 | begin | 
|---|
|  | 1627 | //    theGrpName := 'Delayed ' + frmOrders.TheCurrentView.EventDelay.EventName;  <-- original line.  //kt 8/8/2007 | 
|---|
|  | 1628 | theGrpName := DKLangConstW('fODBase_Delayed') + frmOrders.TheCurrentView.EventDelay.EventName; //kt added 8/8/2007 | 
|---|
|  | 1629 | SaveAsCurrent := True; | 
|---|
|  | 1630 | end; | 
|---|
|  | 1631 | end; | 
|---|
|  | 1632 | if ValidSave then | 
|---|
|  | 1633 | begin | 
|---|
|  | 1634 | FAcceptOK := True; | 
|---|
|  | 1635 | CIDCOkToSave := True; | 
|---|
|  | 1636 | with Responses do | 
|---|
|  | 1637 | if not FAutoAccept and (CopyOrder = '') and (EditOrder = '') and (TransferOrder = '') | 
|---|
|  | 1638 | and AskAnotherOrder(DialogIEN) | 
|---|
|  | 1639 | then InitDialog           // ClearDialogControls is in InitDialog | 
|---|
|  | 1640 | else | 
|---|
|  | 1641 | begin | 
|---|
|  | 1642 | ClearDialogControls;    // to allow form to close without prompting to save order | 
|---|
|  | 1643 | Close; | 
|---|
|  | 1644 | alreadyClosed := True; | 
|---|
|  | 1645 | end; | 
|---|
|  | 1646 | if NoFresh then | 
|---|
|  | 1647 | begin | 
|---|
|  | 1648 | if SaveAsCurrent then | 
|---|
|  | 1649 | begin | 
|---|
|  | 1650 | SaveAsCurrent := False; | 
|---|
|  | 1651 | with Responses do | 
|---|
|  | 1652 | begin | 
|---|
|  | 1653 | if not alreadyClosed then | 
|---|
|  | 1654 | begin | 
|---|
|  | 1655 | ClearDialogControls; | 
|---|
|  | 1656 | Close; | 
|---|
|  | 1657 | end; | 
|---|
|  | 1658 | end; | 
|---|
|  | 1659 | frmOrders.GroupChangesUpdate(theGrpName); | 
|---|
|  | 1660 | Exit; | 
|---|
|  | 1661 | end; | 
|---|
|  | 1662 | end else | 
|---|
|  | 1663 | begin | 
|---|
|  | 1664 | if SaveAsCurrent then | 
|---|
|  | 1665 | begin | 
|---|
|  | 1666 | SaveAsCurrent := False; | 
|---|
|  | 1667 | with Responses do | 
|---|
|  | 1668 | begin | 
|---|
|  | 1669 | if not alreadyClosed then | 
|---|
|  | 1670 | begin | 
|---|
|  | 1671 | ClearDialogControls; | 
|---|
|  | 1672 | Close; | 
|---|
|  | 1673 | end; | 
|---|
|  | 1674 | end; | 
|---|
|  | 1675 | frmOrders.GroupChangesUpdate(theGrpName); | 
|---|
|  | 1676 | //EDONeedRefresh := True; | 
|---|
|  | 1677 | Exit; | 
|---|
|  | 1678 | end; | 
|---|
|  | 1679 | end | 
|---|
|  | 1680 | end; {if ValidSave} | 
|---|
|  | 1681 | if SaveAsCurrent then | 
|---|
|  | 1682 | SaveAsCurrent := False; | 
|---|
|  | 1683 | end; | 
|---|
|  | 1684 |  | 
|---|
|  | 1685 | procedure TfrmODBase.cmdQuitClick(Sender: TObject); | 
|---|
|  | 1686 | begin | 
|---|
|  | 1687 | inherited; | 
|---|
|  | 1688 | Close; | 
|---|
|  | 1689 | end; | 
|---|
|  | 1690 |  | 
|---|
|  | 1691 | procedure TfrmODBase.FormClose(Sender: TObject; var Action: TCloseAction); | 
|---|
|  | 1692 | begin | 
|---|
|  | 1693 | SetupVars;  //kt added 8/8/2007 to replace constants with vars. | 
|---|
|  | 1694 | inherited; | 
|---|
|  | 1695 | // unlock an order that is being edited if accept wasn't pressed | 
|---|
|  | 1696 | //   this unlock is currently done in ActivateOrderDialog | 
|---|
|  | 1697 | //with Responses do if (Length(EditOrder) > 0) and (not FAcceptOK) then UnlockOrder(EditOrder); | 
|---|
|  | 1698 | PopKeyVars; | 
|---|
|  | 1699 | SaveUserBounds(Self); | 
|---|
|  | 1700 | FClosing := True; | 
|---|
|  | 1701 | Action := caFree; | 
|---|
|  | 1702 | (* | 
|---|
|  | 1703 | if User.NoOrdering then Exit; | 
|---|
|  | 1704 | if Length(memOrder.Text) > 0 then | 
|---|
|  | 1705 | if InfoBox(TX_ACCEPT + memOrder.Text, TX_ACCEPT_CAP, MB_YESNO) = ID_YES then | 
|---|
|  | 1706 | if not ValidSave then | 
|---|
|  | 1707 | begin | 
|---|
|  | 1708 | FClosing := False; | 
|---|
|  | 1709 | Action := caNone; | 
|---|
|  | 1710 | end; | 
|---|
|  | 1711 | *) | 
|---|
|  | 1712 | end; | 
|---|
|  | 1713 |  | 
|---|
|  | 1714 | procedure TfrmODBase.FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
|---|
|  | 1715 | begin | 
|---|
|  | 1716 | SetupVars;  //kt added 8/8/2007 to replace constants with vars. | 
|---|
|  | 1717 | inherited; | 
|---|
|  | 1718 | //self.Responses.Cancel := False; | 
|---|
|  | 1719 | if User.NoOrdering then Exit; | 
|---|
|  | 1720 | if FAbortOrder then exit; | 
|---|
|  | 1721 | if FOrderAction in [ORDER_EDIT, ORDER_COPY] then Exit;  // don't invoke verify dialog | 
|---|
|  | 1722 | if FOrderAction = ORDER_QUICK then Exit;                // should this be here?? | 
|---|
|  | 1723 | if frmFrame.ContextChanging then | 
|---|
|  | 1724 | begin | 
|---|
|  | 1725 | // close any sub-dialogs created by order dialog FIRST!! | 
|---|
|  | 1726 | exit; | 
|---|
|  | 1727 | end; | 
|---|
|  | 1728 | if Length(memOrder.Text) > 0 then | 
|---|
|  | 1729 | begin | 
|---|
|  | 1730 | if InfoBox(TX_ACCEPT + memOrder.Text, TX_ACCEPT_CAP, MB_YESNO) = ID_YES | 
|---|
|  | 1731 | then CanClose := ValidSave | 
|---|
|  | 1732 | else memOrder.Text := '';  // so don't return False on subsequent CloseQuery | 
|---|
|  | 1733 | end; | 
|---|
|  | 1734 | end; | 
|---|
|  | 1735 |  | 
|---|
|  | 1736 | procedure TfrmODBase.TabClose(var CanClose: Boolean); | 
|---|
|  | 1737 | begin | 
|---|
|  | 1738 | SetupVars;  //kt added 8/8/2007 to replace constants with vars. | 
|---|
|  | 1739 | inherited; | 
|---|
|  | 1740 | CanClose := True; | 
|---|
|  | 1741 | if Length(memOrder.Text) > 0 then | 
|---|
|  | 1742 | if InfoBox(TX_ACCEPT + memOrder.Text, TX_ACCEPT_CAP, MB_YESNO) = ID_YES then | 
|---|
|  | 1743 | if not ValidSave then CanClose := False; | 
|---|
|  | 1744 | if CanClose then InitDialog; | 
|---|
|  | 1745 | end; | 
|---|
|  | 1746 |  | 
|---|
|  | 1747 | procedure TfrmODBase.memMessageMouseUp(Sender: TObject; | 
|---|
|  | 1748 | Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | 
|---|
|  | 1749 | begin | 
|---|
|  | 1750 | inherited; | 
|---|
|  | 1751 | ShowOrderMessage( False ); | 
|---|
|  | 1752 | end; | 
|---|
|  | 1753 |  | 
|---|
|  | 1754 | procedure TfrmODBase.SetDefaultCoPay(AnOrderID: string); | 
|---|
|  | 1755 | begin | 
|---|
|  | 1756 | FDfltCopay := GetDefaultCopay(AnOrderID); | 
|---|
|  | 1757 | end; | 
|---|
|  | 1758 |  | 
|---|
|  | 1759 | procedure TfrmODBase.DoSetFontSize( FontSize: integer); | 
|---|
|  | 1760 | begin | 
|---|
|  | 1761 | if AutoSizeDisabled then | 
|---|
|  | 1762 | ResizeAnchoredFormToFont( Self ) | 
|---|
|  | 1763 | else | 
|---|
|  | 1764 | begin | 
|---|
|  | 1765 | //You get to resize the window yourself! | 
|---|
|  | 1766 | Font.Size := FontSize; | 
|---|
|  | 1767 | memMessage.DefAttributes.Size := FontSize; | 
|---|
|  | 1768 | end; | 
|---|
|  | 1769 | end; | 
|---|
|  | 1770 |  | 
|---|
|  | 1771 | procedure TfrmODBase.SetFontSize( FontSize: integer); | 
|---|
|  | 1772 | begin | 
|---|
|  | 1773 | DoSetFontSize( FontSize ); | 
|---|
|  | 1774 | end; | 
|---|
|  | 1775 |  | 
|---|
|  | 1776 | function TResponses.GetIENForPrompt(const APromptID: string): Integer; | 
|---|
|  | 1777 | var | 
|---|
|  | 1778 | i: Integer; | 
|---|
|  | 1779 | begin | 
|---|
|  | 1780 | Result := 0; | 
|---|
|  | 1781 | with FPrompts do for i := 0 to Count - 1 do with TPrompt(Items[i]) do | 
|---|
|  | 1782 | if (ID = APromptID) then | 
|---|
|  | 1783 | begin | 
|---|
|  | 1784 | Result := IEN; | 
|---|
|  | 1785 | break; | 
|---|
|  | 1786 | end; | 
|---|
|  | 1787 | end; | 
|---|
|  | 1788 |  | 
|---|
|  | 1789 | procedure TfrmODBase.pnlMessageExit(Sender: TObject); | 
|---|
|  | 1790 | begin | 
|---|
|  | 1791 | inherited; | 
|---|
|  | 1792 | ShowOrderMessage(False); | 
|---|
|  | 1793 | end; | 
|---|
|  | 1794 |  | 
|---|
|  | 1795 | procedure TfrmODBase.pnlMessageMouseDown(Sender: TObject; | 
|---|
|  | 1796 | Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | 
|---|
|  | 1797 | begin | 
|---|
|  | 1798 | inherited; | 
|---|
|  | 1799 | FMessageClickX := X; | 
|---|
|  | 1800 | FMessageClickY := Y; | 
|---|
|  | 1801 | end; | 
|---|
|  | 1802 |  | 
|---|
|  | 1803 | procedure TfrmODBase.pnlMessageMouseMove(Sender: TObject; | 
|---|
|  | 1804 | Shift: TShiftState; X, Y: Integer); | 
|---|
|  | 1805 | begin | 
|---|
|  | 1806 | inherited; | 
|---|
|  | 1807 | if (ssLeft in Shift) then | 
|---|
|  | 1808 | pnlMessage.SetBounds(pnlMessage.Left + X - FMessageClickX, pnlMessage.Top + Y - FMessageClickY, pnlMessage.Width, pnlMessage.Height); | 
|---|
|  | 1809 | end; | 
|---|
|  | 1810 |  | 
|---|
|  | 1811 | function TfrmODBase.LESValidationCheck: boolean; | 
|---|
|  | 1812 | var | 
|---|
|  | 1813 | idx: integer; | 
|---|
|  | 1814 | LESGrpList,LESRejectedReason: TStringList; | 
|---|
|  | 1815 | IsLESOrder: boolean; | 
|---|
|  | 1816 | TempMSG,LESODInfo: string; | 
|---|
|  | 1817 | begin | 
|---|
|  | 1818 | Result := True; | 
|---|
|  | 1819 | if Length(Responses.EditOrder)>1 then | 
|---|
|  | 1820 | begin | 
|---|
|  | 1821 | LESGrpList := TStringList.Create; | 
|---|
|  | 1822 | PiecesToList(GetDispGroupForLES,'^',LESGrpList); | 
|---|
|  | 1823 | IsLESOrder := False; | 
|---|
|  | 1824 | for idx:=0 to LESGrpList.Count - 1 do | 
|---|
|  | 1825 | if StrToIntDef(LESGrpList[idx],0) = Responses.DisplayGroup then | 
|---|
|  | 1826 | begin | 
|---|
|  | 1827 | IsLESOrder := True; | 
|---|
|  | 1828 | Break; | 
|---|
|  | 1829 | end; | 
|---|
|  | 1830 | if IsLESOrder then | 
|---|
|  | 1831 | begin | 
|---|
|  | 1832 | TempMSG := ''; | 
|---|
|  | 1833 | LESODInfo := Patient.DFN + | 
|---|
|  | 1834 | '^' + Responses.IValueFor('ORDERABLE',1) + | 
|---|
|  | 1835 | '^' + IntToStr(Encounter.Location) + | 
|---|
|  | 1836 | '^' + IntToStr(Encounter.Provider) + | 
|---|
|  | 1837 | '^' + Responses.IValueFor('START',1); | 
|---|
|  | 1838 | LESRejectedReason := TStringList.Create; | 
|---|
|  | 1839 | LESValidationForChangedLabOrder(LESRejectedReason,LESODInfo); | 
|---|
|  | 1840 | if LESRejectedReason.Count > 0 then | 
|---|
|  | 1841 | begin | 
|---|
|  | 1842 | for idx := 0 to LESRejectedReason.Count - 1 do | 
|---|
|  | 1843 | begin | 
|---|
|  | 1844 | if Length(LESRejectedReason[idx])>0 then | 
|---|
|  | 1845 | TempMSG := TempMSG + #13 + LESRejectedReason[idx]; | 
|---|
|  | 1846 | end; | 
|---|
|  | 1847 | if Length(TempMSG)>0 then | 
|---|
|  | 1848 | begin | 
|---|
|  | 1849 | ShowMessage(TempMSG); | 
|---|
|  | 1850 | Result := False; | 
|---|
|  | 1851 | end; | 
|---|
|  | 1852 | end; | 
|---|
|  | 1853 | end; | 
|---|
|  | 1854 | end; | 
|---|
|  | 1855 | end; | 
|---|
|  | 1856 |  | 
|---|
|  | 1857 |  | 
|---|
|  | 1858 | end. | 
|---|
|  | 1859 |  | 
|---|