//kt -- Modified with SourceScanner on 8/8/2007 unit fOMSet; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CheckLst, rOrders, uConst, ORFn, rODMeds, fODBase,uCore,fOrders, fframe, DKLang; type TSetItem = class DialogIEN: Integer; DialogType: Char; OIIEN: string; InPkg: string; OwnedBy: TComponent; RefNum: Integer; end; TfrmOMSet = class(TForm) lstSet: TCheckListBox; cmdInterupt: TButton; DKLanguageController1: TDKLanguageController; procedure cmdInteruptClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); private DoingNextItem : Boolean; CloseRequested : Boolean; FDelayEvent: TOrderDelayEvent; FClosing: Boolean; FRefNum: Integer; FActiveMenus: Integer; FClosebyDeaCheck: Boolean; function IsCreatedByMenu(ASetItem: TSetItem): boolean; function DeaCheckPassed(OIIens: string; APkg: string; AnEventType: Char): boolean; procedure DoNextItem; procedure UMDestroy(var Message: TMessage); message UM_DESTROY; procedure UMDelayEvent(var Message: TMessage); message UM_DELAYEVENT; public procedure InsertList(SetList: TStringList; AnOwner: TComponent; ARefNum: Integer; const KeyVarStr: string; AnEventType:Char =#0); procedure SetEventDelay(AnEvent: TOrderDelayEvent); property RefNum: Integer read FRefNum write FRefNum; end; var frmOMSet: TfrmOMSet; implementation {$R *.DFM} uses uOrders, fOMNavA, rMisc, uODBase; //const //TX_STOP = 'Do you want to stop entering the current set of orders?'; <-- original line. //kt 8/8/2007 //TC_STOP = 'Interrupt Order Set'; <-- original line. //kt 8/8/2007 var TX_STOP : string; //kt TC_STOP : string; //kt procedure SetupVars; //kt Added entire function to replace constant declarations 8/8/2007 begin TX_STOP := DKLangConstW('fOMSet_Do_you_want_to_stop_entering_the_current_set_of_ordersx'); TC_STOP := DKLangConstW('fOMSet_Interrupt_Order_Set'); end; procedure TfrmOMSet.SetEventDelay(AnEvent: TOrderDelayEvent); begin FDelayEvent := AnEvent; end; procedure TfrmOMSet.InsertList(SetList: TStringList; AnOwner: TComponent; ARefNum: Integer; const KeyVarStr: string; AnEventType: Char); { expects SetList to be strings of DlgIEN^DlgType^DisplayName^OrderableItemIens } //const //TXT_DEAFAIL = 'You need have #DEA key to place the order '; <-- original line. //kt 8/8/2007 //TXT_INSTRUCT = #13 + 'Click OK to continue, Click Cancel to terminate the current order process.'; <-- original line. //kt 8/8/2007 var i, InsertAt: Integer; SetItem: TSetItem; TXT_DEAFAIL : string; //kt TXT_INSTRUCT : string; //kt begin TXT_DEAFAIL := DKLangConstW('fOMSet_You_need_have_xDEA_key_to_place_the_order'); //kt added 8/8/2007 TXT_INSTRUCT := #13 + DKLangConstW('fOMSet_Click_OK_to_continuex_Click_Cancel_to_terminate_the_current_order_processx'); //kt added 8/8/2007 InsertAt := lstSet.ItemIndex + 1; with SetList do for i := 0 to Count - 1 do begin SetItem := TSetItem.Create; SetItem.DialogIEN := StrToIntDef(Piece(SetList[i], U, 1), 0); SetItem.DialogType := CharAt(Piece(SetList[i], U, 2), 1); SetItem.OIIEN := Piece(SetList[i], U, 4); SetItem.InPkg := Piece(SetList[i], U, 5); // put the Owner form and reference number in the last item if i = Count - 1 then begin SetItem.OwnedBy := AnOwner; SetItem.RefNum := ARefNum; end; if not DeaCheckPassed(SetItem.OIIEN, SetItem.InPkg, AnEventType) then if InfoBox(TXT_DEAFAIL + Piece(SetList[i], U, 3) + TXT_INSTRUCT, // 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDOK then <-- original line. //kt 8/8/2007 DKLangConstW('fOMSet_Warning'), MB_OKCANCEL or MB_ICONWARNING) = IDOK then //kt added 8/8/2007 Continue else begin FClosebyDeaCheck := True; Close; Exit; end; lstSet.Items.InsertObject(InsertAt, Piece(SetList[i], U, 3), SetItem); Inc(InsertAt); end; PushKeyVars(KeyVarStr); DoNextItem; end; procedure TfrmOMSet.DoNextItem; var SetItem: TSetItem; theOwner: TComponent; procedure SkipToNext; begin lstSet.Checked[lstSet.ItemIndex] := True; DoNextItem; end; begin DoingNextItem := true; //frmFrame.UpdatePtInfoOnRefresh; if FClosing then Exit; if frmOrders <> nil then begin if (frmOrders.TheCurrentView<>nil) and (frmOrders.TheCurrentView.EventDelay.PtEventIFN>0) and IsCompletedPtEvt(frmOrders.TheCurrentView.EventDelay.PtEventIFN) then begin FDelayEvent.EventType := #0; FDelayEvent.EventIFN := 0; FDelayEvent.TheParent := TParentEvent.Create; FDelayEvent.EventName := ''; FDelayEvent.PtEventIFN := 0; end; end; with lstSet do begin if ItemIndex >= Items.Count - 1 then begin Close; Exit; end; ItemIndex := ItemIndex + 1; SetItem := TSetItem(Items.Objects[ItemIndex]); case SetItem.DialogType of 'A': if not ActivateAction(IntToStr(SetItem.DialogIEN), Self, ItemIndex) then begin if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then lstSet.Checked[lstSet.ItemIndex] := True else SkipToNext; end; 'D', 'Q': if not ActivateOrderDialog(IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then begin if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then lstSet.Checked[lstSet.ItemIndex] := True else SkipToNext; end; 'M': if ActivateOrderMenu( IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then Inc(FActiveMenus) else begin if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then lstSet.Checked[lstSet.ItemIndex] := True else SkipToNext; end; 'O': begin // if (Self.Owner.Name = 'frmOMNavA') then theOwner := Self.Owner else theOwner := self; <-- original line. //kt 8/8/2007 if (Self.Owner.Name = DKLangConstW('fOMSet_frmOMNavA')) then theOwner := Self.Owner else theOwner := self; //kt added 8/8/2007 if not ActivateOrderSet( IntToStr(SetItem.DialogIEN), FDelayEvent, theOwner, ItemIndex) then begin if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then lstSet.Checked[lstSet.ItemIndex] := True else SkipToNext; end; end; else begin // InfoBox('Unsupported dialog type: ' + SetItem.DialogType, 'Error', MB_OK); <-- original line. //kt 8/8/2007 InfoBox(DKLangConstW('fOMSet_Unsupported_dialog_typex') + SetItem.DialogType, DKLangConstW('fOMSet_Error'), MB_OK); //kt added 8/8/2007 SkipToNext; end; end; {case} end; {with lstSet} DoingNextItem := false; end; procedure TfrmOMSet.UMDelayEvent(var Message: TMessage); begin // ignore if delay from other than current itemindex // (prevents completion of an order set from calling DoNextItem) if Message.WParam = lstSet.ItemIndex then if lstSet.ItemIndex < lstSet.Items.Count - 1 then DoNextItem else Close; if CloseRequested then Close; end; procedure TfrmOMSet.UMDestroy(var Message: TMessage); { Received whenever activated item is finished. Posts to Owner if last item in the set. } var SetItem: TSetItem; RefNum: Integer; begin RefNum := Message.WParam; lstSet.Checked[RefNum] := True; SetItem := TSetItem(lstSet.Items.Objects[RefNum]); if SetItem.DialogType = 'M' then Dec(FActiveMenus); if (SetItem.OwnedBy <> nil) and (SetItem.DialogType <> 'O') then begin PopKeyVars; if ((lstSet.ItemIndex = lstSet.Count - 1) and (lstSet.Checked[lstSet.ItemIndex] = True)) then Close; if {(SetItem.OwnedBy <> Self) and} (SetItem.OwnedBy is TWinControl) then begin SendMessage(TWinControl(SetItem.OwnedBy).Handle, UM_DESTROY, SetItem.RefNum, 0); //Exit; end; end; // let menu or dialog finish closing before going on to next item in the order set While RefNum <= lstSet.Items.Count - 2 do begin if not (lstSet.Checked[RefNum+1]) then Break else begin RefNum := RefNum + 1; lstSet.ItemIndex := RefNum; end; end; PostMessage(Handle, UM_DELAYEVENT, RefNum, 0); end; procedure TfrmOMSet.FormCreate(Sender: TObject); begin FActiveMenus := 0; FClosing := False; FClosebyDeaCheck := False; NoFresh := True; CloseRequested := false; DoingNextItem := false; end; procedure TfrmOMSet.FormDestroy(Sender: TObject); var i: Integer; begin with lstSet do for i := 0 to Items.Count - 1 do TSetItem(Items.Objects[i]).Free; DestroyingOrderSet; end; procedure TfrmOMSet.FormCloseQuery(Sender: TObject; var CanClose: Boolean); { if this is not the last item in the set, prompt whether to interrupt processing } begin SetupVars; //kt added 8/8/2007 to replace constants with vars. if FClosebyDeaCheck then CanClose := True else if lstSet.ItemIndex < (lstSet.Items.Count - 1) then CanClose := InfoBox(TX_STOP, TC_STOP, MB_YESNO) = IDYES; end; procedure TfrmOMSet.FormClose(Sender: TObject; var Action: TCloseAction); { Notify remaining owners that their item is done (or - really never completed) } var i: Integer; SetItem: TSetItem; begin // do we need to iterate thru and send messages where OwnedBy <> nil? FClosing := True; for i := 1 to FActiveMenus do PopLastMenu; if lstSet.Items.Count > 0 then begin if lstSet.ItemIndex < 0 then lstSet.ItemIndex := 0; with lstSet do for i := ItemIndex to Items.Count - 1 do begin SetItem := TSetItem(lstSet.Items.Objects[i]); if (SetItem.OwnedBy <> nil) and (SetItem.OwnedBy is TWinControl) then SendMessage(TWinControl(SetItem.OwnedBy).Handle, UM_DESTROY, SetItem.RefNum, 0); end; end; SaveUserBounds(Self); NoFresh := False; Action := caFree; end; procedure TfrmOMSet.cmdInteruptClick(Sender: TObject); begin if DoingNextItem then CloseRequested := true //Fix for CQ: 8297 else Close; end; function TfrmOMSet.DeaCheckPassed(OIIens: string; APkg: string; AnEventType: Char): boolean; var tmpIenList: TStringList; i: integer; isInpt: boolean; begin Result := True; if Pos('PS',APkg) <> 1 then Exit; if Length(OIIens)=0 then Exit; tmpIenList := TStringList.Create; PiecesToList(OIIens,';',TStrings(tmpIenList)); case AnEventType of 'A','T': isInpt := True; 'D': isInpt := False; else isInpt := Patient.Inpatient; end; for i := 0 to tmpIenList.Count - 1 do if DEACheckFailed(StrToIntDef(tmpIenList[i],0), isInpt) then begin Result := False; Break; end; end; function TfrmOMSet.IsCreatedByMenu(ASetItem: TSetItem): boolean; begin Result := False; //if (AsetItem.OwnedBy <> nil) and (ASetItem.OwnedBy.Name = 'frmOMNavA') then <-- original line. //kt 8/8/2007 if (AsetItem.OwnedBy <> nil) and (ASetItem.OwnedBy.Name = DKLangConstW('fOMSet_frmOMNavA')) then //kt added 8/8/2007 Result := True; end; end.