| [459] | 1 | unit uCaseTree;
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | interface
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | uses SysUtils, Classes, ORNet, ORFn, rCore, uCore, uConst, ORCtrls, ComCtrls, uSurgery, rSurgery;
 | 
|---|
 | 6 | 
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | type
 | 
|---|
 | 9 |   PCaseTreeObject = ^TCaseTreeObject;
 | 
|---|
 | 10 |   TCaseTreeObject = record
 | 
|---|
 | 11 |     // used for both types of node
 | 
|---|
 | 12 |     CaseID         : string;
 | 
|---|
 | 13 |     NodeText       : string;                  //Title, Location, Author (depends on node type)
 | 
|---|
 | 14 |     ImageCount     : integer;                 //Number of images
 | 
|---|
 | 15 |     DocHasChildren : string;                  //Has children  (+)
 | 
|---|
 | 16 |     DocParent      : string;                  //Parent document, or context
 | 
|---|
 | 17 |     // used for Case nodes only
 | 
|---|
 | 18 |     OperativeProc  : string;
 | 
|---|
 | 19 |     IsNonORProc    : boolean;
 | 
|---|
 | 20 |     SurgeryDate    : string;
 | 
|---|
 | 21 |     Surgeon        : string;
 | 
|---|
 | 22 |     // used for document nodes only
 | 
|---|
 | 23 |     DocID          : string ;                 //Document IEN
 | 
|---|
 | 24 |     DocDate        : string;                  //Formatted date of document
 | 
|---|
 | 25 |     DocTitle       : string;                  //Document Title Text
 | 
|---|
 | 26 |     VisitDate      : string;                  //ADM/VIS: date;FMDate
 | 
|---|
 | 27 |     DocFMDate      : string;                  //FM date of document
 | 
|---|
 | 28 |     Author         : string;                  //DUZ;Author name
 | 
|---|
 | 29 |     PkgRef         : string;                  //IEN;Package
 | 
|---|
 | 30 |     Location       : string;                  //Location name
 | 
|---|
 | 31 |     Status         : string;                  //Status
 | 
|---|
 | 32 |     Subject        : string;                  //Subject
 | 
|---|
 | 33 |     // not currently used
 | 
|---|
 | 34 |     OrderID        : string;                  //Order file IEN (consults only, for now)
 | 
|---|
 | 35 |     OrderByTitle   : boolean;                 //Within cases, order docs by title, not date
 | 
|---|
 | 36 |   end;
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | // Procedures for document treeviews/listviews
 | 
|---|
 | 39 | procedure CreateListItemsForCaseTree(Dest, Source: TStrings; Context: integer; GroupBy: string;
 | 
|---|
 | 40 |           Ascending: boolean);
 | 
|---|
 | 41 | procedure BuildCaseTree(CaseList: TStrings; const Parent: string; Tree: TORTreeView; Node: TORTreeNode;
 | 
|---|
 | 42 |           CaseContext: TSurgCaseContext);
 | 
|---|
 | 43 | procedure SetCaseTreeNodeImagesAndFormatting(Node: TORTreeNode; CurrentContext: TSurgCaseContext);
 | 
|---|
 | 44 | procedure SetImageFlag(ANode: TORTreeNode);
 | 
|---|
 | 45 | procedure ResetCaseTreeObjectStrings(AnObject: PCaseTreeObject);
 | 
|---|
 | 46 | procedure KillCaseTreeObjects(TreeView: TORTreeView);
 | 
|---|
 | 47 | procedure KillCaseTreeNode(ANode: TTreeNode);
 | 
|---|
 | 48 | procedure RemoveParentsWithNoChildren(Tree: TTreeView; Context: TSurgCaseContext);
 | 
|---|
 | 49 | function  MakeCaseTreeObject(x: string): PCaseTreeObject;
 | 
|---|
 | 50 | 
 | 
|---|
 | 51 | implementation
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | (*uses
 | 
|---|
 | 54 |   fRptBox;*)
 | 
|---|
 | 55 | 
 | 
|---|
 | 56 | {==============================================================
 | 
|---|
 | 57 | RPC [SURGERY CASES BY CONTEXT] returns
 | 
|---|
 | 58 | the following string '^' pieces:
 | 
|---|
 | 59 | ===============================================================
 | 
|---|
 | 60 | CASE #^Operative Procedure^Date/Time of Operation^Surgeon^^^^^^^^^+^Context         ***NEEDS TO BE FIXED***
 | 
|---|
 | 61 | IEN NIR^TITLE^REF DATE/TIME^PT ID^AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 62 | IEN AR^TITLE^REF DATE/TIME^PT ID^AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 63 | IEN OS^TITLE^REF DATE/TIME^PT ID^AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 64 | IEN Addendum^TITLE^REF DATE/TIME^PT ID^AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^^IEN of Parent Document*)
 | 
|---|
 | 65 | 
 | 
|---|
 | 66 | ===============================================================}
 | 
|---|
 | 67 | 
 | 
|---|
 | 68 | procedure CreateListItemsForCaseTree(Dest, Source: TStrings; Context: integer; GroupBy: string;
 | 
|---|
 | 69 |           Ascending: Boolean);
 | 
|---|
 | 70 | const
 | 
|---|
 | 71 |   NO_MATCHES = '^No Surgery Cases Found^^^^^^^^^^^%^0';
 | 
|---|
 | 72 | var
 | 
|---|
 | 73 |   i: Integer;
 | 
|---|
 | 74 |   x, x1, x2, x3, MyParent, MyType: string;
 | 
|---|
 | 75 |   AList, SrcList: TStringList;
 | 
|---|
 | 76 | begin
 | 
|---|
 | 77 |   AList := TStringList.Create;
 | 
|---|
 | 78 |   SrcList := TStringList.Create;
 | 
|---|
 | 79 |   try
 | 
|---|
 | 80 |     //ReportBox(Source, '', True);
 | 
|---|
 | 81 |     SrcList.Assign(Source);
 | 
|---|
 | 82 |     with SrcList do
 | 
|---|
 | 83 |       begin
 | 
|---|
 | 84 |         if (Count = 1) and (Piece(SrcList[0], U, 1) = '-1') then
 | 
|---|
 | 85 |           begin
 | 
|---|
 | 86 |             Dest.Insert(0, IntToStr(Context) + NO_MATCHES);
 | 
|---|
 | 87 |             Exit;
 | 
|---|
 | 88 |           end;
 | 
|---|
 | 89 |         for i := 0 to Count - 1 do
 | 
|---|
 | 90 |           begin
 | 
|---|
 | 91 |             x := Strings[i];
 | 
|---|
 | 92 |             if Piece(x, U, 10) <> '' then      // if item is a note, and is missing information
 | 
|---|
 | 93 |               begin
 | 
|---|
 | 94 |                 if Piece(x, U, 2) = '' then
 | 
|---|
 | 95 |                   SetPiece(x, U, 2, '** No title **');
 | 
|---|
 | 96 |                 if Piece(x, U, 6) = '' then
 | 
|---|
 | 97 |                   SetPiece(x, U, 6, '** No location **');
 | 
|---|
 | 98 |                 if Piece(Piece(x, U, 5), ';', 3) = '' then
 | 
|---|
 | 99 |                   SetPiece(x, U, 5, '0;** No Author **;** No Author **');
 | 
|---|
 | 100 |               end;
 | 
|---|
 | 101 |             MyParent   := Piece(x, U, 14);
 | 
|---|
 | 102 |             if GroupBy <> '' then case GroupBy[1] of
 | 
|---|
 | 103 |               'D':  begin
 | 
|---|
 | 104 |                       x2 := Piece(x, U, 3);                          // Proc date (FM)
 | 
|---|
 | 105 |                       if x2 = '' then
 | 
|---|
 | 106 |                         begin
 | 
|---|
 | 107 |                           x2 := '** No Date **';
 | 
|---|
 | 108 |                           x1 := '** No Date **';
 | 
|---|
 | 109 |                         end
 | 
|---|
 | 110 |                       else
 | 
|---|
 | 111 |                         x1 := FormatFMDateTime('mmm dd,yyyy', StrToFloat(x2));  // Proc date
 | 
|---|
 | 112 |                       if MyParent = IntToStr(Context) then
 | 
|---|
 | 113 |                         SetPiece(x, U, 14, MyParent + x2);
 | 
|---|
 | 114 |                       x3 := x2 + U + MixedCase(x1) + U + IntToStr(Context);
 | 
|---|
 | 115 |                       if (AList.IndexOf(x3) = -1) then AList.Add(x3);
 | 
|---|
 | 116 |                     end;
 | 
|---|
 | 117 |               'P':  begin
 | 
|---|
 | 118 |                       x1 := Piece(x, U, 2);
 | 
|---|
 | 119 |                       if x1 = '' then x1 := '** No Procedure **';
 | 
|---|
 | 120 |                       if MyParent = IntToStr(Context) then
 | 
|---|
 | 121 |                         SetPiece(x, U, 14, MyParent + x1);
 | 
|---|
 | 122 |                       x3 := x1 + U + MixedCase(x1) + U + IntToStr(Context);
 | 
|---|
 | 123 |                       if (AList.IndexOf(x3) = -1) then AList.Add(x3);
 | 
|---|
 | 124 |                     end;
 | 
|---|
 | 125 |               'S':  begin
 | 
|---|
 | 126 |                       x1 := Piece(Piece(x, U, 4), ';', 2);
 | 
|---|
 | 127 |                       if x1 = '' then x1 := '** No Surgeon **';
 | 
|---|
 | 128 |                       if MyParent = IntToStr(Context) then
 | 
|---|
 | 129 |                         SetPiece(x, U, 14, MyParent + x1);
 | 
|---|
 | 130 |                       x3 := x1 + U + MixedCase(x1) + U + IntToStr(Context);
 | 
|---|
 | 131 |                       if (AList.IndexOf(x3) = -1) then AList.Add(x3);
 | 
|---|
 | 132 |                     end;
 | 
|---|
 | 133 |               'T':  begin
 | 
|---|
 | 134 |                       if MyParent = IntToStr(Context) then
 | 
|---|
 | 135 |                       begin
 | 
|---|
 | 136 |                         if Piece(x, U, 6) = '1' then
 | 
|---|
 | 137 |                           MyType := 'Non-OR Procedures'
 | 
|---|
 | 138 |                         else
 | 
|---|
 | 139 |                           MyType := 'Operations';
 | 
|---|
 | 140 |                         SetPiece(x, U, 14, MyParent + MyType);
 | 
|---|
 | 141 |                         x3 := MyType + U + MyType + U + IntToStr(Context);
 | 
|---|
 | 142 |                         if (AList.IndexOf(x3) = -1) then AList.Add(x3);
 | 
|---|
 | 143 |                       end;
 | 
|---|
 | 144 |                     end;
 | 
|---|
 | 145 |             end;
 | 
|---|
 | 146 |             Dest.Add(x);
 | 
|---|
 | 147 |           end; {for}
 | 
|---|
 | 148 |         SortByPiece(TStringList(Dest), U, 3);
 | 
|---|
 | 149 |         if not Ascending then InvertStringList(TStringList(Dest));
 | 
|---|
 | 150 |         Dest.Insert(0, IntToStr(Context) + '^' + SG_TV_TEXT + '^^^^^^^^^^^%^0');
 | 
|---|
 | 151 |         Alist.Sort;
 | 
|---|
 | 152 |         if Ascending or (CharAt(GroupBy, 1) = 'T') then InvertStringList(AList);   // operations before non-OR procs
 | 
|---|
 | 153 |         for i := 0 to AList.Count-1 do
 | 
|---|
 | 154 |           Dest.Insert(0, IntToStr(Context) + Piece(AList[i], U, 1) + '^' + Piece(AList[i], U, 2) + '^^^^^^^^^^^%^' + Piece(AList[i], U, 3));
 | 
|---|
 | 155 |       end;
 | 
|---|
 | 156 |       //ReportBox(Dest, '', True);
 | 
|---|
 | 157 |   finally
 | 
|---|
 | 158 |     AList.Free;
 | 
|---|
 | 159 |     SrcList.Free;
 | 
|---|
 | 160 |   end;
 | 
|---|
 | 161 | end;
 | 
|---|
 | 162 | 
 | 
|---|
 | 163 | procedure BuildCaseTree(CaseList: TStrings; const Parent: string; Tree: TORTreeView; Node: TORTreeNode;
 | 
|---|
 | 164 |           CaseContext: TSurgCaseContext);
 | 
|---|
 | 165 | var
 | 
|---|
 | 166 |   MyID, MyParent, Name: string;
 | 
|---|
 | 167 |   i: Integer;
 | 
|---|
 | 168 |   ChildNode, tmpNode: TORTreeNode;
 | 
|---|
 | 169 |   CaseHasChildren: Boolean;
 | 
|---|
 | 170 |   AnObject: PCaseTreeObject;
 | 
|---|
 | 171 | begin
 | 
|---|
 | 172 |   with CaseList do for i := 0 to Count - 1 do
 | 
|---|
 | 173 |     begin
 | 
|---|
 | 174 |       tmpNode := nil;
 | 
|---|
 | 175 |       MyParent := Piece(Strings[i], U, 14);
 | 
|---|
 | 176 |       if (MyParent = Parent) then
 | 
|---|
 | 177 |         begin
 | 
|---|
 | 178 |           MyID := Piece(Strings[i], U, 1);
 | 
|---|
 | 179 |           if Piece(Strings[i], U, 13) = '%' then
 | 
|---|
 | 180 |              Name := Piece(Strings[i], U, 2)
 | 
|---|
 | 181 |           else if Piece(Strings[i], U, 10) = '' then
 | 
|---|
 | 182 |              Name := MakeSurgeryCaseDisplayText(Strings[i])
 | 
|---|
 | 183 |           else
 | 
|---|
 | 184 |              Name := MakeSurgeryReportDisplayText(Strings[i]);
 | 
|---|
 | 185 |           CaseHasChildren := (Piece(Strings[i], U, 13) <> '');
 | 
|---|
 | 186 |           if Node <> nil then if Node.HasChildren then
 | 
|---|
 | 187 |             tmpNode := Tree.FindPieceNode(MyID, 1, U, Node);
 | 
|---|
 | 188 |           if (tmpNode <> nil) and tmpNode.HasAsParent(Node) then
 | 
|---|
 | 189 |             Continue
 | 
|---|
 | 190 |           else
 | 
|---|
 | 191 |             begin
 | 
|---|
 | 192 |               AnObject := MakeCaseTreeObject(Strings[i]);
 | 
|---|
 | 193 |               ChildNode := TORTreeNode(Tree.Items.AddChildObject(TORTreeNode(Node), Name, AnObject));
 | 
|---|
 | 194 |               ChildNode.StringData := Strings[i];
 | 
|---|
 | 195 |               SetCaseTreeNodeImagesAndFormatting(ChildNode, CaseContext);
 | 
|---|
 | 196 |               if CaseHasChildren then BuildCaseTree(CaseList, MyID, Tree, ChildNode, CaseContext);
 | 
|---|
 | 197 |             end;
 | 
|---|
 | 198 |         end;
 | 
|---|
 | 199 |     end;
 | 
|---|
 | 200 | end;
 | 
|---|
 | 201 | 
 | 
|---|
 | 202 | procedure SetCaseTreeNodeImagesAndFormatting(Node: TORTreeNode; CurrentContext: TSurgCaseContext);
 | 
|---|
 | 203 | var
 | 
|---|
 | 204 |   CaseNode: TORTreeNode;
 | 
|---|
 | 205 |   i: integer;
 | 
|---|
 | 206 | (*  IMG_SURG_BLANK             = 0;
 | 
|---|
 | 207 |     IMG_SURG_TOP_LEVEL         = 1;
 | 
|---|
 | 208 |     IMG_SURG_GROUP_SHUT        = 2;
 | 
|---|
 | 209 |     IMG_SURG_GROUP_OPEN        = 3;
 | 
|---|
 | 210 |     IMG_SURG_CASE_EMPTY        = 4;
 | 
|---|
 | 211 |     IMG_SURG_CASE_SHUT         = 5;
 | 
|---|
 | 212 |     IMG_SURG_CASE_OPEN         = 6;
 | 
|---|
 | 213 |     IMG_SURG_RPT_SINGLE        = 7;
 | 
|---|
 | 214 |     IMG_SURG_RPT_ADDM          = 8;
 | 
|---|
 | 215 |     IMG_SURG_ADDENDUM          = 9;
 | 
|---|
 | 216 |     IMG_SURG_NON_OR_CASE_EMPTY = 10;
 | 
|---|
 | 217 |     IMG_SURG_NON_OR_CASE_SHUT  = 11;
 | 
|---|
 | 218 |     IMG_SURG_NON_OR_CASE_OPEN  = 12;
 | 
|---|
 | 219 | *)
 | 
|---|
 | 220 | begin
 | 
|---|
 | 221 |   with Node, PCaseTreeObject(Node.Data)^ do
 | 
|---|
 | 222 |     begin
 | 
|---|
 | 223 |       i := Pos('*', DocTitle);
 | 
|---|
 | 224 |       if i > 0 then i := i + 1 else i := 0;
 | 
|---|
 | 225 |       if (Copy(DocTitle, i + 1, 8) = 'Addendum') then
 | 
|---|
 | 226 |         ImageIndex := IMG_SURG_ADDENDUM
 | 
|---|
 | 227 |       else if (DocHasChildren = '') then
 | 
|---|
 | 228 |         begin
 | 
|---|
 | 229 |           if PkgRef = '' then
 | 
|---|
 | 230 |             begin
 | 
|---|
 | 231 |               if IsNonORProc then
 | 
|---|
 | 232 |                 ImageIndex := IMG_SURG_NON_OR_CASE_EMPTY
 | 
|---|
 | 233 |               else
 | 
|---|
 | 234 |                 ImageIndex := IMG_SURG_CASE_EMPTY;
 | 
|---|
 | 235 |             end
 | 
|---|
 | 236 |           else
 | 
|---|
 | 237 |             ImageIndex := IMG_SURG_RPT_SINGLE;
 | 
|---|
 | 238 |         end
 | 
|---|
 | 239 |       else if DocParent = '0' then
 | 
|---|
 | 240 |         begin
 | 
|---|
 | 241 |           ImageIndex    := IMG_SURG_TOP_LEVEL;
 | 
|---|
 | 242 |           SelectedIndex := IMG_SURG_TOP_LEVEL;
 | 
|---|
 | 243 |           StateIndex := -1;
 | 
|---|
 | 244 |           with CurrentContext, Node do
 | 
|---|
 | 245 |             if GroupBy <> '' then
 | 
|---|
 | 246 |               case GroupBy[1] of
 | 
|---|
 | 247 |                 'P': Text := SG_TV_TEXT + ' by Procedure';        
 | 
|---|
 | 248 |                 'D': Text := SG_TV_TEXT + ' by Surgery Date';
 | 
|---|
 | 249 |                 'S': Text := SG_TV_TEXT + ' by Surgeon';
 | 
|---|
 | 250 |                 'T': Text := SG_TV_TEXT + ' by Type';
 | 
|---|
 | 251 |               end
 | 
|---|
 | 252 |             else Text := SG_TV_TEXT;
 | 
|---|
 | 253 |         end
 | 
|---|
 | 254 |       else
 | 
|---|
 | 255 |         case DocHasChildren[1] of
 | 
|---|
 | 256 |           '+': if PkgRef <> '' then
 | 
|---|
 | 257 |                  ImageIndex := IMG_SURG_RPT_ADDM
 | 
|---|
 | 258 |                else
 | 
|---|
 | 259 |                  begin
 | 
|---|
 | 260 |                    if IsNonORProc then
 | 
|---|
 | 261 |                      ImageIndex := IMG_SURG_NON_OR_CASE_SHUT
 | 
|---|
 | 262 |                    else
 | 
|---|
 | 263 |                      ImageIndex := IMG_SURG_CASE_SHUT;
 | 
|---|
 | 264 |                  end;
 | 
|---|
 | 265 |           '%': begin
 | 
|---|
 | 266 |                  StateIndex := -1;
 | 
|---|
 | 267 |                  ImageIndex    := IMG_SURG_GROUP_SHUT;
 | 
|---|
 | 268 |                  SelectedIndex := IMG_SURG_GROUP_OPEN;
 | 
|---|
 | 269 |                end;
 | 
|---|
 | 270 |         end;
 | 
|---|
 | 271 |       SelectedIndex := ImageIndex;
 | 
|---|
 | 272 |       SetImageFlag(Node);
 | 
|---|
 | 273 |       CaseNode := TORTreeView(Node.TreeView).FindPieceNode(CaseID, 1, U, nil);
 | 
|---|
 | 274 |       if CaseNode <> nil then
 | 
|---|
 | 275 |         begin
 | 
|---|
 | 276 |           PCaseTreeObject(CaseNode.Data)^.ImageCount := PCaseTreeObject(CaseNode.Data)^.ImageCount + ImageCount;
 | 
|---|
 | 277 |           SetImageFlag(CaseNode);
 | 
|---|
 | 278 |         end;
 | 
|---|
 | 279 |     end;
 | 
|---|
 | 280 | end;
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 | procedure SetImageFlag(ANode: TORTreeNode);
 | 
|---|
 | 283 | begin
 | 
|---|
 | 284 |   with ANode, PCaseTreeObject(ANode.Data)^ do
 | 
|---|
 | 285 |     begin
 | 
|---|
 | 286 |       if (ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_OPEN, IMG_SURG_GROUP_SHUT]) then
 | 
|---|
 | 287 |         StateIndex := IMG_NO_IMAGES
 | 
|---|
 | 288 |       else
 | 
|---|
 | 289 |         begin
 | 
|---|
 | 290 |           if ImageCount > 0 then
 | 
|---|
 | 291 |             StateIndex := IMG_1_IMAGE
 | 
|---|
 | 292 |           else if ImageCount = 0 then
 | 
|---|
 | 293 |             StateIndex := IMG_NO_IMAGES
 | 
|---|
 | 294 |           else if ImageCount = -1 then
 | 
|---|
 | 295 |             StateIndex := IMG_IMAGES_HIDDEN;
 | 
|---|
 | 296 |         end;
 | 
|---|
 | 297 | (*      else
 | 
|---|
 | 298 |         case ImageCount of
 | 
|---|
 | 299 |           0: StateIndex := IMG_NO_IMAGES;
 | 
|---|
 | 300 |           1: StateIndex := IMG_1_IMAGE;
 | 
|---|
 | 301 |           2: StateIndex := IMG_2_IMAGES;
 | 
|---|
 | 302 |         else
 | 
|---|
 | 303 |           StateIndex := IMG_MANY_IMAGES;
 | 
|---|
 | 304 |         end;*)
 | 
|---|
 | 305 |       if (Parent <> nil) and
 | 
|---|
 | 306 |          (Parent.ImageIndex in [IMG_SURG_CASE_SHUT, IMG_SURG_CASE_OPEN, IMG_SURG_RPT_ADDM,
 | 
|---|
 | 307 |                                 IMG_SURG_NON_OR_CASE_SHUT, IMG_SURG_NON_OR_CASE_OPEN ]) and
 | 
|---|
 | 308 |          (StateIndex in [IMG_1_IMAGE, IMG_IMAGES_HIDDEN]) then
 | 
|---|
 | 309 |          begin
 | 
|---|
 | 310 |            Parent.StateIndex := IMG_CHILD_HAS_IMAGES;
 | 
|---|
 | 311 |          end;
 | 
|---|
 | 312 |     end;
 | 
|---|
 | 313 | end;
 | 
|---|
 | 314 | 
 | 
|---|
 | 315 | procedure ResetCaseTreeObjectStrings(AnObject: PCaseTreeObject);
 | 
|---|
 | 316 | begin
 | 
|---|
 | 317 |   with AnObject^ do
 | 
|---|
 | 318 |     begin
 | 
|---|
 | 319 |       CaseID         := '';
 | 
|---|
 | 320 |       OperativeProc  := '';
 | 
|---|
 | 321 |       SurgeryDate    := '';
 | 
|---|
 | 322 |       Surgeon        := '';
 | 
|---|
 | 323 |       DocID          := '';
 | 
|---|
 | 324 |       DocDate        := '';
 | 
|---|
 | 325 |       DocTitle       := '';
 | 
|---|
 | 326 |       NodeText       := '';
 | 
|---|
 | 327 |       VisitDate      := '';
 | 
|---|
 | 328 |       DocFMDate      := '';
 | 
|---|
 | 329 |       DocHasChildren := '';
 | 
|---|
 | 330 |       DocParent      := '';
 | 
|---|
 | 331 |       Author         := '';
 | 
|---|
 | 332 |       PkgRef         := '';
 | 
|---|
 | 333 |       Location       := '';
 | 
|---|
 | 334 |       Status         := '';
 | 
|---|
 | 335 |       Subject        := '';
 | 
|---|
 | 336 |       OrderID        := '';
 | 
|---|
 | 337 |     end;
 | 
|---|
 | 338 | end;
 | 
|---|
 | 339 | 
 | 
|---|
 | 340 | procedure KillCaseTreeObjects(TreeView: TORTreeView);
 | 
|---|
 | 341 | var
 | 
|---|
 | 342 |   i: integer;
 | 
|---|
 | 343 | begin
 | 
|---|
 | 344 |   with TreeView do
 | 
|---|
 | 345 |     for i := 0 to Items.Count-1 do
 | 
|---|
 | 346 |     begin
 | 
|---|
 | 347 |       if(Assigned(Items[i].Data)) then
 | 
|---|
 | 348 |         begin
 | 
|---|
 | 349 |           ResetCaseTreeObjectStrings(PCaseTreeObject(Items[i].Data));
 | 
|---|
 | 350 |           Dispose(PCaseTreeObject(Items[i].Data));
 | 
|---|
 | 351 |           Items[i].Data := nil;
 | 
|---|
 | 352 |         end;
 | 
|---|
 | 353 |     end;
 | 
|---|
 | 354 | end;
 | 
|---|
 | 355 | 
 | 
|---|
 | 356 | procedure KillCaseTreeNode(ANode: TTreeNode);
 | 
|---|
 | 357 | begin
 | 
|---|
 | 358 |   if(Assigned(ANode.Data)) then
 | 
|---|
 | 359 |     begin
 | 
|---|
 | 360 |       ResetCaseTreeObjectStrings(PCaseTreeObject(ANode.Data));
 | 
|---|
 | 361 |       Dispose(PCaseTreeObject(ANode.Data));
 | 
|---|
 | 362 |       ANode.Data := nil;
 | 
|---|
 | 363 |     end;
 | 
|---|
 | 364 |   ANode.Owner.Delete(ANode);
 | 
|---|
 | 365 | end;
 | 
|---|
 | 366 | 
 | 
|---|
 | 367 | procedure RemoveParentsWithNoChildren(Tree: TTreeView; Context: TSurgCaseContext);
 | 
|---|
 | 368 | var
 | 
|---|
 | 369 |   n: integer;
 | 
|---|
 | 370 | begin
 | 
|---|
 | 371 |   with Tree do
 | 
|---|
 | 372 |     for n := Items.Count - 1 downto 0 do
 | 
|---|
 | 373 |       if (Items[n].ImageIndex in  [IMG_SURG_GROUP_SHUT, IMG_SURG_GROUP_OPEN]) then
 | 
|---|
 | 374 |         begin
 | 
|---|
 | 375 |           if (not Items[n].HasChildren) then
 | 
|---|
 | 376 |              KillCaseTreeNode(Items[n]);
 | 
|---|
 | 377 |         end;
 | 
|---|
 | 378 | end;
 | 
|---|
 | 379 | 
 | 
|---|
 | 380 | 
 | 
|---|
 | 381 | function MakeCaseTreeObject(x: string): PCaseTreeObject;
 | 
|---|
 | 382 | var
 | 
|---|
 | 383 |   AnObject: PCaseTreeObject;
 | 
|---|
 | 384 | begin
 | 
|---|
 | 385 |   New(AnObject);
 | 
|---|
 | 386 |   with AnObject^ do
 | 
|---|
 | 387 |     begin
 | 
|---|
 | 388 |       if Piece(x, U, 10) = '' then
 | 
|---|
 | 389 |         //CASE #^Operative Procedure^Date/Time of Operation^Surgeon^^^^^^^^^+^Context   
 | 
|---|
 | 390 |         begin
 | 
|---|
 | 391 |           CaseID          := Piece(x, U, 1);
 | 
|---|
 | 392 |           OperativeProc   := Piece(x, U, 2);
 | 
|---|
 | 393 |           SurgeryDate     := Piece(x, U, 3);
 | 
|---|
 | 394 |           Surgeon         := Piece(x, U, 4);
 | 
|---|
 | 395 |           IsNonORProc     := Piece(x, U, 6) = '1';
 | 
|---|
 | 396 |           DocHasChildren  := Piece(x, U, 13);
 | 
|---|
 | 397 |           DocParent       := Piece(x, U, 14);
 | 
|---|
 | 398 |           ImageCount      := StrToIntDef(Piece(x, U, 11), 0);
 | 
|---|
 | 399 |           NodeText        := MakeSurgeryCaseDisplayText(x);
 | 
|---|
 | 400 |         end
 | 
|---|
 | 401 |       else
 | 
|---|
 | 402 |         //IEN NIR^TITLE^REF DATE/TIME^PT ID^AUTHORDUZ;AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 403 |         //IEN AR^TITLE^REF DATE/TIME^PT ID^AUTHORDUZ;AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 404 |         //IEN OS^TITLE^REF DATE/TIME^PT ID^AUTHORDUZ;AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^+ (if has addenda)^IEN of Parent Document
 | 
|---|
 | 405 |         //IEN Addendum^TITLE^REF DATE/TIME^PT ID^AUTHORDUZ;AUTHOR^HOSP LOC^STATUS^Vis DT^Disch DT^CASE;SRF(^# Assoc Images^Subject^^IEN of Parent Document
 | 
|---|
 | 406 |         begin
 | 
|---|
 | 407 |           DocID           := Piece(x, U, 1);
 | 
|---|
 | 408 |           DocTitle        := Piece(x, U, 2);
 | 
|---|
 | 409 |           DocFMDate       := Piece(x, U, 3);
 | 
|---|
 | 410 |           DocDate         := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(Piece(x, U, 3)));
 | 
|---|
 | 411 |           Author          := Piece(x, U, 5);
 | 
|---|
 | 412 |           Location        := Piece(x, U, 6);
 | 
|---|
 | 413 |           Status          := Piece(x, U, 7);
 | 
|---|
 | 414 |           VisitDate       := Piece(x, U, 8);
 | 
|---|
 | 415 |           PkgRef          := Piece(x, U, 10);
 | 
|---|
 | 416 |           CaseID          := Piece(Piece(x, U, 10), ';', 1);
 | 
|---|
 | 417 |           ImageCount      := StrToIntDef(Piece(x, U, 11), 0);
 | 
|---|
 | 418 |           Subject         := Piece(x, U, 12);
 | 
|---|
 | 419 |           DocHasChildren  := Piece(x, U, 13);
 | 
|---|
 | 420 |           DocParent       := Piece(x, U, 14);
 | 
|---|
 | 421 |           NodeText        := MakeSurgeryReportDisplayText(x);
 | 
|---|
 | 422 |         end;
 | 
|---|
 | 423 |     end;
 | 
|---|
 | 424 |   Result := AnObject;
 | 
|---|
 | 425 | end;
 | 
|---|
 | 426 | 
 | 
|---|
 | 427 | 
 | 
|---|
 | 428 | end.
 | 
|---|