499 lines
19 KiB
Plaintext
499 lines
19 KiB
Plaintext
unit fLabPrint;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, ORCtrls, ORNet, Mask, ComCtrls, fBase508Form,
|
|
VA508AccessibilityManager;
|
|
|
|
type
|
|
TfrmLabPrint = class(TfrmBase508Form)
|
|
lblLabTitle: TMemo;
|
|
lblPrintTo: TLabel;
|
|
grpDevice: TGroupBox;
|
|
lblMargin: TLabel;
|
|
lblLength: TLabel;
|
|
txtRightMargin: TMaskEdit;
|
|
txtPageLength: TMaskEdit;
|
|
cboDevice: TORComboBox;
|
|
cmdOK: TButton;
|
|
cmdCancel: TButton;
|
|
dlgWinPrinter: TPrintDialog;
|
|
chkDefault: TCheckBox;
|
|
procedure cboDeviceChange(Sender: TObject);
|
|
procedure cboDeviceNeedData(Sender: TObject; const StartFrom: String;
|
|
Direction, InsertAt: Integer);
|
|
procedure cmdOKClick(Sender: TObject);
|
|
procedure cmdCancelClick(Sender: TObject);
|
|
procedure FindVType;
|
|
private
|
|
{ Private declarations }
|
|
FReports: String;
|
|
FDaysBack: Integer;
|
|
FReportText: TRichEdit;
|
|
procedure DisplaySelectDevice;
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
frmLabPrint: TfrmLabPrint;
|
|
|
|
procedure PrintLabs(AReports: String; const ALabTitle: string; ADaysBack: Integer); //Lontint
|
|
function StringPad(aString: string; aStringCount, aPadCount: integer): String;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
uses ORFn, rCore, uCore, fLabs, rLabs, Printers, rReports, fFrame, uReports;
|
|
|
|
const
|
|
TX_NODEVICE = 'A device must be selected to print, or press ''Cancel'' to not print.';
|
|
TX_NODEVICE_CAP = 'Device Not Selected';
|
|
TX_ERR_CAP = 'Print Error';
|
|
PAGE_BREAK = '**PAGE BREAK**';
|
|
QT_OTHER = 0;
|
|
QT_HSTYPE = 1;
|
|
QT_DATERANGE = 2;
|
|
QT_IMAGING = 3;
|
|
QT_NUTR = 4;
|
|
QT_PROCEDURES = 19;
|
|
QT_SURGERY = 28;
|
|
QT_HSCOMPONENT = 5;
|
|
QT_HSWPCOMPONENT = 6;
|
|
|
|
procedure PrintLabs(AReports: String; const ALabTitle: string; ADaysBack: Integer);
|
|
{ displays a form that prompts for a device and then prints the report }
|
|
var
|
|
frmLabPrint: TfrmLabPrint;
|
|
DefPrt: string;
|
|
begin
|
|
frmLabPrint := TfrmLabPrint.Create(Application);
|
|
try
|
|
ResizeAnchoredFormToFont(frmLabPrint);
|
|
with frmLabPrint do
|
|
begin
|
|
lblLabTitle.Text := ALabTitle;
|
|
FReports := AReports;
|
|
FDaysBack := ADaysBack;
|
|
DefPrt := GetDefaultPrinter(User.Duz, Encounter.Location);
|
|
if User.CurrentPrinter = '' then User.CurrentPrinter := DefPrt;
|
|
with cboDevice do
|
|
begin
|
|
if Printer.Printers.Count > 0 then
|
|
begin
|
|
Items.Add('WIN;Windows Printer^Windows Printer');
|
|
Items.Add('^--------------------VistA Printers----------------------');
|
|
end;
|
|
if User.CurrentPrinter <> '' then
|
|
begin
|
|
InitLongList(Piece(User.CurrentPrinter, ';', 2));
|
|
SelectByID(User.CurrentPrinter);
|
|
end
|
|
else
|
|
InitLongList('');
|
|
end;
|
|
if (DefPrt = 'WIN;Windows Printer') and
|
|
(User.CurrentPrinter = DefPrt) then
|
|
cmdOKClick(frmLabPrint)
|
|
else
|
|
ShowModal;
|
|
end;
|
|
finally
|
|
frmLabPrint.Release;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmLabPrint.DisplaySelectDevice;
|
|
begin
|
|
with cboDevice, lblPrintTo do
|
|
begin
|
|
Caption := 'Print Report on: ' + Piece(ItemID, ';', 2);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmLabPrint.cboDeviceChange(Sender: TObject);
|
|
begin
|
|
inherited;
|
|
with cboDevice do if ItemIndex > -1 then
|
|
begin
|
|
txtRightMargin.Text := Piece(Items[ItemIndex], '^', 4);
|
|
txtPageLength.Text := Piece(Items[ItemIndex], '^', 5);
|
|
DisplaySelectDevice;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmLabPrint.cboDeviceNeedData(Sender: TObject;
|
|
const StartFrom: String; Direction, InsertAt: Integer);
|
|
begin
|
|
inherited;
|
|
cboDevice.ForDataUse(SubsetOfDevices(StartFrom, Direction));
|
|
end;
|
|
|
|
function StringPad(aString: string; aStringCount, aPadCount: integer): String;
|
|
var
|
|
s: integer;
|
|
begin
|
|
if aStringCount >= aPadCount then
|
|
aStringCount := aPadCount - 1;
|
|
Result := copy(aString, 1, aStringCount);
|
|
s := aPadCount - length(Result);
|
|
if s < 0 then s := 0;
|
|
Result := Result + StringOfChar(' ', s);
|
|
end;
|
|
|
|
procedure TfrmLabPrint.cmdOKClick(Sender: TObject);
|
|
var
|
|
ADevice, ErrMsg: string;
|
|
daysback: integer;
|
|
date1, date2: TFMDateTime;
|
|
today: TDateTime;
|
|
RemoteSiteID: string; //for Remote site printing
|
|
RemoteQuery: string; //for Remote site printing
|
|
ListItem: TListItem;
|
|
aReport: TStringList;
|
|
aQualifier: string;
|
|
i: integer;
|
|
MoreID: String; //Restores MaxOcc value
|
|
aCaption: string;
|
|
begin
|
|
inherited;
|
|
FReportText := CreateReportTextComponent(Self);
|
|
RemoteSiteID := '';
|
|
RemoteQuery := '';
|
|
MoreID := '';
|
|
aReport := TStringList.Create;
|
|
if uQualifier = '' then
|
|
aQualifier := piece(uRemoteType,'^',5) //Health Summary Type Report
|
|
else
|
|
begin
|
|
MoreID := ';' + Piece(uQualifier,';',3);
|
|
aQualifier := piece(uRemoteType,'^',5);
|
|
end;
|
|
with frmLabs.TabControl1 do
|
|
if TabIndex > 0 then
|
|
begin
|
|
RemoteSiteID := TRemoteSite(Tabs.Objects[TabIndex]).SiteID;
|
|
RemoteQuery := TRemoteSite(Tabs.Objects[TabIndex]).CurrentLabQuery;
|
|
end;
|
|
if cboDevice.ItemID = '' then
|
|
begin
|
|
InfoBox(TX_NODEVICE, TX_NODEVICE_CAP, MB_OK);
|
|
Exit;
|
|
end;
|
|
today := frmLabs.FMToDateTime(floattostr(FMToday));
|
|
if frmLabs.lstDates.ItemIEN > 0 then
|
|
begin
|
|
daysback := frmLabs.lstDates.ItemIEN;
|
|
date1 := FMToday;
|
|
If daysback = 1 then
|
|
date2 := DateTimeToFMDateTime(today)
|
|
Else
|
|
date2 := DateTimeToFMDateTime(today - daysback);
|
|
end
|
|
else
|
|
frmLabs.BeginEndDates(date1,date2,daysback);
|
|
date1 := date1 + 0.2359;
|
|
if Piece(cboDevice.ItemID, ';', 1) = 'WIN' then
|
|
begin
|
|
if dlgWinPrinter.Execute then with FReportText do
|
|
begin
|
|
if uReportType = 'V' then
|
|
begin
|
|
case uQualifierType of
|
|
QT_IMAGING:
|
|
begin
|
|
for i := 0 to frmLabs.lvReports.Items.Count - 1 do
|
|
if frmLabs.lvReports.Items[i].Selected then
|
|
begin
|
|
ListItem := frmLabs.lvReports.Items[i];
|
|
aQualifier := ListItem.SubItems[0];
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier,
|
|
Patient.DFN, nil , RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4); //nil used to be uHSComponents
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_NUTR:
|
|
begin
|
|
for i := 0 to frmLabs.lvReports.Items.Count - 1 do
|
|
if frmLabs.lvReports.Items[i].Selected then
|
|
begin
|
|
ListItem := frmLabs.lvReports.Items[i];
|
|
aQualifier := ListItem.SubItems[0];
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
|
|
Patient.DFN, nil, RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_HSCOMPONENT:
|
|
begin
|
|
if (length(piece(uHState,';',2)) > 0) then
|
|
begin
|
|
FReportText.Clear;
|
|
aReport.Clear;
|
|
CreatePatientHeader(aReport,piece(uRemoteType,'^',4));
|
|
QuickCopy(aReport, FReportText);
|
|
FindVType;
|
|
aCaption := piece(uRemoteType,'^',4) + ';1';
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end
|
|
else
|
|
begin
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
|
|
Patient.DFN, nil, RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_HSWPCOMPONENT:
|
|
begin
|
|
if (length(piece(uHState,';',2)) > 0) then
|
|
begin
|
|
FReportText.Clear;
|
|
aReport.Clear;
|
|
CreatePatientHeader(aReport,piece(uRemoteType,'^',4));
|
|
QuickCopy(aReport, FReportText);
|
|
FindVType;
|
|
aCaption := piece(uRemoteType,'^',4) + ';1';
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end
|
|
else
|
|
begin
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
|
|
Patient.DFN, nil, RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_PROCEDURES:
|
|
begin
|
|
for i := 0 to frmLabs.lvReports.Items.Count - 1 do
|
|
if frmLabs.lvReports.Items[i].Selected then
|
|
begin
|
|
ListItem := frmLabs.lvReports.Items[i];
|
|
aQualifier := ListItem.SubItems[0];
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier,
|
|
Patient.DFN, nil, RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_SURGERY:
|
|
begin
|
|
for i := 0 to frmLabs.lvReports.Items.Count - 1 do
|
|
if frmLabs.lvReports.Items[i].Selected then
|
|
begin
|
|
ListItem := frmLabs.lvReports.Items[i];
|
|
aQualifier := ListItem.SubItems[0];
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
QuickCopy(GetFormattedReport(FReports, aQualifier,
|
|
Patient.DFN, nil, RemoteSiteID, RemoteQuery, uHState), FReportText);
|
|
aCaption := piece(uRemoteType,'^',4);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
QuickCopy(GetFormattedLabReport(FReports, FDaysBack, Patient.DFN,
|
|
frmLabs.lstTests.Items, date1, date2, RemoteSiteID, RemoteQuery), FReportText);
|
|
PrintWindowsReport(FReportText, PAGE_BREAK, Self.Caption, ErrMsg);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
end
|
|
else // if it's not a Win printer
|
|
begin
|
|
if uReportType = 'V' then
|
|
begin
|
|
case uQualifierType of
|
|
QT_HSCOMPONENT:
|
|
begin
|
|
if (length(piece(uHState,';',2)) > 0) then
|
|
begin
|
|
FindVType;
|
|
aReport.Clear;
|
|
QuickCopy(FReportText.Lines, aReport);
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
PrintVReports(ErrMsg, ADevice, piece(uRemoteType,'^',4),aReport);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end
|
|
else
|
|
begin
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
PrintReportsToDevice(FReports, aQualifier + MoreID,
|
|
Patient.DFN, ADevice, ErrMsg, nil, RemoteSiteID, RemoteQuery, uHState);
|
|
ErrMsg := Piece(FReportText.Lines[0], U, 2);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
QT_HSWPCOMPONENT:
|
|
begin
|
|
if (length(piece(uHState,';',2)) > 0) then
|
|
begin
|
|
FindVType;
|
|
aReport.Clear;
|
|
QuickCopy(FReportText, aReport);
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
PrintVReports(ErrMsg, ADevice, piece(uRemoteType,'^',4),aReport);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end
|
|
else
|
|
begin
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
PrintReportsToDevice(FReports, aQualifier + MoreID,
|
|
Patient.DFN, ADevice, ErrMsg, nil, RemoteSiteID, RemoteQuery, uHState);
|
|
ErrMsg := Piece(FReportText.Lines[0], U, 2);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
ADevice := Piece(cboDevice.ItemID, ';', 2);
|
|
PrintLabsToDevice(FReports, FDaysBack, Patient.DFN, ADevice,
|
|
frmLabs.lstTests.Items, ErrMsg, date1, date2, RemoteSiteID, RemoteQuery);
|
|
ErrMsg := Piece(FReportText.Lines[0], U, 2);
|
|
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
|
|
end;
|
|
end;
|
|
if chkDefault.Checked then SaveDefaultPrinter(Piece(cboDevice.ItemID, ';', 1));
|
|
User.CurrentPrinter := cboDevice.ItemID;
|
|
aReport.Free;
|
|
FReportText.Free;
|
|
Close;
|
|
end;
|
|
procedure TfrmLabPrint.FindVType;
|
|
var
|
|
i,j,k,L,cnt: integer;
|
|
aBasket: TStringList;
|
|
aID, aHead, aData, aCol, x: string;
|
|
ListItem: TListItem;
|
|
aWPFlag: Boolean;
|
|
begin
|
|
aBasket := TStringList.Create;
|
|
aBasket.Clear;
|
|
aHead := '';
|
|
cnt := 2;
|
|
for i := 0 to uColumns.Count - 1 do
|
|
begin
|
|
if (piece(uColumns[i],'^',7) = '1') and (not(piece(uColumns[i],'^',4) = '1')) then
|
|
begin
|
|
L := StrToIntDef(piece(uColumns[i],'^',6),15);
|
|
if length(piece(uColumns[i],'^',8)) > 0 then
|
|
x := piece(uColumns[i],'^',8)
|
|
else
|
|
x := piece(uColumns[i],'^',1);
|
|
x := StringPad(x, L, L+1);
|
|
if frmLabs.TabControl1.Tabs.Count > 1 then
|
|
aHead := aHead + x
|
|
else
|
|
if i = 0 then
|
|
continue
|
|
else
|
|
aHead := aHead + x;
|
|
end;
|
|
end;
|
|
if length(aHead) > 0 then
|
|
begin
|
|
FReportText.Lines.Add(aHead);
|
|
FReportText.Lines.Add('-------------------------------------------------------------------------------');
|
|
end;
|
|
for i := 0 to frmLabs.lvReports.Items.Count - 1 do
|
|
if frmLabs.lvReports.Items[i].Selected then
|
|
begin
|
|
aData := '';
|
|
aWPFlag := false;
|
|
ListItem := frmLabs.lvReports.Items[i];
|
|
aID := ListItem.SubItems[0];
|
|
if frmLabs.TabControl1.Tabs.Count > 1 then
|
|
begin
|
|
L := StrToIntDef(piece(uColumns[0],'^',6),10);
|
|
x := StringPad(ListItem.Caption, L, L+1);
|
|
aData := x;
|
|
end;
|
|
for j := 0 to LabRowObjects.ColumnList.Count - 1 do
|
|
begin
|
|
aCol := TCellObject(LabRowObjects.ColumnList[j]).Handle;
|
|
if piece(aID,':',1) = piece(TCellObject(LabRowObjects.ColumnList[j]).Handle,':',1) then
|
|
if ListItem.Caption = (piece(TCellObject(LabRowObjects.ColumnList[j]).Site,';',1)) then
|
|
begin
|
|
if (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',7) = '1') and
|
|
(not (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',4) = '1')) then
|
|
begin
|
|
FastAssign(TCellObject(LabRowObjects.ColumnList[j]).Data, aBasket);
|
|
for k := 0 to aBasket.Count - 1 do
|
|
begin
|
|
L := StrToIntDef(piece(uColumns[StrToInt(piece(aCol,':',2))],'^',6),15);
|
|
x := StringPad(aBasket[k], L, L+1);
|
|
aData := aData + x;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
FReportText.Lines.Add(aData);
|
|
cnt := cnt + 1;
|
|
if cnt > 40 then
|
|
begin
|
|
cnt := 0;
|
|
FReportText.Lines.Add('**PAGE BREAK**');
|
|
end;
|
|
for j := 0 to LabRowObjects.ColumnList.Count - 1 do
|
|
begin
|
|
aCol := TCellObject(LabRowObjects.ColumnList[j]).Handle;
|
|
if piece(aID,':',1) = piece(TCellObject(LabRowObjects.ColumnList[j]).Handle,':',1) then
|
|
if ListItem.Caption = (piece(TCellObject(LabRowObjects.ColumnList[j]).Site,';',1)) then
|
|
begin
|
|
if (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',7) = '1') and
|
|
(piece(uColumns[StrToInt(piece(aCol,':',2))],'^',4) = '1') then
|
|
begin
|
|
aWPFlag := true;
|
|
FastAssign(TCellObject(LabRowObjects.ColumnList[j]).Data, aBasket);
|
|
FReportText.Lines.Add(TCellObject(LabRowObjects.ColumnList[j]).Name);
|
|
cnt := cnt + 1;
|
|
for k := 0 to aBasket.Count - 1 do
|
|
begin
|
|
FReportText.Lines.Add('' + aBasket[k]);
|
|
cnt := cnt + 1;
|
|
if cnt > 40 then
|
|
begin
|
|
cnt := 0;
|
|
FReportText.Lines.Add('**PAGE BREAK**');
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if aWPFlag = true then
|
|
begin
|
|
FReportText.Lines.Add('===============================================================================');
|
|
end;
|
|
end;
|
|
aBasket.Free;
|
|
end;
|
|
|
|
procedure TfrmLabPrint.cmdCancelClick(Sender: TObject);
|
|
begin
|
|
inherited;
|
|
Close;
|
|
end;
|
|
|
|
end.
|