source: cprs/branches/foia-cprs/CPRS-Chart/Orders/fOMSet.pas@ 459

Last change on this file since 459 was 459, checked in by Kevin Toppenberg, 16 years ago

Adding foia-cprs branch

File size: 9.5 KB
Line 
1unit fOMSet;
2
3interface
4
5uses
6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 StdCtrls, CheckLst, rOrders, uConst, ORFn, rODMeds, fODBase,uCore,fOrders, fframe;
8
9type
10 TSetItem = class
11 DialogIEN: Integer;
12 DialogType: Char;
13 OIIEN: string;
14 InPkg: string;
15 OwnedBy: TComponent;
16 RefNum: Integer;
17 end;
18
19 TfrmOMSet = class(TForm)
20 lstSet: TCheckListBox;
21 cmdInterupt: TButton;
22 procedure cmdInteruptClick(Sender: TObject);
23 procedure FormDestroy(Sender: TObject);
24 procedure FormClose(Sender: TObject; var Action: TCloseAction);
25 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
26 procedure FormCreate(Sender: TObject);
27 private
28 FDelayEvent: TOrderDelayEvent;
29 FClosing: Boolean;
30 FRefNum: Integer;
31 FActiveMenus: Integer;
32 FClosebyDeaCheck: Boolean;
33 function IsCreatedByMenu(ASetItem: TSetItem): boolean;
34 function DeaCheckPassed(OIIens: string; APkg: string; AnEventType: Char): boolean;
35 procedure DoNextItem;
36 procedure UMDestroy(var Message: TMessage); message UM_DESTROY;
37 procedure UMDelayEvent(var Message: TMessage); message UM_DELAYEVENT;
38 public
39 procedure InsertList(SetList: TStringList; AnOwner: TComponent; ARefNum: Integer;
40 const KeyVarStr: string; AnEventType:Char =#0);
41 procedure SetEventDelay(AnEvent: TOrderDelayEvent);
42 property RefNum: Integer read FRefNum write FRefNum;
43 end;
44
45var
46 frmOMSet: TfrmOMSet;
47
48implementation
49
50{$R *.DFM}
51
52uses uOrders, fOMNavA, rMisc, uODBase;
53
54const
55 TX_STOP = 'Do you want to stop entering the current set of orders?';
56 TC_STOP = 'Interrupt Order Set';
57
58procedure TfrmOMSet.SetEventDelay(AnEvent: TOrderDelayEvent);
59begin
60 FDelayEvent := AnEvent;
61end;
62
63procedure TfrmOMSet.InsertList(SetList: TStringList; AnOwner: TComponent; ARefNum: Integer;
64 const KeyVarStr: string; AnEventType: Char);
65{ expects SetList to be strings of DlgIEN^DlgType^DisplayName^OrderableItemIens }
66const
67 TXT_DEAFAIL = 'You need have #DEA key to place the order ';
68 TXT_INSTRUCT = #13 + 'Click OK to continue, Click Cancel to terminate the current order process.';
69var
70 i, InsertAt: Integer;
71 SetItem: TSetItem;
72begin
73 InsertAt := lstSet.ItemIndex + 1;
74 with SetList do for i := 0 to Count - 1 do
75 begin
76 SetItem := TSetItem.Create;
77 SetItem.DialogIEN := StrToIntDef(Piece(SetList[i], U, 1), 0);
78 SetItem.DialogType := CharAt(Piece(SetList[i], U, 2), 1);
79 SetItem.OIIEN := Piece(SetList[i], U, 4);
80 SetItem.InPkg := Piece(SetList[i], U, 5);
81 // put the Owner form and reference number in the last item
82 if i = Count - 1 then
83 begin
84 SetItem.OwnedBy := AnOwner;
85 SetItem.RefNum := ARefNum;
86 end;
87 if not DeaCheckPassed(SetItem.OIIEN, SetItem.InPkg, AnEventType) then
88 if InfoBox(TXT_DEAFAIL + Piece(SetList[i], U, 3) + TXT_INSTRUCT,
89 'Warning', MB_OKCANCEL or MB_ICONWARNING) = IDOK then
90 Continue
91 else
92 begin
93 FClosebyDeaCheck := True;
94 Close;
95 Exit;
96 end;
97 lstSet.Items.InsertObject(InsertAt, Piece(SetList[i], U, 3), SetItem);
98 Inc(InsertAt);
99 end;
100 PushKeyVars(KeyVarStr);
101 DoNextItem;
102end;
103
104procedure TfrmOMSet.DoNextItem;
105var
106 SetItem: TSetItem;
107
108 procedure SkipToNext;
109 begin
110 lstSet.Checked[lstSet.ItemIndex] := True;
111 DoNextItem;
112 end;
113
114begin
115 //frmFrame.UpdatePtInfoOnRefresh;
116 if FClosing then Exit;
117 if frmOrders <> nil then
118 begin
119 if (frmOrders.TheCurrentView<>nil) and (frmOrders.TheCurrentView.EventDelay.PtEventIFN>0)
120 and IsCompletedPtEvt(frmOrders.TheCurrentView.EventDelay.PtEventIFN) then
121 begin
122 FDelayEvent.EventType := #0;
123 FDelayEvent.EventIFN := 0;
124 FDelayEvent.TheParent := TParentEvent.Create;
125 FDelayEvent.EventName := '';
126 FDelayEvent.PtEventIFN := 0;
127 end;
128 end;
129 with lstSet do
130 begin
131 if ItemIndex >= Items.Count - 1 then
132 begin
133 Close;
134 Exit;
135 end;
136 ItemIndex := ItemIndex + 1;
137 SetItem := TSetItem(Items.Objects[ItemIndex]);
138 case SetItem.DialogType of
139 'A': if not ActivateAction(IntToStr(SetItem.DialogIEN), Self, ItemIndex) then
140 begin
141 if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then
142 lstSet.Checked[lstSet.ItemIndex] := True
143 else SkipToNext;
144 end;
145 'D', 'Q': if not ActivateOrderDialog(IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then
146 begin
147 if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then
148 lstSet.Checked[lstSet.ItemIndex] := True
149 else SkipToNext;
150 end;
151 'M': if ActivateOrderMenu( IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex)
152 then Inc(FActiveMenus)
153 else
154 begin
155 if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then
156 lstSet.Checked[lstSet.ItemIndex] := True
157 else
158 SkipToNext;
159 end;
160 'O': if not ActivateOrderSet( IntToStr(SetItem.DialogIEN), FDelayEvent, Self, ItemIndex) then
161 begin
162 if IsCreatedByMenu(SetItem) and (lstSet.ItemIndex < lstSet.Items.Count - 1) then
163 lstSet.Checked[lstSet.ItemIndex] := True
164 else SkipToNext;
165 end;
166 else begin
167 InfoBox('Unsupported dialog type: ' + SetItem.DialogType, 'Error', MB_OK);
168 SkipToNext;
169 end;
170 end; {case}
171 end; {with lstSet}
172end;
173
174procedure TfrmOMSet.UMDelayEvent(var Message: TMessage);
175begin
176 // ignore if delay from other than current itemindex
177 // (prevents completion of an order set from calling DoNextItem)
178 if Message.WParam = lstSet.ItemIndex then
179 if lstSet.ItemIndex < lstSet.Items.Count - 1 then DoNextItem else Close;
180end;
181
182procedure TfrmOMSet.UMDestroy(var Message: TMessage);
183{ Received whenever activated item is finished. Posts to Owner if last item in the set. }
184var
185 SetItem: TSetItem;
186 RefNum: Integer;
187begin
188 RefNum := Message.WParam;
189 lstSet.Checked[RefNum] := True;
190 SetItem := TSetItem(lstSet.Items.Objects[RefNum]);
191 if SetItem.DialogType = 'M' then Dec(FActiveMenus);
192 if (SetItem.OwnedBy <> nil) and (SetItem.DialogType <> 'O') then
193 begin
194 PopKeyVars;
195 if ((lstSet.ItemIndex = lstSet.Count - 1) and (lstSet.Checked[lstSet.ItemIndex] = True)) then Close;
196 if {(SetItem.OwnedBy <> Self) and} (SetItem.OwnedBy is TWinControl) then
197 begin
198 SendMessage(TWinControl(SetItem.OwnedBy).Handle, UM_DESTROY, SetItem.RefNum, 0);
199 Exit;
200 end;
201 end;
202 // let menu or dialog finish closing before going on to next item in the order set
203 While RefNum <= lstSet.Items.Count - 2 do
204 begin
205 if not (lstSet.Checked[RefNum+1]) then Break
206 else
207 begin
208 RefNum := RefNum + 1;
209 lstSet.ItemIndex := RefNum;
210 end;
211 end;
212 PostMessage(Handle, UM_DELAYEVENT, RefNum, 0);
213end;
214
215procedure TfrmOMSet.FormCreate(Sender: TObject);
216begin
217 FActiveMenus := 0;
218 FClosing := False;
219 FClosebyDeaCheck := False;
220 NoFresh := True;
221end;
222
223procedure TfrmOMSet.FormDestroy(Sender: TObject);
224var
225 i: Integer;
226begin
227 with lstSet do for i := 0 to Items.Count - 1 do TSetItem(Items.Objects[i]).Free;
228 DestroyingOrderSet;
229end;
230
231procedure TfrmOMSet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
232{ if this is not the last item in the set, prompt whether to interrupt processing }
233begin
234 if FClosebyDeaCheck then
235 CanClose := True
236 else if lstSet.ItemIndex < (lstSet.Items.Count - 1)
237 then CanClose := InfoBox(TX_STOP, TC_STOP, MB_YESNO) = IDYES;
238end;
239
240procedure TfrmOMSet.FormClose(Sender: TObject; var Action: TCloseAction);
241{ Notify remaining owners that their item is done (or - really never completed) }
242var
243 i: Integer;
244 SetItem: TSetItem;
245begin
246 // do we need to iterate thru and send messages where OwnedBy <> nil?
247 FClosing := True;
248 for i := 1 to FActiveMenus do PopLastMenu;
249 if lstSet.Items.Count > 0 then
250 begin
251 if lstSet.ItemIndex < 0 then lstSet.ItemIndex := 0;
252 with lstSet do for i := ItemIndex to Items.Count - 1 do
253 begin
254 SetItem := TSetItem(lstSet.Items.Objects[i]);
255 if (SetItem.OwnedBy <> nil) and (SetItem.OwnedBy is TWinControl)
256 then SendMessage(TWinControl(SetItem.OwnedBy).Handle, UM_DESTROY, SetItem.RefNum, 0);
257 end;
258 end;
259 SaveUserBounds(Self);
260 NoFresh := False;
261 Action := caFree;
262end;
263
264procedure TfrmOMSet.cmdInteruptClick(Sender: TObject);
265begin
266 Close;
267end;
268
269function TfrmOMSet.DeaCheckPassed(OIIens: string; APkg: string; AnEventType: Char): boolean;
270var
271 tmpIenList: TStringList;
272 i: integer;
273 isInpt: boolean;
274begin
275 Result := True;
276 if Pos('PS',APkg) <> 1 then
277 Exit;
278 if Length(OIIens)=0 then Exit;
279 tmpIenList := TStringList.Create;
280 PiecesToList(OIIens,';',TStrings(tmpIenList));
281 case AnEventType of
282 'A','T': isInpt := True;
283 'D': isInpt := False;
284 else isInpt := Patient.Inpatient;
285 end;
286 for i := 0 to tmpIenList.Count - 1 do
287 if DEACheckFailed(StrToIntDef(tmpIenList[i],0), isInpt) then
288 begin
289 Result := False;
290 Break;
291 end;
292end;
293
294function TfrmOMSet.IsCreatedByMenu(ASetItem: TSetItem): boolean;
295begin
296 Result := False;
297 if (AsetItem.OwnedBy <> nil) and (ASetItem.OwnedBy.Name = 'frmOMNavA') then
298 Result := True;
299end;
300
301end.
Note: See TracBrowser for help on using the repository browser.