VistA-cprs/CPRS-Chart/fLabs.pas

2348 lines
78 KiB
Plaintext

unit fLabs;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
fHSplit, StdCtrls, ExtCtrls, ORCtrls, ComCtrls, Grids, Buttons, fLabTest,
fLabTests, fLabTestGroups, ORFn, TeeProcs, TeEngine, Chart, Series, Menus,
uConst, ORDtTmRng, OleCtrls, SHDocVw, Variants, StrUtils;
type
TfrmLabs = class(TfrmHSplit)
lblHeading: TOROffsetLabel;
lstReports: TORListBox;
lstHeaders: TORListBox;
lstDates: TORListBox;
pnlHeader: TORAutoPanel;
pnlFooter: TORAutoPanel;
grdLab: TCaptionStringGrid;
pnlChart: TPanel;
memLab: TRichEdit;
lblSpecimen: TLabel;
lblSingleTest: TLabel;
lstTests: TORListBox;
lblFooter: TOROffsetLabel;
lblReports: TOROffsetLabel;
lblDates: TOROffsetLabel;
lblHeaders: TOROffsetLabel;
bvlHeader: TBevel;
pnlButtons: TORAutoPanel;
cmdNext: TButton;
cmdPrev: TButton;
cmdRecent: TButton;
cmdOld: TButton;
lblDateFloat: TLabel;
lblOld: TOROffsetLabel;
lblPrev: TOROffsetLabel;
lblNext: TOROffsetLabel;
lblRecent: TOROffsetLabel;
pnlOtherTests: TORAutoPanel;
cmdOtherTests: TButton;
chtChart: TChart;
serHigh: TLineSeries;
serLow: TLineSeries;
serTest: TLineSeries;
bvlOtherTests: TBevel;
lblMostRecent: TLabel;
lblDate: TLabel;
lblCollection: TLabel;
pnlWorksheet: TORAutoPanel;
chkValues: TCheckBox;
chk3D: TCheckBox;
ragHorV: TRadioGroup;
chkAbnormals: TCheckBox;
ragCorG: TRadioGroup;
lstTestGraph: TORListBox;
pnlGraph: TORAutoPanel;
chkGraph3D: TCheckBox;
chkGraphValues: TCheckBox;
lblGraphInfo: TLabel;
chkGraphZoom: TCheckBox;
PopupMenu1: TPopupMenu;
GotoTop1: TMenuItem;
GotoBottom1: TMenuItem;
FreezeText1: TMenuItem;
UnfreezeText1: TMenuItem;
Memo1: TMemo;
chkZoom: TCheckBox;
popChart: TPopupMenu;
popValues: TMenuItem;
pop3D: TMenuItem;
popZoom: TMenuItem;
N1: TMenuItem;
popCopy: TMenuItem;
popZoomBack: TMenuItem;
popDetails: TMenuItem;
N2: TMenuItem;
calLabRange: TORDateRangeDlg;
dlgWinPrint: TPrintDialog;
N3: TMenuItem;
popPrint: TMenuItem;
Timer1: TTimer;
TabControl1: TTabControl;
WebBrowser1: TWebBrowser;
lblGraph: TLabel;
procedure FormCreate(Sender: TObject);
procedure DisplayHeading;
procedure lstReportsClick(Sender: TObject);
procedure lstHeadersClick(Sender: TObject);
procedure lstDatesClick(Sender: TObject);
procedure cmdOtherTestsClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cmdNextClick(Sender: TObject);
procedure cmdPrevClick(Sender: TObject);
procedure cmdRecentClick(Sender: TObject);
procedure cmdOldClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure pnlRightResize(Sender: TObject);
procedure chkValuesClick(Sender: TObject);
procedure chk3DClick(Sender: TObject);
procedure ragHorVClick(Sender: TObject);
procedure ragCorGClick(Sender: TObject);
procedure lstTestGraphClick(Sender: TObject);
procedure chkGraphValuesClick(Sender: TObject);
procedure chkGraph3DClick(Sender: TObject);
procedure chkGraphZoomClick(Sender: TObject);
procedure GotoTop1Click(Sender: TObject);
procedure GotoBottom1Click(Sender: TObject);
procedure FreezeText1Click(Sender: TObject);
procedure UnfreezeText1Click(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure chkZoomClick(Sender: TObject);
procedure chtChartUndoZoom(Sender: TObject);
procedure popCopyClick(Sender: TObject);
procedure popChartPopup(Sender: TObject);
procedure popValuesClick(Sender: TObject);
procedure pop3DClick(Sender: TObject);
procedure popZoomClick(Sender: TObject);
procedure popZoomBackClick(Sender: TObject);
procedure chtChartMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure chtChartClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure chtChartClickLegend(Sender: TCustomChart;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure popDetailsClick(Sender: TObject);
procedure popPrintClick(Sender: TObject);
procedure BeginEndDates(var ADate1, ADate2: TFMDateTime; var ADaysBack: integer);
procedure Timer1Timer(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure UpdateRemoteStatus(aSiteID, aStatus: string);
private
{ Private declarations }
procedure AlignList;
procedure HGrid(griddata: TStrings);
procedure VGrid(griddata: TStrings);
procedure FillGrid(agrid: TStringGrid; aitems: TStrings);
procedure GridComments(aitems: TStrings);
procedure FillComments(amemo: TRichEdit; aitems:TStrings);
procedure GetInterimGrid(adatetime: TFMDateTime; direction: integer);
procedure WorksheetChart(test: string; aitems: TStrings);
procedure GetStartStop(var start, stop: string; aitems: TStrings);
procedure GraphChart(test: string; aitems: TStrings);
procedure GraphList(griddata: TStrings);
procedure ProcessNotifications;
procedure PrintLabGraph;
procedure GoRemote(Dest: TStringList; AItem, AReportID: Int64; AQualifier,
ARpc, AHSType, ADaysBack, ASection: string; ADate1, ADate2: TFMDateTime);
procedure ChkBrowser;
procedure CommonComponentVisible(A1,A2,A3,A4,A5,A6,A7,A8,A9: Boolean);
public
procedure ClearPtData; override;
function AllowContextChange(var WhyNot: string): Boolean; override;
procedure DisplayPage; override;
procedure SetFontSize(NewFontSize: Integer); override;
function FMToDateTime(FMDateTime: string): TDateTime;
procedure RequestPrint; override;
procedure ExtlstReportsClick(Sender: TObject; Ext: boolean);
end;
var
frmLabs: TfrmLabs;
uPrevReportIndex, uFormat: integer;
uDate1, uDate2: Tdatetime;
tmpGrid: TStringList;
uLabLocalReportData: TStringList; //Storage for Local report data
uLabRemoteReportData: TStringList; //Storage for Remote lab query
uUpdateStat: boolean; //flag turned on when remote status is being updated
implementation
uses uCore, rLabs, rCore, rCover, rOrders, fLabPrint, fFrame, fRptBox, Printers,
clipbrd, rReports, rGraphs, activex, mshtml, uAccessibleStringGrid;
const
CT_LABS = 9; // ID for Labs tab used by frmFrame
TX_NOREPORT = 'No report is currently selected.';
TX_NOREPORT_CAP = 'No Report Selected';
ZOOM_PERCENT = 99; // padding for inflating margins
HTML_PRE = '<html><head><style>' + CRLF +
'PRE {font-size:8pt;font-family: "Courier New", "monospace"}' + CRLF +
'</style></head><body><pre>';
HTML_POST = CRLF + '</pre></body></html>';
{$R *.DFM}
var
uFrozen: Boolean;
uGraphingActivated: Boolean;
uRemoteCount: Integer;
uHTMLDoc: string;
uReportType: string;
uReportRPC: string;
uHTMLPatient: ANSIstring;
procedure TfrmLabs.RequestPrint;
begin
with lstReports do
begin
if ItemIEN = 0 then InfoBox(TX_NOREPORT, TX_NOREPORT_CAP, MB_OK);
case ItemIen of
1: begin
InfoBox('Unable to print ''Most Recent'' report.', 'No Print Available', MB_OK);
end;
2: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
3: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
4: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
5: begin
InfoBox('Unable to print ''Worksheet'' report.', 'No Print Available', MB_OK);
end;
6: begin
if chtChart.Visible then PrintLabGraph;
end;
8: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
9: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
10: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
20: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
21: begin
PrintLabs(ItemIEN, DisplayText[ItemIndex], lstDates.ItemIEN);
end;
end;
end;
end;
procedure TfrmLabs.FormCreate(Sender: TObject);
var
aList: TStrings;
begin
inherited;
PageID := CT_LABS;
grdLab.Color := ReadOnlyColor;
memLab.Color := ReadOnlyColor;
uFrozen := False;
aList := TStringList.Create;
FastAssign(rpcGetGraphSettings, aList);
uGraphingActivated := aList.Count > 0;
aList.Free;
uRemoteCount := 0;
tmpGrid := TStringList.Create;
uLabLocalReportData := TStringList.Create;
uLabRemoteReportData := TStringList.Create;
uPrevReportIndex := 0;
lstReports.ItemIndex := uPrevReportIndex;
if Patient.Inpatient then lstDates.ItemIndex := 2 else lstDates.ItemIndex := 5;
lblSingleTest.Caption := '';
lblSpecimen.Caption := '';
SerTest.GetHorizAxis.ExactDateTime := true;
SerTest.GetHorizAxis.Increment := DateTimeStep[dtOneMinute];
TAccessibleStringGrid.WrapControl(grdLab);
end;
procedure TfrmLabs.UpdateRemoteStatus(aSiteID, aStatus: string);
var
j: integer;
s: string;
c: boolean;
begin
if uUpdateStat = true then exit; //uUpdateStat also looked at in fFrame
uUpdateStat := true;
for j := 0 to frmFrame.lstCIRNLocations.Items.Count - 1 do
begin
s := frmFrame.lstCIRNLocations.Items[j];
c := frmFrame.lstCIRNLocations.checked[j];
if piece(s, '^', 1) = aSiteID then
begin
frmFrame.lstCIRNLocations.Items[j] := pieces(s, '^', 1, 3) + '^' + aStatus;
frmFrame.lstCIRNLocations.checked[j] := c;
end;
end;
uUpdateStat := false;
end;
function TfrmLabs.AllowContextChange(var WhyNot: string): Boolean;
var
i: integer;
begin
Result := inherited AllowContextChange(WhyNot); // sets result = true
if Timer1.Enabled = true then
case BOOLCHAR[frmFrame.CCOWContextChanging] of
'1': begin
WhyNot := 'A remote data query in progress will be aborted.';
Result := False;
end;
'0': if WhyNot = 'COMMIT' then
begin
with RemoteSites.SiteList do for i := 0 to Count - 1 do
if TRemoteSite(Items[i]).Selected then
if Length(TRemoteSite(Items[i]).LabRemoteHandle) > 0 then
begin
TRemoteSite(Items[i]).ReportClear;
TRemoteSite(Items[i]).LabQueryStatus := '-1^Aborted';
TabControl1.OnChange(nil);
end;
Timer1.Enabled := false;
Result := True;
end;
end;
end;
procedure TfrmLabs.ClearPtData;
begin
inherited ClearPtData;
Timer1.Enabled := False;
memLab.Lines.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
TabControl1.Tabs.Clear;
TabControl1.Visible := false;
tmpGrid.Clear;
with grdLab do
begin
RowCount := 1;
ColCount := 1;
Cells[0, 0] := '';
end;
end;
procedure TfrmLabs.DisplayPage;
begin
inherited DisplayPage;
frmFrame.mnuFilePrint.Tag := CT_LABS;
frmFrame.mnuFilePrint.Enabled := True;
frmFrame.mnuFilePrintSetup.Enabled := True;
memLab.SelStart := 0;
uHTMLPatient := '<DIV align left>'
+ '<TABLE width="75%" border="0" cellspacing="0" cellpadding="1">'
+ '<TR valign="bottom" align="left">'
+ '<TD nowrap><B>Patient: ' + Patient.Name + '</B></TD>'
+ '<TD nowrap><B>' + Patient.SSN + '</B></TD>'
+ '<TD nowrap><B>Age: ' + IntToStr(Patient.Age) + '</B></TD>'
+ '</TR></TABLE></DIV><HR>';
//the preferred method would be to use headers and footers
//so this is just an interim solution.
if InitPage then
begin
ListLabReports(lstReports.Items);
end;
if InitPatient and not (CallingContext = CC_NOTIFICATION) then
begin
if Patient.Inpatient then lstDates.ItemIndex := 2 else lstDates.ItemIndex := 5;
lstReports.ItemIndex := 0;
lstReportsClick(self);
end;
case CallingContext of
CC_INIT_PATIENT: if not InitPatient then
begin
if Patient.Inpatient then lstDates.ItemIndex := 2 else lstDates.ItemIndex := 5;
lstReports.ItemIndex := 0;
lstReportsClick(self);
end;
CC_NOTIFICATION: ProcessNotifications;
end;
end;
procedure TfrmLabs.SetFontSize(NewFontSize: Integer);
begin
inherited SetFontSize(NewFontSize);
FormResize(self);
end;
procedure TfrmLabs.DisplayHeading;
begin
with lblHeading do
begin
Caption := 'Laboratory Results - ' + lstReports.DisplayText[lstReports.ItemIndex];
if lstDates.Visible then
Caption := Caption + ' - ' + lstDates.DisplayText[lstDates.ItemIndex];
end;
end;
procedure TfrmLabs.AlignList;
begin
lblReports.Top := 0;
lstReports.Top := lblReports.Height;
lstDates.Height := pnlLeft.Height div 3 - (lblDates.Height div 2);
lstDates.Top := pnlLeft.Height - lstDates.Height;
lblDates.Top := lstDates.Top - lblDates.Height;
pnlOtherTests.Top := lblDates.Top - pnlOtherTests.Height;
lstHeaders.Height := pnlLeft.Height div 3 - (lblHeaders.Height * 3);
lstHeaders.Top := lblDates.Top - lstHeaders.Height;
lblHeaders.Top := lstHeaders.Top - lblHeaders.Height;
lstReports.Repaint;
lstDates.Repaint;
lstHeaders.Repaint;
end;
procedure TfrmLabs.lstReportsClick(Sender: TObject);
begin
ExtlstReportsClick(Sender, false);
end;
procedure TfrmLabs.ExtlstReportsClick(Sender: TObject; Ext: boolean);
var
i,iCat: integer;
Rpt: string;
begin
inherited;
uRemoteCount := 0;
Timer1.Enabled := False;
Rpt := lstReports.Items[lstReports.ItemIndex];
uReportType := Piece(Rpt,'^',4);
uReportRPC := UpperCase(Piece(Rpt,'^',6));
if length(Piece(Rpt,'^',5)) > 0 then
iCat := StrToInt(Piece(Rpt,'^',5))
else
iCat := 0;
if uReportType = '' then uReportType := 'R';
StatusText('');
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
lstHeaders.Clear;
TabControl1.Visible := false;
if Piece(Rpt,'^',3) = '1' then
if TabControl1.Tabs.Count > 1 then
TabControl1.Visible := true;
for i := 0 to RemoteSites.SiteList.Count - 1 do
TRemoteSite(RemoteSites.SiteList.Items[i]).LabClear;
if uFrozen = True then memo1.visible := False;
case lstReports.ItemIEN of
1: begin // Most Recent
CommonComponentVisible(false,false,false,false,false,true,true,false,true);
pnlButtons.Visible := true;
pnlWorksheet.Visible := false;
pnlGraph.Visible := false;
memLab.Align := alBottom;
memLab.Height := pnlLeft.Height div 5;
grdLab.Align := alClient;
memLab.Clear;
if uReportType = 'H' then
begin
WebBrowser1.Navigate('about:blank');
WebBrowser1.Align := alBottom;
WebBrowser1.Height := pnlLeft.Height div 5;
WebBrowser1.Visible := true;
WebBrowser1.BringToFront;
memLab.Visible := false;
end
else
begin
WebBrowser1.Visible := false;
WebBrowser1.SendToBack;
memLab.Visible := true;
memLab.BringToFront;
end;
FormResize(self);
cmdRecentClick(self);
uPrevReportIndex := lstReports.ItemIndex;
end;
4: begin // Interim for Selected Tests
if uPrevReportIndex <> lstReports.ItemIndex then
begin
lstTests.Clear;
lblSpecimen.Caption := '';
end;
if not Ext then SelectTests(Font.Size);
if lstTests.Items.Count > 0 then
begin
CommonComponentVisible(false,false,true,true,true,false,false,false,true);
memLab.Clear;
chkBrowser;
FormResize(self);
RedrawActivate(memLab.Handle);
lstDatesClick(self);
if not Ext then cmdOtherTests.SetFocus;
cmdOtherTests.Default := true;
end
else lstReports.ItemIndex := uPrevReportIndex;
end;
5: begin // Worksheet
if uPrevReportIndex <> lstReports.ItemIndex then
begin
lstTests.Clear;
lblSpecimen.Caption := '';
end;
if not Ext then SelectTestGroups(Font.Size);
if lstTests.Items.Count > 0 then
begin
CommonComponentVisible(false,false,true,true,true,true,true,false,false);
chtChart.Visible := true;
memLab.Visible := false;
pnlButtons.Visible := false;
pnlWorksheet.Visible := true;
pnlGraph.Visible := false;
lstTestGraph.Width := 97;
ragCorG.ItemIndex := 0;
FormResize(self);
lblFooter.Caption := ' KEY: "L" = Abnormal Low, "H" = Abnormal High, "*" = Critical Value, "**" = Comments on Specimen';
//chkZoom.Checked := false;
//chkZoomClick(self);
lstDatesClick(self);
if not Ext then cmdOtherTests.SetFocus;
cmdOtherTests.Default := true;
end
else lstReports.ItemIndex := uPrevReportIndex;
end;
6: begin // Graph
// do if graphing is activiated
if uGraphingActivated then
begin
memLab.Clear;
chkBrowser;
FormResize(self);
memLab.Align := alClient;
CommonComponentVisible(false,false,false,false,false,false,false,false,false);
RedrawActivate(memLab.Handle);
StatusText('');
memLab.Lines.Insert(0, ' ');
memLab.Lines.Insert(1, 'Graphing activated');
memLab.SelStart := 0;
frmFrame.mnuToolsGraphingClick(self); // make it just lab tests ??
//lstReports.ItemIndex := uPrevReportIndex;
end
else // otherwise, do lab graph
begin
if uPrevReportIndex <> lstReports.ItemIndex then
begin
lblSingleTest.Caption := '';
lblSpecimen.Caption := '';
end;
if not Ext then SelectTest(Font.Size);
if (length(lblSingleTest.Caption) > 2) and (length(lblSpecimen.Caption) > 2) then
begin
CommonComponentVisible(false,false,true,true,true,true,false,false,true);
pnlChart.Visible := true;
chtChart.Visible := true;
pnlButtons.Visible := false;
pnlWorksheet.Visible := false;
pnlGraph.Visible := true;
memLab.Height := pnlRight.Height div 5;
memLab.Clear;
if uReportType = 'H' then
begin
WebBrowser1.Visible := true;
WebBrowser1.Navigate('about:blank');
WebBrowser1.Height := pnlRight.Height div 5;
WebBrowser1.BringToFront;
memLab.Visible := false;
end
else
begin
WebBrowser1.Visible := false;
WebBrowser1.SendToBack;
memLab.Visible := true;
memLab.BringToFront;
end;
lstTestGraph.Items.Clear;
lstTestGraph.Width := 0;
FormResize(self);
RedrawActivate(memLab.Handle);
lblFooter.Caption := '';
chkGraphZoom.Checked := false;
chkGraphZoomClick(self);
chkGraph3DClick(self);
chkGraphValuesClick(self);
lstDatesClick(self);
if not Ext then cmdOtherTests.SetFocus;
cmdOtherTests.Default := true;
end
else
lstReports.ItemIndex := uPrevReportIndex;
end;
end
else // case
begin
//added to deal with other reports from file 101.24
memLab.Clear;
chkBrowser;
FormResize(self);
memLab.Align := alClient;
case iCat of
{Categories of reports:
0:Fixed
1:Fixed w/Dates
2:Fixed w/Headers
3:Fixed w/Dates & Headers
4:Specialized
5:Graphic}
0: begin
CommonComponentVisible(false,false,false,false,false,false,false,false,false);
StatusText('Retrieving data...');
GoRemote(uLabRemoteReportData,lstReports.ItemIEN,1,'',uReportRPC,'0','9999','1',0,0);
TabControl1.OnChange(nil);
Reports(uLabLocalReportData,Patient.DFN, Piece(Rpt,'^',1), '0', '9999', '1', 0, 0, uReportRPC);
if TabControl1.TabIndex < 1 then
QuickCopy(uLabLocalReportData,memLab);
RedrawActivate(memLab.Handle);
StatusText('');
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
memLab.SelStart := 0;
if uReportType = 'R' then
uHTMLDoc := HTML_PRE + uLabLocalReportData.Text + HTML_POST
else
uHTMLDoc := uHTMLPatient + uLabLocalReportData.Text;
if WebBrowser1.Visible = true then WebBrowser1.Navigate('about:blank');
end;
1: begin
CommonComponentVisible(false,false,false,true,true,false,false,false,false);
memLab.Repaint;
lstDatesClick(self);
end;
2: begin
CommonComponentVisible(true,true,false,false,false,false,false,false,false);
lstHeaders.Clear;
StatusText('Retrieving data...');
GoRemote(uLabRemoteReportData,lstReports.ItemIEN,1,'',uReportRPC,'0','9999','1',0,0);
TabControl1.OnChange(nil);
Reports(uLabLocalReportData,Patient.DFN, Piece(Rpt,'^',1), '0', '9999', '1', 0, 0, uReportRPC);
if uLabLocalReportData.Count > 0 then
begin
TabControl1.OnChange(nil);
if lstHeaders.Items.Count > 0 then lstHeaders.ItemIndex := 0;
end;
RedrawActivate(memLab.Handle);
StatusText('');
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
if uReportType = 'R' then
uHTMLDoc := HTML_PRE + uLabLocalReportData.Text + HTML_POST
else
uHTMLDoc := uHTMLPatient + uLabLocalReportData.Text;
if WebBrowser1.Visible = true then WebBrowser1.Navigate('about:blank');
end;
3: begin
CommonComponentVisible(true,true,false,true,true,false,false,false,true);
lstDatesClick(self);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
end;
end;
end;
end;
uPrevReportIndex := lstReports.ItemIndex;
DisplayHeading;
end;
procedure TfrmLabs.lstHeadersClick(Sender: TObject);
var
Current, Desired: integer;
begin
inherited;
if uFrozen = True then memo1.visible := False;
Current := SendMessage(memLab.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
Desired := lstHeaders.ItemIEN;
SendMessage(memLab.Handle, EM_LINESCROLL, 0, Desired - Current - 1);
end;
procedure TfrmLabs.lstDatesClick(Sender: TObject);
var
tmpList: TStringList;
daysback: integer;
date1, date2: TFMDateTime;
today: TDateTime;
i: integer;
Rpt: string;
begin
inherited;
uRemoteCount := 0;
if uFrozen = True then memo1.visible := False;
Screen.Cursor := crHourGlass;
DisplayHeading;
uHTMLDoc := '';
Rpt := lstReports.Items[lstReports.ItemIndex];
uReportRPC := UpperCase(Piece(Rpt,'^',6));
chkBrowser;
if (lstDates.ItemID = 'S') then
begin
with calLabRange do
begin
if Execute then
if Length(TextOfStart) > 0 then
if Length(TextOfStop) > 0 then
begin
lstDates.ItemIndex := lstDates.Items.Add(RelativeStart + ';' +
RelativeStop + U + TextOfStart + ' to ' + TextOfStop);
DisplayHeading;
end
else
lstDates.ItemIndex := -1
else
lstDates.ItemIndex := -1
else
lstDates.ItemIndex := -1;
end;
end;
today := FMToDateTime(floattostr(FMToday));
if lstDates.ItemIEN > 0 then
begin
daysback := lstDates.ItemIEN;
date1 := FMToday;
If daysback = 1 then
date2 := DateTimeToFMDateTime(today)
Else
date2 := DateTimeToFMDateTime(today - daysback);
end
else
BeginEndDates(date1,date2,daysback);
date1 := date1 + 0.2359;
uHTMLDoc := '';
WebBrowser1.Navigate('about:blank');
case lstReports.ItemIEN of
21: begin // Cumulative
lstHeaders.Clear;
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
StatusText('Retrieving data for cumulative report...');
GoRemote(uLabRemoteReportData,0,2,'',uReportRPC,'',IntToStr(daysback),'',date1,date2);
TabControl1.OnChange(nil);
Cumulative(uLabLocalReportData, Patient.DFN, daysback, date1, date2, uReportRPC);
if uLabLocalReportData.Count > 0 then
begin
TabControl1.OnChange(nil);
if lstHeaders.Items.Count > 0 then lstHeaders.ItemIndex := 0;
end;
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
end;
3: begin // Interim
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
StatusText('Retrieving data for interim report...');
GoRemote(uLabRemoteReportData,0,3,'',uReportRPC,'','','',date1,date2);
TabControl1.OnChange(nil);
Interim(uLabLocalReportData, Patient.DFN, date1, date2, uReportRPC);
if uLabLocalReportData.Count < 1 then
uLabLocalReportData.Add('<No results for this date range.>');
if TabControl1.TabIndex < 1 then
QuickCopy(uLabLocalReportData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
memLab.SelStart := 0;
end;
4: begin // Interim for Selected Tests
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
try
StatusText('Retrieving data for selected tests...');
uLabLocalReportData.Assign(InterimSelect(Patient.DFN, date1, date2, lstTests.Items));
if uLabLocalReportData.Count > 0 then
QuickCopy(uLabLocalReportData,memLab)
else
memLab.Lines.Add('<No results for selected tests in this date range.>');
memLab.SelStart := 0;
finally
//tmpList.Free;
end;
end;
5: begin // Worksheet
chtChart.BottomAxis.Automatic := true;
chkZoom.Checked := false;
//chkZoomClick(self);
chkAbnormals.Checked := false;
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
grdLab.Align := alClient;
StatusText('Retrieving data for worksheet...');
tmpGrid.Assign(Worksheet(Patient.DFN, date1, date2,
Piece(lblSpecimen.Caption, '^', 1), lstTests.Items));
if ragHorV.ItemIndex = 0 then
HGrid(tmpGrid)
else
VGrid(tmpGrid);
GraphList(tmpGrid);
GridComments(tmpGrid);
ragCorGClick(self);
end;
6: begin // Graph
if not uGraphingActivated then
begin
chtChart.BottomAxis.Automatic := true;
chkGraphZoom.Checked := false;
chkGraphZoomClick(self);
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
tmpList := TStringList.Create;
try
StatusText('Retrieving data for graph...');
tmpList.Assign(GetChart(Patient.DFN, date1, date2,
Piece(lblSpecimen.Caption, '^', 1),
Piece(lblSingleTest.Caption, '^', 1)));
if tmpList.Count > 1 then
begin
chtChart.Visible := true;
GraphChart(lblSingleTest.Caption, tmpList);
chtChart.ZoomPercent(ZOOM_PERCENT);
for i := strtoint(Piece(tmpList[0], '^', 1)) + 1 to tmpList.Count - 1
do memLab.Lines.Add(tmpList[i]);
if memLab.Lines.Count < 2 then
memLab.Lines.Add('<No comments on specimens.>');
memLab.SelStart := 0;
lblGraph.Visible := false;
end
else
begin
lblGraph.Left := chtChart.Left + ((chtChart.Width - lblGraph.Width) div 2);
lblGraph.Top := 2;
lblGraph.Visible := true;
if Piece(lblSpecimen.Caption, '^', 1) = '0' then
pnlChart.Caption := '<No results can be graphed for ' +
Piece(lblSingleTest.Caption, '^', 2) + ' in this date range.> '
+ 'Results may be available, but cannot be graphed. Please try an alternate view.'
else
pnlChart.Caption := '<No results can be graphed for ' +
Piece(lblSingleTest.Caption, '^', 2)
+ ' (' + Piece(lblSpecimen.Caption, '^', 2) +
') in this date range.> '
+ 'Results may be available, but cannot be graphed. Please try an alternate view.';
chtChart.Visible := false;
end;
finally
tmpList.Free;
end;
end;
end;
9: begin // Micro
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
StatusText('Retrieving microbiology data...');
GoRemote(uLabRemoteReportData,0,4,'',uReportRPC,'','','',date1,date2);
TabControl1.OnChange(nil);
Micro(uLabLocalReportData, Patient.DFN, date1, date2, uReportRPC);
if uLabLocalReportData.Count < 1 then
uLabLocalReportData.Add('<No microbiology results for this date range.>');
if TabControl1.TabIndex < 1 then
QuickCopy(uLabLocalReportData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
memLab.SelStart := 0;
end;
10: begin // Lab Status
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
StatusText('Retrieving lab status data...');
GoRemote(uLabRemoteReportData,9,1,'',uReportRPC,'',IntToStr(daysback),'',date1,date2);
TabControl1.OnChange(nil);
Reports(uLabLocalReportData,Patient.DFN, '9', '', IntToStr(daysback),'',
date1, date2, uReportRPC);
if uLabLocalReportData.Count < 1 then
uLabLocalReportData.Add('<No laboratory orders for this date range.>');
if TabControl1.TabIndex < 1 then
QuickCopy(uLabLocalReportData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
memLab.SelStart := 0;
end;
else begin //Anything Else
lstHeaders.Clear;
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
StatusText('Retrieving lab data...');
GoRemote(uLabRemoteReportData, StrToInt(Piece(Rpt,'^',1)), 1, '',
uReportRPC, '', IntToStr(daysback), '', date1, date2);
TabControl1.OnChange(nil);
Reports(uLabLocalReportData,Patient.DFN, Piece(Rpt,'^',1), '',
IntToStr(daysback), '', date1, date2, uReportRPC);
if uLabLocalReportData.Count < 1 then
uLabLocalReportData.Add('<No data for this date range.>');
if TabControl1.TabIndex < 1 then
QuickCopy(uLabLocalReportData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
memLab.SelStart := 0;
end;
end;
if uReportType = 'R' then
uHTMLDoc := HTML_PRE + uLabLocalReportData.Text + HTML_POST
else
uHTMLDoc := uHTMLPatient + uLabLocalReportData.Text;
Screen.Cursor := crDefault;
StatusText('');
end;
procedure TfrmLabs.cmdOtherTestsClick(Sender: TObject);
begin
inherited;
lstReportsClick(self);
end;
procedure TfrmLabs.GraphList(griddata: TStrings);
var
i, j: integer;
ok: boolean;
testname, testnum, testnum1, line: string;
begin
lstTestGraph.Clear;
for i := 0 to lstTests.Items.Count - 1 do
begin
testnum := Piece(lstTests.Items[i], '^', 1);
testname := Piece(lstTests.Items[i], '^', 2);
ok := false;
for j := strtoint(Piece(griddata[0], '^', 4)) + 1 to strtointdef(Piece(griddata[0], '^', 5), 0) do
begin
testnum1 := Piece(griddata[j - 1], '^', 1);
if testnum1 = testnum then
begin
ok := true;
line := testnum + '^' + testname + ' (' + MixedCase(Piece(griddata[j - 1], '^', 2)) + ')^';
line := line + Pieces(griddata[j - 1], '^', 3, 6);
lstTestGraph.Items.Add(line);
end;
end;
if not ok then lstTestGraph.Items.Add(lstTests.Items[i]);
end;
end;
procedure TfrmLabs.HGrid(griddata: TStrings);
var
testcnt, datecnt, datacnt, linecnt, offset, x, y, i: integer;
begin
offset := 0;
testcnt := strtoint(Piece(griddata[offset], '^', 1));
datecnt := strtoint(Piece(griddata[offset], '^', 2));
datacnt := strtoint(Piece(griddata[offset], '^', 3));
linecnt := testcnt + datecnt + datacnt;
if chkAbnormals.Checked and (linecnt > 0) then
begin
offset := linecnt + 1;
testcnt := strtoint(Piece(griddata[offset], '^', 1));
datecnt := strtoint(Piece(griddata[offset], '^', 2));
datacnt := strtoint(Piece(griddata[offset], '^', 3));
linecnt := testcnt + datecnt + datacnt;
end;
with grdLab do
begin
if testcnt = 0 then ColCount := 3 else ColCount := testcnt + 2;
if datecnt = 0 then RowCount := 2 else RowCount := datecnt + 1;
DefaultColWidth := ResizeWidth( BaseFont, MainFont, 60);
ColWidths[0] := ResizeWidth( BaseFont, MainFont, 80);
FixedCols := 2;
FixedRows := 1;
for y := 0 to RowCount - 1 do
for x := 0 to ColCount - 1 do
Cells[x, y] := '';
Cells[0, 0] := 'Date/Time';
Cells[1, 0] := 'Specimen';
for i := 1 to testcnt do
begin
Cells[i + 1, 0] := Piece(griddata[i + offset], '^', 3);
end;
if datecnt = 0 then
begin
Cells[0, 1] := 'no results';
for x := 1 to ColCount - 1 do
Cells[x, 1] := '';
end;
for i := testcnt + 1 to testcnt + datecnt do
begin
Cells[0, i - testcnt] := FormatFMDateTime('mm/dd/yy hh:nn',MakeFMDateTime(Piece(griddata[i + offset], '^', 2)));
Cells[1, i - testcnt] := MixedCase(Piece(griddata[i + offset], '^', 4)) + ' ' + Piece(griddata[i + offset], '^', 5);
end;
for i := testcnt + datecnt + 1 to linecnt do
begin
y := strtoint(Piece(griddata[i + offset], '^', 1));
x := strtoint(Piece(griddata[i + offset], '^', 2)) + 1;
Cells[x, y] := Piece(griddata[i + offset], '^', 3) + ' ' + Piece(griddata[i + offset], '^', 4);
end;
end;
end;
procedure TfrmLabs.VGrid(griddata: TStrings);
var
testcnt, datecnt, datacnt, linecnt, offset, x, y, i: integer;
begin
offset := 0;
testcnt := strtoint(Piece(griddata[offset], '^', 1));
datecnt := strtoint(Piece(griddata[offset], '^', 2));
datacnt := strtoint(Piece(griddata[offset], '^', 3));
linecnt := testcnt + datecnt + datacnt;
if chkAbnormals.Checked and (linecnt > 0) then
begin
offset := linecnt + 1;
testcnt := strtoint(Piece(griddata[offset], '^', 1));
datecnt := strtoint(Piece(griddata[offset], '^', 2));
datacnt := strtoint(Piece(griddata[offset], '^', 3));
linecnt := testcnt + datecnt + datacnt;
end;
with grdLab do
begin
if datecnt = 0 then ColCount := 2 else ColCount := datecnt + 1;
if testcnt = 0 then RowCount := 3 else RowCount := testcnt + 2;
DefaultColWidth := ResizeWidth( BaseFont, MainFont, 80);
ColWidths[0] := ResizeWidth( BaseFont, MainFont, 60);
FixedCols := 1;
FixedRows := 2;
for y := 0 to RowCount - 1 do
for x := 0 to ColCount - 1 do
Cells[x, y] := '';
Cells[0, 0] := 'Date/Time';
Cells[0, 1] := 'Specimen';
for i := 1 to testcnt do
begin
Cells[0, i + 1] := Piece(griddata[i + offset], '^', 3);
end;
if datecnt = 0 then
begin
Cells[1, 0] := 'no results';
for x := 1 to RowCount - 1 do
Cells[x, 1] := '';
end;
for i := testcnt + 1 to testcnt + datecnt do
begin
Cells[i - testcnt, 0] := FormatFMDateTime('mm/dd/yy hh:nn',MakeFMDateTime(Piece(griddata[i + offset], '^', 2)));
Cells[i - testcnt, 1] := MixedCase(Piece(griddata[i + offset], '^', 4));
end;
for i := testcnt + datecnt + 1 to linecnt do
begin
x := strtoint(Piece(griddata[i + offset], '^', 1));
y := strtoint(Piece(griddata[i + offset], '^', 2)) + 1;
Cells[x, y] := Piece(griddata[i + offset], '^', 3) + ' ' + Piece(griddata[i + offset], '^', 4);
end;
end;
end;
procedure TfrmLabs.GridComments(aitems: TStrings);
var
i, start: integer;
begin
start := strtointdef(Piece(aitems[0], '^', 5), 1);
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
for i := start to aitems.Count - 1 do
memLab.Lines.Add(aitems[i]);
if (memLab.Lines.Count = 0) and (aitems.Count > 1) then
memLab.Lines.Add('<No comments on specimens.>');
memLab.SelStart := 0;
end;
procedure TfrmLabs.FormDestroy(Sender: TObject);
begin
inherited;
tmpGrid.free;
uLabLocalReportData.Free;
uLabRemoteReportData.Free;
TAccessibleStringGrid.UnwrapControl(grdLab);
end;
procedure TfrmLabs.FillGrid(agrid: TStringGrid; aitems: TStrings);
var
testcnt, x, y, i: integer;
begin
testcnt := strtoint(Piece(aitems[0], '^', 1));
with agrid do
begin
if testcnt = 0 then RowCount := 3 else RowCount := testcnt + 1;
ColCount := 5;
DefaultColWidth := agrid.Width div ColCount - 2;
ColWidths[0] := agrid.Width div 4;
ColWidths[4] := agrid.Width div 4;
ColWidths[2] := agrid.Width div 9;
ColWidths[3] := agrid.Width div 6;
ColWidths[1] := agrid.Width - ColWidths[0] - ColWidths[2] - ColWidths[3] - ColWidths[4] - 8;
FixedCols := 0;
FixedRows := 1;
for y := 0 to RowCount - 1 do
for x := 0 to ColCount - 1 do
Cells[x, y] := '';
Cells[0, 0] := 'Test';
Cells[1, 0] := 'Result';
Cells[2, 0] := 'Flag';
Cells[3, 0] := 'Units';
Cells[4, 0] := 'Ref Range';
for i := 1 to testcnt do
begin
Cells[0, i] := Piece(aitems[i], '^', 2);
Cells[1, i] := Piece(aitems[i], '^', 3);
Cells[2, i] := Piece(aitems[i], '^', 4);
Cells[3, i] := Piece(aitems[i], '^', 5);
Cells[4, i] := Piece(aitems[i], '^', 6);
end;
end;
end;
procedure TfrmLabs.FillComments(amemo: TRichEdit; aitems:TStrings);
var
testcnt, i: integer;
specimen, accession, provider: string;
begin
amemo.Lines.Clear;
specimen := Piece(aitems[0], '^', 5);
accession := Piece(aitems[0], '^', 6);
provider := Piece(aitems[0], '^', 7);
amemo.Lines.Add('Specimen: ' + specimen + '; Accession: ' + accession + '; Provider: ' + provider);
testcnt := strtoint(Piece(aitems[0], '^', 1));
for i := testcnt + 1 to aitems.Count - 1 do
amemo.Lines.Add(aitems[i]);
amemo.SelStart := 0;
end;
procedure TfrmLabs.GetInterimGrid(adatetime: TFMDateTime; direction: integer);
var
tmpList: TStringList;
nexton, prevon: boolean;
newest, oldest: string;
begin
tmpList := TStringList.Create;
GetNewestOldest(Patient.DFN, newest, oldest); //****** PATCH
nexton := true;
prevon := true;
try
tmpList.Assign(InterimGrid(Patient.DFN, adatetime, direction, uFormat));
if tmpList.Count > 0 then
begin
lblDateFloat.Caption := Piece(tmpList[0], '^', 3);
uFormat := strtointdef(Piece(tmpList[0], '^', 9), 1);
if length(lblDateFloat.Caption) > 0 then
lblDate.Caption := FormatFMDateTime('MMM DD, YYYY hh:nn', strtofloat(lblDateFloat.Caption));
if length(lblDateFloat.Caption) < 1
then
begin
lblDateFloat.Caption := FloatToStr(adatetime);
nexton := false;
end
else
begin
nexton := lblDateFloat.Caption <> newest;
prevon := lblDateFloat.Caption <> oldest;
end;
if (not nexton) and (uFormat = 3) then
nexton := true;
if (not prevon) and (uFormat = 2) then
prevon := true;
end
else
begin
lblDateFloat.Caption := '';
lblDate.Caption := '';
end;
cmdNext.Enabled := nexton;
cmdRecent.Enabled := nexton;
lblNext.Enabled := nexton;
lblRecent.Enabled := nexton;
cmdPrev.Enabled := prevon;
cmdOld.Enabled := prevon;
lblPrev.Enabled := prevon;
lblOld.Enabled := prevon;
if cmdOld.Enabled and cmdRecent.Enabled then
lblMostRecent.Visible := false
else
begin
lblMostRecent.Visible := true;
if (not cmdOld.Enabled) and (not cmdRecent.Enabled) then
lblMostRecent.Caption := 'No Lab Results'
else if cmdOld.Enabled then
lblMostRecent.Caption := 'Most Recent Lab Result'
else
lblMostRecent.Caption := 'Oldest Lab Result';
end;
if tmpList.Count > 0 then
begin
if Piece(tmpList[0], '^', 2) = 'CH' then
begin
FillGrid(grdLab, tmpList);
FillComments(memLab, tmpList);
memLab.Align := alBottom;
memLab.Height := pnlLeft.Height div 5;
grdLab.Align := alClient;
grdLab.Visible := true;
memLab.Visible := true;
pnlFooter.Height := lblHeading.Height + 5;
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
lblFooter.Caption := ' KEY: "L" = Abnormal Low, "H" = Abnormal High, "*" = Critical Value';
lblFooter.Align := alTop;
pnlFooter.Visible := true;
if (grdLab.VisibleRowCount + 1) < grdLab.RowCount then
grdLab.ColWidths[4] := grdLab.ColWidths[4] - 18;
memLab.Repaint;
end;
if Piece(tmpList[0], '^', 2) = 'MI' then
begin
tmpList.Delete(0);
memLab.Lines.Assign(tmpList);
memLab.SelStart := 0;
grdLab.Visible := false;
pnlFooter.Visible := false;
memLab.Align := alClient;
end;
end
else
begin
grdLab.Visible := false;
pnlFooter.Visible := false;
memLab.Align := alClient;
end;
finally
tmpList.Free;
end;
end;
procedure TfrmLabs.cmdNextClick(Sender: TObject);
var
HadFocus: boolean;
begin
inherited;
HadFocus := Screen.ActiveControl = cmdNext;
StatusText('Retrieving next lab data...');
if Length(lblDateFloat.Caption) > 0 then GetInterimGrid(strtofloat(lblDateFloat.Caption), -1);
StatusText('');
if HadFocus then begin
if cmdNext.Enabled then cmdNext.SetFocus
else if cmdPrev.Enabled then cmdPrev.SetFocus
else lstReports.SetFocus;
end;
end;
procedure TfrmLabs.cmdPrevClick(Sender: TObject);
var
HadFocus: boolean;
begin
inherited;
HadFocus := Screen.ActiveControl = cmdPrev;
StatusText('Retrieving previous lab data...');
if Length(lblDateFloat.Caption) > 0 then GetInterimGrid(strtofloat(lblDateFloat.Caption), 1);
StatusText('');
if HadFocus then begin
if cmdPrev.Enabled then cmdPrev.SetFocus
else if cmdNext.Enabled then cmdNext.SetFocus
else lstReports.SetFocus;
end;
end;
procedure TfrmLabs.WorksheetChart(test: string; aitems: TStrings);
function OkFloatValue(value: string): boolean;
var
i, j: integer;
first, second: string;
begin
Result := false;
i := strtointdef(value, -99999);
if i <> -99999 then Result := true
else if pos('.', Copy(Value, Pos('.', Value) + 1, Length(Value))) > 0 then Result := false
else
begin
first := Piece(value, '.', 1);
second := Piece(value, '.', 2);
if length(second) > 0 then
begin
i := strtointdef(first, -99999);
j := strtointdef(second, -99999);
if (i <> -99999) and (j <> -99999) then Result := true;
end
else
begin
i :=strtointdef(first, -99999);
if i <> -99999 then Result := true;
end;
end;
end;
var
datevalue, oldstart, oldend: TDateTime;
labvalue: double;
i, numtest, numcol, numvalues, valuecount: integer;
high, low, start, stop, numspec, value, testcheck, units, specimen, testnum, testorder: string;
begin
if chkZoom.Checked and chtChart.Visible then
begin
oldstart := chtChart.BottomAxis.Minimum;
oldend := chtChart.BottomAxis.Maximum;
chtChart.UndoZoom;
chtChart.BottomAxis.Automatic := false;
chtChart.BottomAxis.Minimum := oldstart;
chtChart.BottomAxis.Maximum := oldend;
end
else
begin
chtChart.BottomAxis.Automatic := true;
end;
chtChart.Visible := true;
valuecount := 0;
testnum := Piece(test, '^', 1);
specimen := Piece(test, '^', 3);
units := Piece(test, '^', 4);
low := Piece(test, '^', 5);
high := Piece(test, '^', 6);
numtest := strtoint(Piece(aitems[0], '^', 1));
numcol := strtoint(Piece(aitems[0], '^', 2));
numvalues := strtoint(Piece(aitems[0], '^', 3));
serHigh.Clear; serLow.Clear; serTest.Clear;
if numtest > 0 then
begin
for i := 1 to numtest do
if testnum = Piece(aitems[i], '^', 2) then
begin
testorder := inttostr(i);
break;
end;
GetStartStop(start, stop, aitems);
if OKFloatValue(high) then
begin
serHigh.AddXY(FMToDateTime(start), strtofloat(high), '',clTeeColor);
serHigh.AddXY(FMToDateTime(stop), strtofloat(high), '',clTeeColor);
end;
if OKFloatValue(low) then
begin
serLow.AddXY(FMToDateTime(start), strtofloat(low), '',clTeeColor);
serLow.AddXY(FMToDateTime(stop), strtofloat(low), '',clTeeColor);
end;
numspec := Piece(specimen, '^', 1);
chtChart.Legend.Color := grdLab.Color;
chtChart.Title.Font.Size := MainFontSize;
chtChart.LeftAxis.Title.Caption := units;
serTest.Title := Piece(test, '^', 2);
serHigh.Title := 'Ref High ' + high;
serLow.Title := 'Ref Low ' + low;
testcheck := testorder;
for i := numtest + numcol + 1 to numtest + numcol + numvalues do
if Piece(aitems[i], '^', 2) = testcheck then
if Piece(aitems[numtest + strtoint(Piece(aitems[i], '^', 1))], '^', 3) = numspec then
begin
value := Piece(aitems[i], '^', 3);
if OkFloatValue(value) then
begin
labvalue := strtofloat(value);
datevalue := FMToDateTime(Piece(aitems[numtest + strtoint(Piece(aitems[i], '^', 1))], '^', 2));
serTest.AddXY(datevalue, labvalue, '', clTeeColor);
inc(valuecount);
end;
end;
end;
if valuecount = 0 then
begin
lblGraph.Left := chtChart.Left + ((chtChart.Width - lblGraph.Width) div 2);
lblGraph.Top := 2;
lblGraph.Visible := true;
if length(Piece(specimen, '^', 2)) > 0 then
pnlChart.Caption := '<No results can be graphed for ' + serTest.Title + ' in this date range.> '
else
pnlChart.Caption := '<No results can be graphed for ' + Piece(test, '^', 2) + ' in this date range.>';
chtChart.Visible := false;
end
else
lblGraph.Visible := false;
if not chkZoom.Checked then
begin
chtChart.UndoZoom;
chtChart.ZoomPercent(ZOOM_PERCENT);
end;
end;
procedure TfrmLabs.GetStartStop(var start, stop: string; aitems: TStrings);
var
numtest, numcol: integer;
begin
numtest := strtoint(Piece(aitems[0], '^', 1));
numcol := strtoint(Piece(aitems[0], '^', 2));
start := Piece(aitems[numtest + 1], '^', 2);
stop := Piece(aitems[numtest + numcol], '^', 2);
end;
procedure TfrmLabs.cmdRecentClick(Sender: TObject);
var
HadFocus: boolean;
begin
inherited;
HadFocus := Screen.ActiveControl = cmdRecent;
StatusText('Retrieving most recent lab data...');
uFormat := 1;
GetInterimGrid(FMToday + 0.2359, 1);
StatusText('');
if HadFocus and cmdPrev.Enabled then cmdPrev.SetFocus;
end;
procedure TfrmLabs.cmdOldClick(Sender: TObject);
var
HadFocus: boolean;
begin
inherited;
HadFocus := Screen.ActiveControl = cmdOld;
StatusText('Retrieving oldest lab data...');
uFormat := 1;
GetInterimGrid(2700101, -1);
if HadFocus and cmdNext.Enabled then cmdNext.SetFocus;
StatusText('');
end;
procedure TfrmLabs.FormResize(Sender: TObject);
begin
inherited;
AlignList;
lblHeaders.Height := lblReports.Height;
lblDates.Height := lblReports.Height;
lblHeading.Height := lblReports.Height;
pnlFooter.Height := lblReports.Height + 5;
lblFooter.Height := lblReports.Height;
case lstReports.ItemIEN of
1: begin // Most Recent
pnlHeader.Align := alTop;
memLab.Height := pnlLeft.Height div 5;
memLab.Top := pnlLeft.Height - pnlFooter.Height - memLab.Height;
memLab.Align := alBottom;
grdLab.Align := alClient;
if tmpGrid.Count > 0 then HGrid(tmpGrid);
if (grdLab.VisibleRowCount + 1) < grdLab.RowCount then
grdLab.ColWidths[4] := grdLab.ColWidths[4] - 18;
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
pnlFooter.Align := alBottom;
memLab.Repaint;
end;
2: begin // Cumulative
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
pnlFooter.Align := alBottom;
lblFooter.Align := alTop;
memLab.Align := alClient;
memLab.Repaint;
end;
3: begin // Interim
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
pnlFooter.Align := alBottom;
lblFooter.Caption := ' KEY: "L" = Abnormal Low, "H" = Abnormal High, "*" = Critical Value';
lblFooter.Align := alTop;
memLab.Align := alClient;
memLab.Repaint;
end;
4: begin // Interim for Selected Tests
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
pnlFooter.Align := alBottom;
lblFooter.Caption := ' KEY: "L" = Abnormal Low, "H" = Abnormal High, "*" = Critical Value';
lblFooter.Align := alTop;
memLab.Align := alClient;
memLab.Repaint;
end;
5: begin // Worksheet
pnlHeader.Align := alTop;
grdLab.Align := alClient;
ragCorGClick(self);
pnlFooter.Top := pnlLeft.Height - pnlFooter.Height;
pnlFooter.Align := alBottom;
end;
6: begin // Graph
if not uGraphingActivated then
begin
memLab.Height := pnlLeft.Height div 4;
memLab.Align := alBottom;
pnlChart.Top := pnlHeader.Height;
pnlChart.Align := alClient;
memLab.Height := pnlLeft.Height div 4;
memLab.Align := alBottom;
memLab.Repaint;
end;
end;
7: begin // Anatomic Path
memLab.Repaint;
end;
8: begin // Blood Bank
memLab.Repaint;
end;
9: begin // Microbiology
memLab.Repaint;
end;
10: begin // Lab Status
memLab.Repaint;
end;
end;
end;
procedure TfrmLabs.pnlRightResize(Sender: TObject);
begin
inherited;
pnlRight.Refresh;
lblFooter.Height := lblHeading.Height;
end;
function TfrmLabs.FMToDateTime(FMDateTime: string): TDateTime;
var
x, Year: string;
begin
{ Note: TDateTime cannot store month only or year only dates }
x := FMDateTime + '0000000';
if Length(x) > 12 then x := Copy(x, 1, 12);
if StrToInt(Copy(x, 9, 4)) > 2359 then x := Copy(x,1,7) + '.2359';
Year := IntToStr(17 + StrToInt(Copy(x,1,1))) + Copy(x,2,2);
x := Copy(x,4,2) + '/' + Copy(x,6,2) + '/' + Year + ' ' + Copy(x,9,2) + ':' + Copy(x,11,2);
Result := StrToDateTime(x);
end;
procedure TfrmLabs.chkValuesClick(Sender: TObject);
begin
inherited;
serTest.Marks.Visible := chkValues.Checked;
end;
procedure TfrmLabs.chk3DClick(Sender: TObject);
begin
inherited;
chtChart.View3D := chk3D.Checked;
end;
procedure TfrmLabs.GraphChart(test: string; aitems: TStrings);
var
datevalue: TDateTime;
labvalue: double;
i, numvalues: integer;
high, low, start, stop, value, units, specimen: string;
begin
numvalues := strtoint(Piece(aitems[0], '^', 1));
specimen := Piece(aitems[0], '^', 2);
high := Piece(aitems[0], '^', 3);
low := Piece(aitems[0], '^', 4);
units := Piece(aitems[0], '^', 5);
if numvalues > 0 then
begin
start := Piece(aitems[1], '^', 1);
stop := Piece(aitems[numvalues], '^', 1);
chtChart.Legend.Color := grdLab.Color;
serHigh.Clear; serLow.Clear; serTest.Clear;
if high <> '' then
begin
serHigh.AddXY(FMToDateTime(start), strtofloat(high), '',clTeeColor);
serHigh.AddXY(FMToDateTime(stop), strtofloat(high), '',clTeeColor);
end;
if low <> '' then
begin
serLow.AddXY(FMToDateTime(start), strtofloat(low), '',clTeeColor);
serLow.AddXY(FMToDateTime(stop), strtofloat(low), '',clTeeColor);
end;
//chtChart.Title.Text.Strings[0] := Piece(test, '^', 2) + ' (' + MixedCase(specimen) + ')';
//chtChart.Title.Font.Size := 12;
chtChart.LeftAxis.Title.Caption := units;
serTest.Title := Piece(test, '^', 2) + ' (' + MixedCase(specimen) + ')';
serHigh.Title := 'Ref High ' + high;
serLow.Title := 'Ref Low ' + low;
for i := 1 to numvalues do
begin
value := Piece(aitems[i], '^', 2);
labvalue := strtofloat(value);
datevalue := FMToDateTime(Piece(aitems[i], '^', 1));
serTest.AddXY(datevalue, labvalue, '', clTeeColor);
end;
end;
end;
procedure TfrmLabs.ragHorVClick(Sender: TObject);
begin
inherited;
if ragHorV.ItemIndex = 0 then HGrid(tmpGrid) else VGrid(tmpGrid);
end;
procedure TfrmLabs.ragCorGClick(Sender: TObject);
begin
inherited;
if ragCorG.ItemIndex = 0 then // comments
begin
chkZoom.Enabled := false;
chk3D.Enabled := false;
chkValues.Enabled := false;
pnlChart.Visible:= false;
grdLab.Align := alNone;
memLab.Height := pnlRight.Height div 6;
memLab.Top := pnlRight.Height - pnlFooter.Height - memLab.Height;
memLab.Align := alBottom;
memLab.Visible := true;
grdLab.Align := alClient;
end
else // graph
begin
chkZoom.Enabled := true;
chk3D.Enabled := true;
chkValues.Enabled := true;
chk3DClick(self);
chkValuesClick(self);
memLab.Visible := false;
grdLab.Align := alNone;
//pnlChart.Height := pnlLeft.Height - pnlOtherTests.Top - pnlFooter.Height;
//pnlChart.Top := pnlOtherTests.Top;
pnlChart.Height := pnlRight.Height div 2;
pnlChart.Top := pnlRight.Height - pnlFooter.Height - pnlChart.Height;
pnlChart.Align := alBottom;
pnlChart.Visible := true;
grdLab.Align := alClient;
if lstTestGraph.Items.Count > 0 then
begin
if lstTestGraph.ItemIndex < 0 then
lstTestGraph.ItemIndex := 0;
lstTestGraphClick(self);
end;
end;
end;
procedure TfrmLabs.lstTestGraphClick(Sender: TObject);
begin
inherited;
WorksheetChart(lstTestGraph.Items[lstTestGraph.ItemIndex], tmpGrid);
end;
procedure TfrmLabs.chkGraphValuesClick(Sender: TObject);
begin
inherited;
serTest.Marks.Visible := chkGraphValues.Checked;
end;
procedure TfrmLabs.chkGraph3DClick(Sender: TObject);
begin
inherited;
chtChart.View3D := chkGraph3D.Checked;
end;
procedure TfrmLabs.chkGraphZoomClick(Sender: TObject);
begin
inherited;
chtChart.AllowZoom := chkGraphZoom.Checked;
chtChart.AnimatedZoom := chkGraphZoom.Checked;
lblGraphInfo.Caption := 'To Zoom, hold down the mouse button while dragging an area to be enlarged.';
if chkGraphZoom.Checked then
lblGraphInfo.Caption := lblGraphInfo.Caption + #13
+ 'To Zoom Back drag to the upper left. You can also use the actions on the right mouse button.';
lblGraphInfo.Visible := chkGraphZoom.Checked;
if not chkGraphZoom.Checked then chtChart.UndoZoom;
end;
procedure TfrmLabs.GotoTop1Click(Sender: TObject);
begin
inherited;
with memLab do
begin
SetFocus;
SelStart :=0;
SelLength :=0;
end;
end;
procedure TfrmLabs.GotoBottom1Click(Sender: TObject);
var
I,CharCount : Integer;
begin
Inherited;
CharCount :=0;
with memLab do
begin
for I := 0 to lines.count-1 do
CharCount := CharCount + Length(Lines[I]) + 2;
SetFocus;
SelStart := CharCount;
SelLength :=0;
end;
end;
procedure TfrmLabs.FreezeText1Click(Sender: TObject);
var
Current, Desired : Longint;
LineCount : Integer;
begin
Inherited;
If memLab.SelLength > 0 then begin
Memo1.visible := true;
Memo1.Text := memLab.SelText;
If Memo1.Lines.Count <6 then
LineCount := Memo1.Lines.Count + 1
Else
LineCount := 5;
Memo1.Height := LineCount * frmLabs.Canvas.TextHeight(memLab.SelText);
Current := SendMessage(memLab.handle, EM_GETFIRSTVISIBLELINE, 0, 0);
Desired := SendMessage(memLab.handle, EM_LINEFROMCHAR,
memLab.SelStart + memLab.SelLength ,0);
SendMessage(memLab.Handle,EM_LINESCROLL, 0, Desired - Current);
uFrozen := True;
end;
end;
procedure TfrmLabs.UnfreezeText1Click(Sender: TObject);
begin
Inherited;
If uFrozen = True Then begin
uFrozen := False;
UnFreezeText1.Enabled := False;
Memo1.Visible := False;
Memo1.Text := '';
end;
end;
procedure TfrmLabs.PopupMenu1Popup(Sender: TObject);
begin
inherited;
If Screen.ActiveControl.Name <> memLab.Name then
begin
memLab.SetFocus;
memLab.SelStart := 0;
end;
If memLab.SelLength > 0 Then
FreezeText1.Enabled := True
Else
FreezeText1.Enabled := False;
If Memo1.Visible Then
UnFreezeText1.Enabled := True;
If memLab.SelStart > 0 then
GotoTop1.Enabled := True
Else
GotoTop1.Enabled := False;
If SendMessage(memLab.handle, EM_LINEFROMCHAR,
memLab.SelStart,0) < memLab.Lines.Count then
GotoBottom1.Enabled := True
Else
GotoBottom1.Enabled := False;
case lstReports.ItemIEN of
1: FreezeText1.Enabled := False;
5: FreezeText1.Enabled := False;
6: FreezeText1.Enabled := False;
end;
end;
procedure TfrmLabs.ProcessNotifications;
var
//AlertDate, CurrentDate: TFMDateTime;
OrderIFN: string;
begin
{uNewest := '';
uOldest := '';
GetNewestOldest(Patient.DFN, uNewest, uOldest); }
{AlertDate := Trunc(StrToFMDateTime(Piece(Piece(Notifications.RecordID, U, 2), ';', 3)));
CurrentDate := FMToday;
lstReports.ItemIndex := 2;
if AlertDate = CurrentDate then
begin
lstDates.ItemIndex := 0;
lstReports.ItemIndex := 0;
end
else if CurrentDate - AlertDate < 7 then lstDates.ItemIndex := 2
else if CurrentDate - AlertDate < 14 then lstDates.ItemIndex := 3
else if CurrentDate - AlertDate < 28 then lstDates.ItemIndex := 4
else lstDates.ItemIndex := 5;
lstReportsClick(self); }
OrderIFN := Piece(Notifications.AlertData, '@', 1);
if StrToIntDef(OrderIFN,0) > 0 then
begin
lstDates.ItemIndex := -1;
lstReports.ItemIndex := -1;
Memo1.Visible := false;
lblHeaders.Visible := false;
lstHeaders.Visible := false;
pnlOtherTests.Visible := false;
lblDates.Visible := true;
lstDates.Visible := true;
pnlHeader.Visible := false;
grdLab.Visible := false;
pnlChart.Visible := false;
WebBrowser1.Visible := false;
WebBrowser1.SendToBack;
memLab.Visible := true;
memLab.BringToFront;
pnlFooter.Visible := true;
memLab.Clear;
uLabLocalReportData.Clear;
uLabRemoteReportData.Clear;
memLab.Align := alClient;
FormResize(self);
memLab.Lines.Assign(ResultOrder(OrderIFN));
memLab.SelStart := 0;
memLab.Repaint;
lblHeading.Caption := Notifications.Text;
end
else
begin
if Patient.Inpatient then lstDates.ItemIndex := 2 else lstDates.ItemIndex := 5;
lstReports.ItemIndex := 0;
lstReportsClick(self);
end;
case Notifications.FollowUp of
NF_LAB_RESULTS : Notifications.Delete;
NF_ABNORMAL_LAB_RESULTS : Notifications.Delete;
NF_SITE_FLAGGED_RESULTS : Notifications.Delete;
NF_STAT_RESULTS : Notifications.Delete;
NF_CRITICAL_LAB_RESULTS : Notifications.Delete;
NF_LAB_THRESHOLD_EXCEEDED : Notifications.Delete;
end;
end;
procedure TfrmLabs.chkZoomClick(Sender: TObject);
begin
inherited;
chtChart.AllowZoom := chkZoom.Checked;
chtChart.AnimatedZoom := chkZoom.Checked;
if not chkZoom.Checked then
begin
chtChart.UndoZoom;
chtChart.ZoomPercent(ZOOM_PERCENT);
end;
end;
procedure TfrmLabs.chtChartUndoZoom(Sender: TObject);
begin
inherited;
chtChart.BottomAxis.Automatic := true;
end;
procedure TfrmLabs.popCopyClick(Sender: TObject);
begin
inherited;
chtChart.CopyToClipboardBitmap;
end;
procedure TfrmLabs.popChartPopup(Sender: TObject);
begin
inherited;
if pnlWorksheet.Visible then
begin
popValues.Checked := chkValues.Checked;
pop3D.Checked := chk3D.Checked;
popZoom.Checked := chkZoom.Checked;
end
else
begin
popValues.Checked := chkGraphValues.Checked;
pop3D.Checked := chkGraph3D.Checked;
popZoom.Checked := chkGraphZoom.Checked;
end;
popZoomBack.Enabled := popZoom.Checked and not chtChart.BottomAxis.Automatic;;
if chtChart.Hint <> '' then
begin
popDetails.Caption := chtChart.Hint;
popDetails.Enabled := true;
end
else
begin
popDetails.Caption := 'Details';
popDetails.Enabled := false;
end;
end;
procedure TfrmLabs.popValuesClick(Sender: TObject);
begin
inherited;
if pnlWorksheet.Visible then
begin
chkValues.Checked := not chkValues.Checked;
chkValuesClick(self);
end
else
begin
chkGraphValues.Checked := not chkGraphValues.Checked;
chkGraphValuesClick(self);
end;
end;
procedure TfrmLabs.pop3DClick(Sender: TObject);
begin
inherited;
if pnlWorksheet.Visible then
begin
chk3D.Checked := not chk3D.Checked;
chk3DClick(self);
end
else
begin
chkGraph3D.Checked := not chkGraph3D.Checked;
chkGraph3DClick(self);
end;
end;
procedure TfrmLabs.popZoomClick(Sender: TObject);
begin
inherited;
if pnlWorksheet.Visible then
begin
chkZoom.Checked := not chkZoom.Checked;
chkZoomClick(self);
end
else
begin
chkGraphZoom.Checked := not chkGraphZoom.Checked;
chkGraphZoomClick(self);
end;
end;
procedure TfrmLabs.popZoomBackClick(Sender: TObject);
begin
inherited;
chtChart.UndoZoom;
end;
procedure TfrmLabs.chtChartMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inherited;
chtChart.Hint := '';
chtChart.Tag := 0;
end;
procedure TfrmLabs.chtChartClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inherited;
if Series = serHigh then exit;
if Series = serLow then exit;
uDate1 := Series.XValue[ValueIndex];
uDate2 := uDate1;
chtChart.Hint := 'Details - Lab results for ' + FormatDateTime('dddd, mmmm d, yyyy', Series.XValue[ValueIndex]) + '...';
chtChart.Tag := ValueIndex + 1;
if Button <> mbRight then popDetailsClick(self);
end;
procedure TfrmLabs.chtChartClickLegend(Sender: TCustomChart;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
chtChart.Hint := 'Details - for ' + Piece(serTest.Title, '(', 1) + '...';
chtChart.Tag := 0;
if Button <> mbRight then popDetailsClick(self);
end;
procedure TfrmLabs.popDetailsClick(Sender: TObject);
var
tmpList: TStringList;
date1, date2: TFMDateTime;
strdate1, strdate2: string;
begin
inherited;
Screen.Cursor := crHourGlass;
if chtChart.Tag > 0 then
begin
tmpList := TStringList.Create;
try
strdate1 := FormatDateTime('mm/dd/yyyy', uDate1);
strdate2 := FormatDateTime('mm/dd/yyyy', uDate2);
uDate1 := StrToDateTime(strdate1);
uDate2 := StrToDateTime(strdate2);
date1 := DateTimeToFMDateTime(uDate1 + 1);
date2 := DateTimeToFMDateTime(uDate2);
StatusText('Retrieving data for ' + FormatDateTime('dddd, mmmm d, yyyy', uDate2) + '...');
Interim(tmpList, Patient.DFN, date1, date2,'ORWLRR INTERIM');
ReportBox(tmpList, 'Lab results on ' + Patient.Name + ' for ' + FormatDateTime('dddd, mmmm d, yyyy', uDate2), True);
finally
tmplist.Free;
end;
end
else
begin
date1 := DateTimeToFMDateTime(chtChart.BottomAxis.Maximum);
date2 := DateTimeToFMDateTime(chtChart.BottomAxis.Minimum);
tmpList := TStringList.Create;
try
if lstTestGraph.ItemIndex > -1 then
tmpList.Add(lstTestGraph.Items[lstTestGraph.ItemIndex])
else
tmpList.Add(Piece(lblSingleTest.Caption, '^', 1));
StatusText('Retrieving data for ' + serTest.Title + '...');
ReportBox(InterimSelect(Patient.DFN, date1, date2, tmpList), Piece(serTest.Title, '(', 1) + 'results on ' + Patient.Name, True);
finally
tmpList.Free;
end;
end;
Screen.Cursor := crDefault;
StatusText('');
end;
procedure TfrmLabs.popPrintClick(Sender: TObject);
begin
inherited;
if chtChart.Visible then PrintLabGraph;
end;
procedure TfrmLabs.PrintLabGraph;
var
GraphTitle: string;
begin
inherited;
GraphTitle := Piece(lblSingleTest.Caption, '^', 2);
if (Length(lblSpecimen.Caption) > 2) then GraphTitle := GraphTitle + ' (' + Piece(lblSpecimen.Caption, '^', 2) + ')';
GraphTitle := GraphTitle + ' - ' + lstDates.DisplayText[lstDates.ItemIndex];
if dlgWinPrint.Execute then PrintGraph(chtChart, GraphTitle);
end;
procedure TfrmLabs.BeginEndDates(var ADate1, ADate2: TFMDateTime; var ADaysBack: integer);
var
datetemp: TFMDateTime;
today, datetime1, datetime2: TDateTime;
relativedate: string;
begin
today := FMToDateTime(floattostr(FMToday));
relativedate := Piece(lstDates.ItemID, ';', 1);
relativedate := Piece(relativedate, '-', 2);
ADaysBack := strtointdef(relativedate, 0);
ADate1 := DateTimeToFMDateTime(today - ADaysBack);
relativedate := Piece(lstDates.ItemID, ';', 2);
if StrToIntDef(Piece(relativedate, '+', 2), 0) > 0 then
begin
relativedate := Piece(relativedate, '+', 2);
ADaysBack := strtointdef(relativedate, 0);
ADate2 := DateTimeToFMDateTime(today + ADaysBack + 1);
end
else
begin
relativedate := Piece(relativedate, '-', 2);
ADaysBack := strtointdef(relativedate, 0);
ADate2 := DateTimeToFMDateTime(today - ADaysBack);
end;
datetime1 := FMDateTimeToDateTime(ADate1);
datetime2 := FMDateTimeToDateTime(ADate2);
if datetime1 < datetime2 then // reorder dates, if needed
begin
datetemp := ADate1;
ADate1 := ADate2;
ADate2 := datetemp
end;
ADate1 := ADate1 + 0.2359;
end;
procedure TfrmLabs.Timer1Timer(Sender: TObject);
var
i,j: integer;
r0: String;
begin
inherited;
with RemoteSites.SiteList do
begin
for i := 0 to Count - 1 do
if TRemoteSite(Items[i]).Selected then
if Length(TRemoteSite(Items[i]).LabRemoteHandle) > 0 then
begin
r0 := GetRemoteStatus(TRemoteSite(Items[i]).LabRemoteHandle);
TRemoteSite(Items[i]).LabQueryStatus := r0; //r0='1^Done' if no errors
if piece(r0,'^',1) = '1' then
begin
RemoteReports.Add(TRemoteSite(Items[i]).CurrentLabQuery,
TRemoteSite(Items[i]).LabRemoteHandle);
GetRemoteData(TRemoteSite(Items[i]).LabData,
TRemoteSite(Items[i]).LabRemoteHandle,Items[i]);
TRemoteSite(Items[i]).LabRemoteHandle := '';
TabControl1.OnChange(nil);
end
else
begin
uRemoteCount := uRemoteCount + 1;
if uRemoteCount > 60 then //5 minute limit
begin
Timer1.Enabled := False;
TRemoteSite(Items[i]).LabQueryStatus := '-1^Timed out';
UpdateRemoteStatus(TRemoteSite(Items[i]).SiteID, 'Timed out');
StatusText('');
TabControl1.OnChange(nil);
end
else
StatusText('Retrieving Lab data from '
+ TRemoteSite(Items[i]).SiteName + '...');
end;
Timer1.Interval := 5000;
end;
if Timer1.Enabled = True then
begin
j := 0;
for i := 0 to Count -1 do
if Length(TRemoteSite(Items[i]).LabRemoteHandle) > 0 then
j := 1;
if j = 0 then //Shutdown timer if all sites have been processed
begin
Timer1.Enabled := False;
StatusText('');
end;
j := 0;
for i := 0 to Count -1 do
if TRemoteSite(Items[i]).Selected = true then
j := 1;
if j = 0 then //Shutdown timer if user has de-selected all sites
begin
Timer1.Enabled := False;
StatusText('');
TabControl1.OnChange(nil);
end;
end;
end;
end;
procedure TfrmLabs.GoRemote(Dest: TStringList; AItem, AReportID: Int64; AQualifier,
ARpc, AHSType, ADaysBack, ASection: string; ADate1, ADate2: TFMDateTime);
var
i,j: integer;
LocalHandle, Report, Query: String;
begin
{ AReportID := 1 Generic report RemoteLabReports
2 Cumulative RemoteLabCumulative
3 Interim RemoteLabInterim
4 Microbioloby RemoteLabMicro }
with RemoteSites.SiteList do
for i := 0 to Count - 1 do
if TRemoteSite(Items[i]).Selected then
begin
TRemoteSite(Items[i]).LabClear;
if (LeftStr(TRemoteSite(Items[i]).SiteID, 5) = '200HD') then
begin
TRemoteSite(Items[i]).LabQueryStatus := '1^Not Included';
UpdateRemoteStatus(TRemoteSite(Items[i]).SiteID, 'NOT INCLUDED');
TabControl1.OnChange(nil);
continue;
end;
TRemoteSite(Items[i]).CurrentLabQuery := 'Lab' + Patient.DFN + ';' + Patient.ICN +
'^' + IntToStr(AItem) + '^' + IntToStr(AReportID) + '^^' + ARpc + '^' + AHSType +
'^' + ADaysBack + '^' + ASection + '^' + DateToStr(ADate1) + '^' + DateToStr(ADate2) + '^' +
TRemoteSite(Items[i]).SiteID;
LocalHandle := '';
for j := 0 to RemoteReports.Count - 1 do
begin
Query := TRemoteSite(Items[i]).CurrentLabQuery;
Report := TRemoteReport(RemoteReports.ReportList.Items[j]).Report;
if Report = Query then
begin
LocalHandle := TRemoteReport(RemoteReports.ReportList.Items[j]).Handle;
break;
end;
end;
if Length(LocalHandle) > 1 then
with RemoteSites.SiteList do
begin
GetRemoteData(TRemoteSite(Items[i]).LabData,LocalHandle,Items[i]);
TRemoteSite(Items[i]).LabRemoteHandle := '';
TRemoteSite(Items[i]).LabQueryStatus := '1^Done';
UpdateRemoteStatus(TRemoteSite(Items[i]).SiteID, 'Done');
TabControl1.OnChange(nil);
end
else
begin
case AReportID of
1: begin
RemoteLabReports(Dest, Patient.DFN + ';' + Patient.ICN, IntToStr(AItem),
AHSType, ADaysBack, ASection, ADate1, ADate2,
TRemoteSite(Items[i]).SiteID, ARpc);
end;
2: begin
RemoteLabCumulative(Dest, Patient.DFN + ';' + Patient.ICN,
StrToInt(Adaysback), Adate1, Adate2, TRemoteSite(Items[i]).SiteID,ARpc);
end;
3: begin
RemoteLabInterim(Dest, Patient.DFN + ';' + Patient.ICN, Adate1, Adate2,
TRemoteSite(Items[i]).SiteID, ARpc);
end;
4: begin
RemoteLabMicro(Dest, Patient.DFN + ';' + Patient.ICN, Adate1, Adate2,
TRemoteSite(Items[i]).SiteID, ARpc);
end;
else begin
RemoteLab(Dest, Patient.DFN + ';' + Patient.ICN, IntToStr(AItem),
AHSType, ADaysBack, ASection, ADate1, ADate2,
TRemoteSite(Items[i]).SiteID, ARpc);
end;
end;
if Dest[0] = '' then
begin
TRemoteSite(Items[i]).LabQueryStatus := '-1^Communication error';
UpdateRemoteStatus(TRemoteSite(Items[i]).SiteID, 'Communication error');
end
else
begin
TRemoteSite(Items[i]).LabRemoteHandle := Dest[0];
TRemoteSite(Items[i]).LabQueryStatus := '0^initialization...';
UpdateRemoteStatus(TRemoteSite(Items[i]).SiteID, 'Initialization');
Timer1.Enabled := True;
StatusText('Retrieving reports from '
+ TRemoteSite(Items[i]).SiteName + '...');
end;
end;
end;
end;
procedure TfrmLabs.TabControl1Change(Sender: TObject);
var
aStatus: string;
hook: Boolean;
i: integer;
begin
inherited;
memLab.Lines.Clear;
lstHeaders.Items.Clear;
with TabControl1 do
begin
memLab.Lines.BeginUpdate;
if TabIndex > 0 then
begin
aStatus := TRemoteSite(Tabs.Objects[TabIndex]).LabQueryStatus;
if aStatus = '1^Done' then
begin
if Piece(TRemoteSite(Tabs.Objects[TabIndex]).LabData[0],'^',1) = '[HIDDEN TEXT]' then
begin
lstHeaders.Clear;
hook := false;
for i := 1 to TRemoteSite(Tabs.Objects[TabIndex]).LabData.Count - 1 do
if hook = true then
memLab.Lines.Add(TRemoteSite(Tabs.Objects[TabIndex]).LabData[i])
else
begin
lstHeaders.Items.Add(MixedCase(TRemoteSite(Tabs.Objects[TabIndex]).LabData[i]));
if Piece(TRemoteSite(Tabs.Objects[TabIndex]).LabData[i],'^',1) = '[REPORT TEXT]' then
hook := true;
end;
end
else
QuickCopy(TRemoteSite(Tabs.Objects[TabIndex]).LabData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
end;
if Piece(aStatus,'^',1) = '-1' then
memLab.Lines.Add('Remote data transmission error: ' + Piece(aStatus,'^',2));
if Piece(aStatus,'^',1) = '0' then
memLab.Lines.Add('Transmission in progress: ' + Piece(aStatus,'^',2));
if Piece(aStatus,'^',1) = '' then
memLab.Lines.Add('Select a report...');
end
else
if uLabLocalReportData.Count > 0 then
begin
if Piece(uLabLocalReportData[0],'^',1) = '[HIDDEN TEXT]' then
begin
lstHeaders.Clear;
hook := false;
for i := 1 to uLabLocalReportData.Count - 1 do
if hook = true then
memLab.Lines.Add(uLabLocalReportData[i])
else
begin
lstHeaders.Items.Add(MixedCase(uLabLocalReportData[i]));
if Piece(uLabLocalReportData[i],'^',1) = '[REPORT TEXT]' then
hook := true;
end;
end
else
QuickCopy(uLabLocalReportData,memLab);
memLab.Lines.Insert(0,' ');
memLab.Lines.Delete(0);
end;
memLab.SelStart := 0;
memLab.Lines.EndUpdate;
end;
end;
procedure TfrmLabs.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
WebDoc: IHtmlDocument2;
v: variant;
begin
inherited;
if uHTMLDoc = '' then Exit;
if not(uReportType = 'H') then Exit; //this can be removed if & when browser replaces memtext control
if not Assigned(WebBrowser1.Document) then Exit;
WebDoc := WebBrowser1.Document as IHtmlDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := uHTMLDoc;
WebDoc.write(PSafeArray(TVarData(v).VArray));
WebDoc.close;
//uHTMLDoc := '';
end;
procedure TfrmLabs.ChkBrowser;
begin
if uReportType = 'H' then
begin
WebBrowser1.Visible := true;
WebBrowser1.Navigate('about:blank');
WebBrowser1.BringToFront;
memLab.Visible := false;
end
else
begin
WebBrowser1.Visible := false;
WebBrowser1.SendToBack;
memLab.Visible := true;
memLab.BringToFront;
end;
end;
procedure TfrmLabs.CommonComponentVisible(A1,A2,A3,A4,A5,A6,A7,A8,A9: Boolean);
begin
lstDates.Visible := false; // turned off to realign correctly
lblDates.Visible := false;
pnlOtherTests.Visible := false;
lstHeaders.Visible := false;
lblHeaders.Visible := false;
lstDates.Visible := A5; // reordered to realign
lblDates.Visible := A4;
pnlOtherTests.Visible := A3;
lstHeaders.Visible := A2;
lblHeaders.Visible := A1;
pnlHeader.Visible := A6;
grdLab.Visible := A7;
pnlChart.Visible := A8;
pnlFooter.Visible := A9;
if A4 and A1 and (lblDates.Top < lblHeaders.Top) then
begin
lblDates.Caption := 'Headings'; // swithes captions if not aligned
lblHeaders.Caption := 'Date Range';
end
else
begin
lblDates.Caption := 'Date Range';
lblHeaders.Caption := 'Headings';
end;
lstDates.Caption := lblDates.Caption;
lstHeaders.Caption := lblHeaders.Caption;
end;
procedure TfrmLabs.Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if (Key = VK_TAB) then
begin
if ssShift in Shift then
begin
FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
Key := 0;
end
else if ssCtrl in Shift then
begin
FindNextControl(Sender as TWinControl, True, True, False).SetFocus; //next control
Key := 0;
end;
end;
if (key = VK_ESCAPE) then begin
FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
key := 0;
end;
end;
end.