| [453] | 1 | //kt -- Modified with SourceScanner on 8/8/2007
 | 
|---|
 | 2 | unit fODMedComplex;
 | 
|---|
 | 3 | 
 | 
|---|
 | 4 | interface
 | 
|---|
 | 5 | 
 | 
|---|
 | 6 | uses
 | 
|---|
 | 7 |   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 | 
|---|
 | 8 |   fAutoSz, StdCtrls, Grids, Buttons, ExtCtrls, ORCtrls, Menus, ORFn, fODBase, uConst,
 | 
|---|
 | 9 |   ComCtrls, DKLang;
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | type
 | 
|---|
 | 12 |   TfrmODMedComplex = class(TfrmAutoSz)
 | 
|---|
 | 13 |     grdDoses: TStringGrid;
 | 
|---|
 | 14 |     cmdOK: TButton;
 | 
|---|
 | 15 |     cmdCancel: TButton;
 | 
|---|
 | 16 |     cboRoute: TORComboBox;
 | 
|---|
 | 17 |     cboSchedule: TORComboBox;
 | 
|---|
 | 18 |     pnlInstruct: TPanel;
 | 
|---|
 | 19 |     cboInstruct: TORComboBox;
 | 
|---|
 | 20 |     btnUnits: TSpeedButton;
 | 
|---|
 | 21 |     pnlDays: TPanel;
 | 
|---|
 | 22 |     txtDays: TCaptionEdit;
 | 
|---|
 | 23 |     Label1: TLabel;
 | 
|---|
 | 24 |     popUnits: TPopupMenu;
 | 
|---|
 | 25 |     Bevel1: TBevel;
 | 
|---|
 | 26 |     cmdInsert: TButton;
 | 
|---|
 | 27 |     cmdRemove: TButton;
 | 
|---|
 | 28 |     UpDown2: TUpDown;
 | 
|---|
 | 29 |     procedure FormCreate(Sender: TObject);
 | 
|---|
 | 30 |     procedure cmdOKClick(Sender: TObject);
 | 
|---|
 | 31 |     procedure cmdCancelClick(Sender: TObject);
 | 
|---|
 | 32 |     procedure btnUnitsClick(Sender: TObject);
 | 
|---|
 | 33 |     procedure pnlInstructExit(Sender: TObject);
 | 
|---|
 | 34 |     procedure cboRouteExit(Sender: TObject);
 | 
|---|
 | 35 |     procedure cboScheduleExit(Sender: TObject);
 | 
|---|
 | 36 |     procedure pnlDaysExit(Sender: TObject);
 | 
|---|
 | 37 |     procedure grdDosesDrawCell(Sender: TObject; ACol, ARow: Integer;
 | 
|---|
 | 38 |       Rect: TRect; State: TGridDrawState);
 | 
|---|
 | 39 |     procedure pnlInstructEnter(Sender: TObject);
 | 
|---|
 | 40 |     procedure pnlDaysEnter(Sender: TObject);
 | 
|---|
 | 41 |     procedure grdDosesMouseUp(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 42 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 43 |     procedure cmdInsertClick(Sender: TObject);
 | 
|---|
 | 44 |     procedure cmdRemoveClick(Sender: TObject);
 | 
|---|
 | 45 |     procedure grdDosesMouseDown(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 46 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 47 |     procedure grdDosesKeyPress(Sender: TObject; var Key: Char);
 | 
|---|
 | 48 |     procedure txtDaysChange(Sender: TObject);
 | 
|---|
 | 49 |     procedure cboRouteClick(Sender: TObject);
 | 
|---|
 | 50 |   private
 | 
|---|
 | 51 |     //kt Begin Mod (change Consts to Vars) 8/8/2007
 | 
|---|
 | 52 |     TX_NO_AMPER  : string;  //kt
 | 
|---|
 | 53 |     TX_NF_ROUTE  : string;  //kt
 | 
|---|
 | 54 |     TX_NO_ROUTE  : string;  //kt
 | 
|---|
 | 55 |     TX_NO_SCHED  : string;  //kt
 | 
|---|
 | 56 |     //kt End Mod -------------------
 | 
|---|
 | 57 |     FDropColumn: Integer;
 | 
|---|
 | 58 |     procedure ShowEditor(ACol, ARow: Integer; AChar: Char);
 | 
|---|
 | 59 |     procedure UnitClick(Sender: TObject);
 | 
|---|
 | 60 |     procedure Validate(var AnErrMsg: string);
 | 
|---|
 | 61 |     function ValFor(FieldID, ARow: Integer): string;
 | 
|---|
 | 62 |     procedure UMDelayEvent(var Message: TMessage); message UM_DELAYEVENT;
 | 
|---|
 | 63 |     procedure SetupVars;  //kt
 | 
|---|
 | 64 |   public
 | 
|---|
 | 65 |     { Public declarations }
 | 
|---|
 | 66 |   end;
 | 
|---|
 | 67 | 
 | 
|---|
 | 68 | function ExecuteComplexDose(CtrlInits: TCtrlInits; Responses: TResponses): Boolean;
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 | implementation
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 | {$R *.DFM}
 | 
|---|
 | 73 | 
 | 
|---|
 | 74 | uses rODBase;
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 | const
 | 
|---|
 | 77 |   COL_SELECT   =  0;
 | 
|---|
 | 78 |   COL_INSTRUCT =  1;
 | 
|---|
 | 79 |   COL_ROUTE    =  2;
 | 
|---|
 | 80 |   COL_SCHEDULE =  3;
 | 
|---|
 | 81 |   COL_DURATION =  4;
 | 
|---|
 | 82 |   VAL_INSTR    = 10;
 | 
|---|
 | 83 |   VAL_MISC     = 11;
 | 
|---|
 | 84 |   VAL_ROUTE    = 12;
 | 
|---|
 | 85 |   VAL_SCHEDULE = 13;
 | 
|---|
 | 86 |   VAL_DAYS     = 14;
 | 
|---|
 | 87 |   VAL_ABBROUTE = 15;
 | 
|---|
 | 88 |   TAB          = #9;
 | 
|---|
 | 89 | //TX_NO_AMPER  = ' Instructions may not contain the ampersand (&) character.';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 90 | //TX_NF_ROUTE  = ' not found in the Medication Routes file.';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 91 | //TX_NO_ROUTE  = ': Route must be entered.';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 92 | //TX_NO_SCHED  = ': Schedule must be entered.';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 93 | 
 | 
|---|
 | 94 | { public functions }
 | 
|---|
 | 95 | 
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | procedure TfrmODMedComplex.SetupVars;
 | 
|---|
 | 98 | //kt Added entire function to replace constant declarations 8/8/2007
 | 
|---|
 | 99 | begin
 | 
|---|
 | 100 |   TX_NO_AMPER  := DKLangConstW('fODMedComplex_Instructions_may_not_contain_the_ampersand_xxx_characterx');
 | 
|---|
 | 101 |   TX_NF_ROUTE  := DKLangConstW('fODMedComplex_not_found_in_the_Medication_Routes_filex');
 | 
|---|
 | 102 |   TX_NO_ROUTE  := DKLangConstW('fODMedComplex_x_Route_must_be_enteredx');
 | 
|---|
 | 103 |   TX_NO_SCHED  := DKLangConstW('fODMedComplex_x_Schedule_must_be_enteredx');
 | 
|---|
 | 104 | end;
 | 
|---|
 | 105 |  
 | 
|---|
 | 106 | function ExecuteComplexDose(CtrlInits: TCtrlInits; Responses: TResponses): Boolean;
 | 
|---|
 | 107 | var
 | 
|---|
 | 108 |   frmODMedComplex: TfrmODMedComplex;
 | 
|---|
 | 109 |   AResponse: TResponse;
 | 
|---|
 | 110 |   AnInstance, ARow: Integer;
 | 
|---|
 | 111 |   x: string;
 | 
|---|
 | 112 | begin
 | 
|---|
 | 113 |   frmODMedComplex := TfrmODMedComplex.Create(Application);
 | 
|---|
 | 114 |   try
 | 
|---|
 | 115 |     ResizeFormToFont(TForm(frmODMedComplex));
 | 
|---|
 | 116 |     with frmODMedComplex do
 | 
|---|
 | 117 |     begin
 | 
|---|
 | 118 | //    grdDoses.Cells[COL_INSTRUCT, 0] := CtrlInits.DefaultText('Verb');  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 119 |       grdDoses.Cells[COL_INSTRUCT, 0] := CtrlInits.DefaultText(DKLangConstW('fODMedComplex_Verb')); //kt added 8/8/2007
 | 
|---|
 | 120 | //    if grdDoses.Cells[COL_INSTRUCT, 0] = '' then grdDoses.Cells[COL_INSTRUCT, 0] := 'Amount';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 121 |       if grdDoses.Cells[COL_INSTRUCT, 0] = '' then grdDoses.Cells[COL_INSTRUCT, 0] := DKLangConstW('fODMedComplex_Amount'); //kt added 8/8/2007
 | 
|---|
 | 122 | //    CtrlInits.SetControl(cboInstruct, 'Instruct');  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 123 |       CtrlInits.SetControl(cboInstruct, DKLangConstW('fODMedComplex_Instruct')); //kt added 8/8/2007
 | 
|---|
 | 124 | //    CtrlInits.SetPopupMenu(popUnits, UnitClick, 'Nouns');  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 125 |       CtrlInits.SetPopupMenu(popUnits, UnitClick, DKLangConstW('fODMedComplex_Nouns')); //kt added 8/8/2007
 | 
|---|
 | 126 | //    CtrlInits.SetControl(cboRoute,    'Route');  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 127 |       CtrlInits.SetControl(cboRoute,    DKLangConstW('fODMedComplex_Route')); //kt added 8/8/2007
 | 
|---|
 | 128 | //    CtrlInits.SetControl(cboSchedule, 'Schedules');  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 129 |       CtrlInits.SetControl(cboSchedule, DKLangConstW('fODMedComplex_Schedules')); //kt added 8/8/2007
 | 
|---|
 | 130 |       with Responses do
 | 
|---|
 | 131 |       begin
 | 
|---|
 | 132 |         grdDoses.RowCount := InstanceCount('INSTR') + 2;  // 1 row for headers, 1 for new dose
 | 
|---|
 | 133 |         ARow := 1;                                        // row 1 is first dose row
 | 
|---|
 | 134 |         AnInstance := NextInstance('INSTR', 0);
 | 
|---|
 | 135 |         while AnInstance > 0 do
 | 
|---|
 | 136 |         begin
 | 
|---|
 | 137 |           grdDoses.Cells[COL_INSTRUCT, ARow] :=
 | 
|---|
 | 138 |             IValueFor('INSTR', AnInstance) + ' ' + IValueFor('MISC', AnInstance) + TAB +
 | 
|---|
 | 139 |             IValueFor('INSTR', AnInstance) + TAB + IValueFor('MISC', AnInstance);
 | 
|---|
 | 140 |           AResponse := FindResponseByName('ROUTE', AnInstance);
 | 
|---|
 | 141 |           cboRoute.SelectByID(AResponse.IValue);
 | 
|---|
 | 142 |           with cboRoute do if ItemIndex > -1 then x := DisplayText[ItemIndex];
 | 
|---|
 | 143 |           grdDoses.Cells[COL_ROUTE,    ARow] := x + TAB + AResponse.IValue + TAB + AResponse.EValue;
 | 
|---|
 | 144 |           grdDoses.Cells[COL_SCHEDULE, ARow] := IValueFor('SCHEDULE', AnInstance);
 | 
|---|
 | 145 |           x := IValueFor('DAYS', AnInstance);
 | 
|---|
 | 146 | //        if Length(x) > 0 then x := x + ' day(s)';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 147 |           if Length(x) > 0 then x := x + DKLangConstW('fODMedComplex_dayxsx'); //kt added 8/8/2007
 | 
|---|
 | 148 |           grdDoses.Cells[COL_DURATION, ARow] := x + TAB + IValueFor('DAYS', AnInstance);
 | 
|---|
 | 149 |           AnInstance := NextInstance('INSTR', AnInstance);
 | 
|---|
 | 150 |           Inc(ARow);
 | 
|---|
 | 151 |         end; {while AnInstance}
 | 
|---|
 | 152 |       end; {with Responses}
 | 
|---|
 | 153 |     end;
 | 
|---|
 | 154 |     Result := frmODMedComplex.ShowModal = mrOK;
 | 
|---|
 | 155 |     if Result then with frmODMedComplex, grdDoses, Responses do
 | 
|---|
 | 156 |     begin
 | 
|---|
 | 157 |       Clear('INSTR');
 | 
|---|
 | 158 |       Clear('MISC');
 | 
|---|
 | 159 |       Clear('ROUTE');
 | 
|---|
 | 160 |       Clear('SCHEDULE');
 | 
|---|
 | 161 |       Clear('DAYS');
 | 
|---|
 | 162 |       for ARow := 1 to Pred(RowCount) do
 | 
|---|
 | 163 |       begin
 | 
|---|
 | 164 |         if Length(ValFor(VAL_INSTR, ARow)) > 0 then
 | 
|---|
 | 165 |         begin
 | 
|---|
 | 166 |           Update('INSTR',    ARow, ValFor(VAL_INSTR,    ARow), ValFor(VAL_INSTR,    ARow));
 | 
|---|
 | 167 |           if Length(ValFor(VAL_MISC, ARow)) > 0 then
 | 
|---|
 | 168 |             Update('MISC',   ARow, ValFor(VAL_MISC,     ARow), ValFor(VAL_MISC,     ARow));
 | 
|---|
 | 169 |           Update('ROUTE',    ARow, ValFor(VAL_ROUTE,    ARow), ValFor(VAL_ABBROUTE, ARow));
 | 
|---|
 | 170 |           Update('SCHEDULE', ARow, ValFor(VAL_SCHEDULE, ARow), ValFor(COL_SCHEDULE, ARow));
 | 
|---|
 | 171 |           Update('DAYS',     ARow, ValFor(VAL_DAYS,     ARow), ValFor(VAL_DAYS,     ARow));
 | 
|---|
 | 172 |         end; {if Length}
 | 
|---|
 | 173 |       end; {with...for}
 | 
|---|
 | 174 |     end; {if Result}
 | 
|---|
 | 175 |   finally
 | 
|---|
 | 176 |     frmODMedComplex.Release;
 | 
|---|
 | 177 |   end;
 | 
|---|
 | 178 | end;
 | 
|---|
 | 179 | 
 | 
|---|
 | 180 | { General Functions - get & set cell values}
 | 
|---|
 | 181 | 
 | 
|---|
 | 182 | function TfrmODMedComplex.ValFor(FieldID, ARow: Integer): string;
 | 
|---|
 | 183 | { Contents of grid cells is as follows (cells delimited by |, ^ indicates tab char)
 | 
|---|
 | 184 |     InstructionText^INSTR^MISC | RouteText^ROUTE^Abbrev. | SCHEDULE  DurationText^DAYS
 | 
|---|
 | 185 |   Only the first tab piece for each cell is drawn. }
 | 
|---|
 | 186 | begin
 | 
|---|
 | 187 |   Result := '';
 | 
|---|
 | 188 |   if (ARow < 1) or (ARow >= grdDoses.RowCount) then Exit;
 | 
|---|
 | 189 |   with grdDoses do
 | 
|---|
 | 190 |     case FieldID of
 | 
|---|
 | 191 |     COL_INSTRUCT : Result := Piece(Cells[COL_INSTRUCT, ARow], TAB, 1);
 | 
|---|
 | 192 |     COL_ROUTE    : Result := Piece(Cells[COL_ROUTE,    ARow], TAB, 1);
 | 
|---|
 | 193 |     COL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1);
 | 
|---|
 | 194 |     COL_DURATION : Result := Piece(Cells[COL_DURATION, ARow], TAB, 1);
 | 
|---|
 | 195 |     VAL_INSTR    : Result := Piece(Cells[COL_INSTRUCT, ARow], TAB, 2);
 | 
|---|
 | 196 |     VAL_MISC     : Result := Piece(Cells[COL_INSTRUCT, ARow], TAB, 3);
 | 
|---|
 | 197 |     VAL_ROUTE    : Result := Piece(Cells[COL_ROUTE,    ARow], TAB, 2);
 | 
|---|
 | 198 |     VAL_SCHEDULE : Result := Piece(Cells[COL_SCHEDULE, ARow], TAB, 1);
 | 
|---|
 | 199 |     VAL_DAYS     : Result := Piece(Cells[COL_DURATION, ARow], TAB, 2);
 | 
|---|
 | 200 |     VAL_ABBROUTE : Result := Piece(Cells[COL_ROUTE,    ARow], Tab, 3);
 | 
|---|
 | 201 |     end;
 | 
|---|
 | 202 | end;
 | 
|---|
 | 203 | 
 | 
|---|
 | 204 | procedure FindInCombo(const x: string; AComboBox: TORComboBox);
 | 
|---|
 | 205 | var
 | 
|---|
 | 206 |   i, Found: Integer;
 | 
|---|
 | 207 | begin
 | 
|---|
 | 208 |   with AComboBox do
 | 
|---|
 | 209 |   begin
 | 
|---|
 | 210 |     i := 0;
 | 
|---|
 | 211 |     Found := -1;
 | 
|---|
 | 212 |     while (i < Items.Count) and (Found < 0) do
 | 
|---|
 | 213 |     begin
 | 
|---|
 | 214 |       if CompareText(Copy(DisplayText[i], 1, Length(x)), x) = 0 then Found := i;
 | 
|---|
 | 215 |       Inc(i);
 | 
|---|
 | 216 |     end; {while}
 | 
|---|
 | 217 |     if Found > -1 then
 | 
|---|
 | 218 |     begin
 | 
|---|
 | 219 |       ItemIndex := Found;
 | 
|---|
 | 220 |       Application.ProcessMessages;
 | 
|---|
 | 221 |       SelStart  := 1;
 | 
|---|
 | 222 |       SelLength := Length(Items[Found]);
 | 
|---|
 | 223 |     end else
 | 
|---|
 | 224 |     begin
 | 
|---|
 | 225 |       Text := x;
 | 
|---|
 | 226 |       SelStart := Length(x);
 | 
|---|
 | 227 |     end;
 | 
|---|
 | 228 |   end; {with AComboBox}
 | 
|---|
 | 229 | end;
 | 
|---|
 | 230 | 
 | 
|---|
 | 231 | { Form Events }
 | 
|---|
 | 232 | 
 | 
|---|
 | 233 | procedure TfrmODMedComplex.FormCreate(Sender: TObject);
 | 
|---|
 | 234 | begin
 | 
|---|
 | 235 |   inherited;
 | 
|---|
 | 236 |   with grdDoses do
 | 
|---|
 | 237 |   begin
 | 
|---|
 | 238 |     ColWidths[COL_SELECT]   := 12;
 | 
|---|
 | 239 |     ColWidths[COL_INSTRUCT] := 160;
 | 
|---|
 | 240 | //  Cells[COL_INSTRUCT, 0]  := 'Amount';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 241 |     Cells[COL_INSTRUCT, 0]  := DKLangConstW('fODMedComplex_Amount'); //kt added 8/8/2007
 | 
|---|
 | 242 | //  Cells[COL_ROUTE,    0]  := 'Route';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 243 |     Cells[COL_ROUTE,    0]  := DKLangConstW('fODMedComplex_Route'); //kt added 8/8/2007
 | 
|---|
 | 244 | //  Cells[COL_SCHEDULE, 0]  := 'Schedule';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 245 |     Cells[COL_SCHEDULE, 0]  := DKLangConstW('fODMedComplex_Schedule'); //kt added 8/8/2007
 | 
|---|
 | 246 | //  Cells[COL_DURATION, 0]  := 'Duration';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 247 |     Cells[COL_DURATION, 0]  := DKLangConstW('fODMedComplex_Duration'); //kt added 8/8/2007
 | 
|---|
 | 248 |   end;
 | 
|---|
 | 249 |   FDropColumn := -1;
 | 
|---|
 | 250 | end;
 | 
|---|
 | 251 | 
 | 
|---|
 | 252 | { grdDoses events (including cell editors) }
 | 
|---|
 | 253 | 
 | 
|---|
 | 254 | procedure TfrmODMedComplex.grdDosesMouseDown(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 255 |   Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 256 | var
 | 
|---|
 | 257 |   ACol, ARow: Integer;
 | 
|---|
 | 258 | begin
 | 
|---|
 | 259 |   inherited;
 | 
|---|
 | 260 |   grdDoses.MouseToCell(X, Y, ACol, ARow);
 | 
|---|
 | 261 |   if (ARow < 0) or (ACol < 0) then Exit;
 | 
|---|
 | 262 |   if ACol > COL_SELECT then ShowEditor(ACol, ARow, #0) else
 | 
|---|
 | 263 |   begin
 | 
|---|
 | 264 |     grdDoses.Col := COL_INSTRUCT;
 | 
|---|
 | 265 |     grdDoses.Row := ARow;
 | 
|---|
 | 266 |   end;
 | 
|---|
 | 267 | end;
 | 
|---|
 | 268 | 
 | 
|---|
 | 269 | procedure TfrmODMedComplex.grdDosesKeyPress(Sender: TObject; var Key: Char);
 | 
|---|
 | 270 | begin
 | 
|---|
 | 271 |   inherited;
 | 
|---|
 | 272 |   if Key = #13 then ShowEditor(grdDoses.Col, grdDoses.Row, #0);
 | 
|---|
 | 273 |   if Key in [#32..#127] then ShowEditor(grdDoses.Col, grdDoses.Row, Key);
 | 
|---|
 | 274 | end;
 | 
|---|
 | 275 | 
 | 
|---|
 | 276 | procedure TfrmODMedComplex.grdDosesMouseUp(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 277 |   Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 278 | begin
 | 
|---|
 | 279 |   inherited;
 | 
|---|
 | 280 |   case FDropColumn of
 | 
|---|
 | 281 |   COL_INSTRUCT: with cboInstruct do if Items.Count > 0 then DroppedDown := True;
 | 
|---|
 | 282 |   COL_ROUTE:    with cboRoute    do if Items.Count > 0 then DroppedDown := True;
 | 
|---|
 | 283 |   COL_SCHEDULE: with cboSchedule do if Items.Count > 0 then DroppedDown := True;
 | 
|---|
 | 284 |   end;
 | 
|---|
 | 285 |   FDropColumn := -1;
 | 
|---|
 | 286 | end;
 | 
|---|
 | 287 | 
 | 
|---|
 | 288 | procedure TfrmODMedComplex.grdDosesDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
 | 
|---|
 | 289 |   State: TGridDrawState);
 | 
|---|
 | 290 | { only show the first tab piece of the cell }
 | 
|---|
 | 291 | begin
 | 
|---|
 | 292 |   inherited;
 | 
|---|
 | 293 |   grdDoses.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
 | 
|---|
 | 294 |     Piece(grdDoses.Cells[ACol, ARow], TAB, 1));
 | 
|---|
 | 295 | end;
 | 
|---|
 | 296 | 
 | 
|---|
 | 297 | procedure TfrmODMedComplex.ShowEditor(ACol, ARow: Integer; AChar: Char);
 | 
|---|
 | 298 | 
 | 
|---|
 | 299 |   procedure PlaceControl(AControl: TWinControl);
 | 
|---|
 | 300 |   var
 | 
|---|
 | 301 |     ARect: TRect;
 | 
|---|
 | 302 |   begin
 | 
|---|
 | 303 |     with AControl do
 | 
|---|
 | 304 |     begin
 | 
|---|
 | 305 |       ARect := grdDoses.CellRect(ACol, ARow);
 | 
|---|
 | 306 |       SetBounds(ARect.Left + grdDoses.Left + 1,  ARect.Top  + grdDoses.Top + 1,
 | 
|---|
 | 307 |                 ARect.Right - ARect.Left + 1,    ARect.Bottom - ARect.Top + 1);
 | 
|---|
 | 308 |       BringToFront;
 | 
|---|
 | 309 |       Show;
 | 
|---|
 | 310 |       SetFocus;
 | 
|---|
 | 311 |     end;
 | 
|---|
 | 312 |   end;
 | 
|---|
 | 313 | 
 | 
|---|
 | 314 | begin
 | 
|---|
 | 315 |   inherited;
 | 
|---|
 | 316 |   if ARow = 0 then Exit;  // header row
 | 
|---|
 | 317 |   // require initial instruction entry when in last row
 | 
|---|
 | 318 |   with grdDoses do if (ARow = Pred(RowCount)) and (ACol > COL_INSTRUCT) and
 | 
|---|
 | 319 |     (ValFor(VAL_INSTR, ARow) = '') then Exit;
 | 
|---|
 | 320 |   // only allow route when in first row
 | 
|---|
 | 321 |   if (ACol = COL_ROUTE) and (ARow > 1) then Exit;
 | 
|---|
 | 322 |   // display appropriate editor for row & column
 | 
|---|
 | 323 |   case ACol of
 | 
|---|
 | 324 |   COL_INSTRUCT: begin
 | 
|---|
 | 325 |                   // if this is the last row, default the route & schedule to previous row
 | 
|---|
 | 326 |                   if (ARow > 1) and (ARow = Pred(grdDoses.RowCount)) then
 | 
|---|
 | 327 |                   begin
 | 
|---|
 | 328 |                     grdDoses.Cells[COL_INSTRUCT, ARow] := TAB + TAB + ValFor(VAL_MISC, Pred(ARow));
 | 
|---|
 | 329 |                     grdDoses.Cells[COL_ROUTE,    ARow] := grdDoses.Cells[COL_ROUTE,    Pred(ARow)];
 | 
|---|
 | 330 |                     grdDoses.Cells[COL_SCHEDULE, ARow] := grdDoses.Cells[COL_SCHEDULE, Pred(ARow)];
 | 
|---|
 | 331 |                   end;
 | 
|---|
 | 332 |                   // set appropriate value for cboInstruct & btnUnits
 | 
|---|
 | 333 |                   btnUnits.Caption := ValFor(VAL_MISC, ARow);
 | 
|---|
 | 334 |                   pnlInstruct.Tag := ARow;
 | 
|---|
 | 335 |                   if popUnits.Items.Count = 0 then
 | 
|---|
 | 336 |                   begin
 | 
|---|
 | 337 |                     btnUnits.Visible := False;
 | 
|---|
 | 338 |                     cboInstruct.Width := pnlInstruct.Width;
 | 
|---|
 | 339 |                   end;
 | 
|---|
 | 340 |                   PlaceControl(pnlInstruct);
 | 
|---|
 | 341 |                   FDropColumn := COL_INSTRUCT;
 | 
|---|
 | 342 |                   if AChar <> #0
 | 
|---|
 | 343 |                     then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_INSTRUCT)
 | 
|---|
 | 344 |                     else cboInstruct.Text := ValFor(VAL_INSTR, ARow);
 | 
|---|
 | 345 |                 end;
 | 
|---|
 | 346 |   COL_ROUTE:    begin
 | 
|---|
 | 347 |                   // set appropriate value for cboRoute
 | 
|---|
 | 348 |                   cboRoute.SelectByID(ValFor(VAL_ROUTE, ARow));
 | 
|---|
 | 349 |                   if cboRoute.Text = '' then cboRoute.Text := ValFor(COL_ROUTE, ARow);
 | 
|---|
 | 350 |                   cboRoute.Tag := ARow;
 | 
|---|
 | 351 |                   PlaceControl(cboRoute);
 | 
|---|
 | 352 |                   FDropColumn := COL_ROUTE;
 | 
|---|
 | 353 |                   if AChar <> #0 then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_ROUTE);
 | 
|---|
 | 354 |                 end;
 | 
|---|
 | 355 |   COL_SCHEDULE: begin
 | 
|---|
 | 356 |                   // set appropriate value for cboSchedule
 | 
|---|
 | 357 |                   cboSchedule.Tag := ARow;
 | 
|---|
 | 358 |                   PlaceControl(cboSchedule);
 | 
|---|
 | 359 |                   FDropColumn := COL_SCHEDULE;
 | 
|---|
 | 360 |                   if AChar <> #0
 | 
|---|
 | 361 |                     then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_SCHEDULE)
 | 
|---|
 | 362 |                     else cboSchedule.Text := ValFor(COL_SCHEDULE, ARow);
 | 
|---|
 | 363 |                 end;
 | 
|---|
 | 364 |   COL_DURATION: begin
 | 
|---|
 | 365 |                   // set appropriate value for txtDays
 | 
|---|
 | 366 |                   pnlDays.Tag := ARow;
 | 
|---|
 | 367 |                   PlaceControl(pnlDays);
 | 
|---|
 | 368 |                   txtDays.SetFocus;
 | 
|---|
 | 369 |                   if AChar <> #0
 | 
|---|
 | 370 |                     then PostMessage(Handle, UM_DELAYEVENT, Ord(AChar), COL_DURATION)
 | 
|---|
 | 371 |                     else txtDays.Text := ValFor(VAL_DAYS, ARow);
 | 
|---|
 | 372 |                 end;
 | 
|---|
 | 373 |   end; {case ACol}
 | 
|---|
 | 374 | end;
 | 
|---|
 | 375 | 
 | 
|---|
 | 376 | procedure TfrmODMedComplex.UMDelayEvent(var Message: TMessage);
 | 
|---|
 | 377 | { after focusing events are completed for a combobox, set the key the user typed }
 | 
|---|
 | 378 | begin
 | 
|---|
 | 379 |   case Message.LParam of
 | 
|---|
 | 380 |   COL_INSTRUCT : FindInCombo(Chr(Message.WParam), cboInstruct);
 | 
|---|
 | 381 |   COL_ROUTE    : FindInCombo(Chr(Message.WParam), cboRoute);
 | 
|---|
 | 382 |   COL_SCHEDULE : FindInCombo(Chr(Message.WParam), cboSchedule);
 | 
|---|
 | 383 |   COL_DURATION : begin
 | 
|---|
 | 384 |                    txtDays.Text := Chr(Message.WParam);
 | 
|---|
 | 385 |                    txtDays.SelStart := 1;
 | 
|---|
 | 386 |                  end;
 | 
|---|
 | 387 |   end;
 | 
|---|
 | 388 | end;
 | 
|---|
 | 389 | 
 | 
|---|
 | 390 | { Instructions Editor }
 | 
|---|
 | 391 | 
 | 
|---|
 | 392 | procedure TfrmODMedComplex.pnlInstructEnter(Sender: TObject);
 | 
|---|
 | 393 | begin
 | 
|---|
 | 394 |   inherited;
 | 
|---|
 | 395 |   // if this was the last row, create a new last row
 | 
|---|
 | 396 |   if grdDoses.Row = Pred(grdDoses.RowCount) then grdDoses.RowCount := grdDoses.RowCount + 1;
 | 
|---|
 | 397 |   // shift focus to the combobox portion of the instructions panel
 | 
|---|
 | 398 |   cboInstruct.SetFocus;
 | 
|---|
 | 399 | end;
 | 
|---|
 | 400 | 
 | 
|---|
 | 401 | procedure TfrmODMedComplex.pnlInstructExit(Sender: TObject);
 | 
|---|
 | 402 | var
 | 
|---|
 | 403 |   ARow: Integer;
 | 
|---|
 | 404 | begin
 | 
|---|
 | 405 |   inherited;
 | 
|---|
 | 406 |   ARow := pnlInstruct.Tag;
 | 
|---|
 | 407 |   // clear the rest of the row if no instruction has been entered
 | 
|---|
 | 408 |   with grdDoses do if (ARow = Pred(RowCount)) and (cboInstruct.Text = '') then
 | 
|---|
 | 409 |   begin
 | 
|---|
 | 410 |     Cells[COL_INSTRUCT, ARow] := '';
 | 
|---|
 | 411 |     Cells[COL_ROUTE,    ARow] := '';
 | 
|---|
 | 412 |     Cells[COL_SCHEDULE, ARow] := '';
 | 
|---|
 | 413 |     Cells[COL_DURATION, ARow] := '';
 | 
|---|
 | 414 |     Exit;
 | 
|---|
 | 415 |   end;
 | 
|---|
 | 416 |   // save entered information in the cell
 | 
|---|
 | 417 |   grdDoses.Cells[COL_INSTRUCT, ARow] := cboInstruct.Text + ' ' + btnUnits.Caption + TAB +
 | 
|---|
 | 418 |     cboInstruct.Text + TAB + btnUnits.Caption;
 | 
|---|
 | 419 |   pnlInstruct.Tag := -1;
 | 
|---|
 | 420 |   pnlInstruct.Hide;
 | 
|---|
 | 421 | end;
 | 
|---|
 | 422 | 
 | 
|---|
 | 423 | procedure TfrmODMedComplex.btnUnitsClick(Sender: TObject);
 | 
|---|
 | 424 | var
 | 
|---|
 | 425 |   APoint: TPoint;
 | 
|---|
 | 426 | begin
 | 
|---|
 | 427 |   inherited;
 | 
|---|
 | 428 |   APoint := btnUnits.ClientToScreen(Point(0, btnUnits.Height));
 | 
|---|
 | 429 |   popUnits.Popup(APoint.X, APoint.Y);
 | 
|---|
 | 430 | end;
 | 
|---|
 | 431 | 
 | 
|---|
 | 432 | procedure TfrmODMedComplex.UnitClick(Sender: TObject);
 | 
|---|
 | 433 | begin
 | 
|---|
 | 434 |   btnUnits.Caption := TMenuItem(Sender).Caption;
 | 
|---|
 | 435 | end;
 | 
|---|
 | 436 | 
 | 
|---|
 | 437 | { Route Editor }
 | 
|---|
 | 438 | 
 | 
|---|
 | 439 | procedure TfrmODMedComplex.cboRouteClick(Sender: TObject);
 | 
|---|
 | 440 | { force all routes to be the same (until pharmacy changes to accomodate varying routes) }
 | 
|---|
 | 441 | var
 | 
|---|
 | 442 |   i: Integer;
 | 
|---|
 | 443 |   x: string;
 | 
|---|
 | 444 | begin
 | 
|---|
 | 445 |   inherited;
 | 
|---|
 | 446 |   with cboRoute do if ItemIndex > -1
 | 
|---|
 | 447 |     then x := Piece(Items[ItemIndex], U, 3)
 | 
|---|
 | 448 |     else x := cboRoute.Text;
 | 
|---|
 | 449 |   for i := 1 to Pred(grdDoses.RowCount) do
 | 
|---|
 | 450 |     if Length(ValFor(VAL_INSTR, i)) > 0
 | 
|---|
 | 451 |       then grdDoses.Cells[COL_ROUTE, i] := cboRoute.Text + TAB + cboRoute.ItemID + TAB + x;
 | 
|---|
 | 452 | end;
 | 
|---|
 | 453 | 
 | 
|---|
 | 454 | procedure TfrmODMedComplex.cboRouteExit(Sender: TObject);
 | 
|---|
 | 455 | begin
 | 
|---|
 | 456 |   inherited;
 | 
|---|
 | 457 |   cboRouteClick(Self);
 | 
|---|
 | 458 |   cboRoute.Tag := -1;
 | 
|---|
 | 459 |   cboRoute.Hide;
 | 
|---|
 | 460 | end;
 | 
|---|
 | 461 | 
 | 
|---|
 | 462 | { Schedule Editor }
 | 
|---|
 | 463 | 
 | 
|---|
 | 464 | procedure TfrmODMedComplex.cboScheduleExit(Sender: TObject);
 | 
|---|
 | 465 | begin
 | 
|---|
 | 466 |   inherited;
 | 
|---|
 | 467 |   grdDoses.Cells[COL_SCHEDULE, cboSchedule.Tag] := cboSchedule.Text;
 | 
|---|
 | 468 |   cboSchedule.Tag := -1;
 | 
|---|
 | 469 |   cboSchedule.Hide;
 | 
|---|
 | 470 | end;
 | 
|---|
 | 471 | 
 | 
|---|
 | 472 | { Duration Editor }
 | 
|---|
 | 473 | 
 | 
|---|
 | 474 | procedure TfrmODMedComplex.pnlDaysEnter(Sender: TObject);
 | 
|---|
 | 475 | begin
 | 
|---|
 | 476 |   inherited;
 | 
|---|
 | 477 |   txtDays.SetFocus;
 | 
|---|
 | 478 | end;
 | 
|---|
 | 479 | 
 | 
|---|
 | 480 | procedure TfrmODMedComplex.pnlDaysExit(Sender: TObject);
 | 
|---|
 | 481 | var
 | 
|---|
 | 482 |   x: string;
 | 
|---|
 | 483 | begin
 | 
|---|
 | 484 |   inherited;
 | 
|---|
 | 485 |   x := txtDays.Text;
 | 
|---|
 | 486 | //if Length(x) > 0 then x := x + ' day(s)';  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 487 |   if Length(x) > 0 then x := x + DKLangConstW('fODMedComplex_dayxsx'); //kt added 8/8/2007
 | 
|---|
 | 488 |   x := x + TAB + txtDays.Text;
 | 
|---|
 | 489 |   grdDoses.Cells[COL_DURATION, pnlDays.Tag] := x;
 | 
|---|
 | 490 |   pnlDays.Tag := -1;
 | 
|---|
 | 491 |   pnlDays.Hide;
 | 
|---|
 | 492 | end;
 | 
|---|
 | 493 | 
 | 
|---|
 | 494 | procedure TfrmODMedComplex.txtDaysChange(Sender: TObject);
 | 
|---|
 | 495 | begin
 | 
|---|
 | 496 |   inherited;
 | 
|---|
 | 497 |   if txtDays.Text = '0' then txtDays.Text := '';
 | 
|---|
 | 498 | end;
 | 
|---|
 | 499 | 
 | 
|---|
 | 500 | { Command Buttons }
 | 
|---|
 | 501 | 
 | 
|---|
 | 502 | procedure TfrmODMedComplex.cmdInsertClick(Sender: TObject);
 | 
|---|
 | 503 | var
 | 
|---|
 | 504 |   i: Integer;
 | 
|---|
 | 505 |   x0, x1, x2: string;
 | 
|---|
 | 506 | begin
 | 
|---|
 | 507 |   inherited;
 | 
|---|
 | 508 |   cmdInsert.SetFocus;                            // make sure exit events for editors fire
 | 
|---|
 | 509 |   with grdDoses do
 | 
|---|
 | 510 |   begin
 | 
|---|
 | 511 |     if Row < 1 then Exit;
 | 
|---|
 | 512 |     x0 := TAB + TAB + ValFor(VAL_MISC, Row);
 | 
|---|
 | 513 |     x1 := grdDoses.Cells[COL_ROUTE,    Row];
 | 
|---|
 | 514 |     x2 := grdDoses.Cells[COL_SCHEDULE, Row];
 | 
|---|
 | 515 |     RowCount := RowCount + 1;
 | 
|---|
 | 516 |     { move rows down }
 | 
|---|
 | 517 |     for i := Pred(RowCount) downto Succ(Row) do Rows[i] := Rows[i-1];
 | 
|---|
 | 518 |     Rows[Row].Clear;
 | 
|---|
 | 519 |     Cells[COL_INSTRUCT, Row] := x0;
 | 
|---|
 | 520 |     Cells[COL_ROUTE,    Row] := x1;
 | 
|---|
 | 521 |     Cells[COL_SCHEDULE, Row] := x2;
 | 
|---|
 | 522 |     Col := COL_INSTRUCT;
 | 
|---|
 | 523 |     ShowEditor(COL_INSTRUCT, Row, #0);
 | 
|---|
 | 524 |   end;
 | 
|---|
 | 525 | end;
 | 
|---|
 | 526 | 
 | 
|---|
 | 527 | procedure TfrmODMedComplex.cmdRemoveClick(Sender: TObject);
 | 
|---|
 | 528 | var
 | 
|---|
 | 529 |   i: Integer;
 | 
|---|
 | 530 | begin
 | 
|---|
 | 531 |   inherited;
 | 
|---|
 | 532 |   cmdRemove.SetFocus;                            // make sure exit events for editors fire
 | 
|---|
 | 533 |   with grdDoses do if (Row > 0) and (RowCount > 2) then
 | 
|---|
 | 534 |   begin
 | 
|---|
 | 535 |     { move rows up }
 | 
|---|
 | 536 |     for i := Row to RowCount - 2 do Rows[i] := Rows[i+1];
 | 
|---|
 | 537 |     RowCount := RowCount - 1;
 | 
|---|
 | 538 |     Rows[RowCount].Clear;
 | 
|---|
 | 539 |   end;
 | 
|---|
 | 540 | end;
 | 
|---|
 | 541 | 
 | 
|---|
 | 542 | procedure TfrmODMedComplex.Validate(var AnErrMsg: string);
 | 
|---|
 | 543 | var
 | 
|---|
 | 544 |   i: Integer;
 | 
|---|
 | 545 |   RouteID, RouteAbbr: string;
 | 
|---|
 | 546 | 
 | 
|---|
 | 547 |   procedure SetError(const x: string);
 | 
|---|
 | 548 |   begin
 | 
|---|
 | 549 |     if Length(AnErrMsg) > 0 then AnErrMsg := AnErrMsg + CRLF;
 | 
|---|
 | 550 |     AnErrMsg := AnErrMsg + x;
 | 
|---|
 | 551 |   end;
 | 
|---|
 | 552 | 
 | 
|---|
 | 553 | begin
 | 
|---|
 | 554 |   SetupVars;  //kt added 8/8/2007 to replace constants with vars.
 | 
|---|
 | 555 |   AnErrMsg := '';
 | 
|---|
 | 556 |   with grdDoses do for i := 1 to Pred(RowCount) do
 | 
|---|
 | 557 |   begin
 | 
|---|
 | 558 |     if Length(ValFor(VAL_INSTR, i)) > 0 then
 | 
|---|
 | 559 |     begin
 | 
|---|
 | 560 |       if Pos('&', cboInstruct.Text) > 0 then SetError(IntToStr(i) + TX_NO_AMPER);
 | 
|---|
 | 561 |       if ValFor(COL_ROUTE,    i) = ''   then SetError(IntToStr(i) + TX_NO_ROUTE);
 | 
|---|
 | 562 |       if ValFor(COL_SCHEDULE, i) = ''   then SetError(IntToStr(i) + TX_NO_SCHED);
 | 
|---|
 | 563 |       if (ValFor(VAL_ROUTE,    i) = '') and (Length(ValFor(COL_ROUTE, i)) > 0) then
 | 
|---|
 | 564 |       begin
 | 
|---|
 | 565 |         LookupRoute(ValFor(COL_ROUTE, i), RouteID, RouteAbbr);
 | 
|---|
 | 566 |         if RouteID = '0'
 | 
|---|
 | 567 |           then SetError(ValFor(COL_ROUTE, i) + TX_NF_ROUTE)
 | 
|---|
 | 568 |           else Cells[COL_ROUTE, i] := ValFor(COL_ROUTE, i) + TAB + RouteID + TAB + RouteAbbr;
 | 
|---|
 | 569 |       end; {if ValFor}
 | 
|---|
 | 570 |     end; {if Length}
 | 
|---|
 | 571 |   end; {with grdDoses...for i}
 | 
|---|
 | 572 | end;
 | 
|---|
 | 573 | 
 | 
|---|
 | 574 | procedure TfrmODMedComplex.cmdOKClick(Sender: TObject);
 | 
|---|
 | 575 | var
 | 
|---|
 | 576 |   ErrMsg: string;
 | 
|---|
 | 577 | begin
 | 
|---|
 | 578 |   inherited;
 | 
|---|
 | 579 |   cmdOK.SetFocus;                                // make sure exit events for editors fire
 | 
|---|
 | 580 |   Validate(ErrMsg);
 | 
|---|
 | 581 | //if ShowMsgOn(Length(ErrMsg) > 0, ErrMsg, 'Error') then Exit;  <-- original line.  //kt 8/8/2007
 | 
|---|
 | 582 |   if ShowMsgOn(Length(ErrMsg) > 0, ErrMsg, DKLangConstW('fODMedComplex_Error')) then Exit; //kt added 8/8/2007
 | 
|---|
 | 583 |   ModalResult := mrOK;
 | 
|---|
 | 584 | end;
 | 
|---|
 | 585 | 
 | 
|---|
 | 586 | procedure TfrmODMedComplex.cmdCancelClick(Sender: TObject);
 | 
|---|
 | 587 | begin
 | 
|---|
 | 588 |   inherited;
 | 
|---|
 | 589 |   Close;
 | 
|---|
 | 590 | end;
 | 
|---|
 | 591 | 
 | 
|---|
 | 592 | { Test Stuff }
 | 
|---|
 | 593 | 
 | 
|---|
 | 594 | end.
 | 
|---|