VistA-cprs/CPRS-Chart/uReminders.pas

7015 lines
223 KiB
Plaintext
Raw Permalink Blame History

unit uReminders;
interface
uses
Windows, Messages, Classes, Controls, StdCtrls, SysUtils, ComCtrls, Menus,
Graphics, Forms, ORClasses, ORCtrls, ORDtTm, ORFn, ORNet, Dialogs, uPCE, uVitals,
ExtCtrls, fDrawers, fDeviceSelect, TypInfo;
type
TReminderDialog = class(TObject)
private
FDlgData: string;
FElements: TStringList; // list of TRemDlgElement objects
FOnNeedRedraw: TNotifyEvent;
FNeedRedrawCount: integer;
FOnTextChanged: TNotifyEvent;
FTextChangedCount: integer;
FPCEDataObj: TPCEData;
FNoResolve: boolean;
FWHReviewIEN: string; // AGP CHANGE 23.13 Allow for multiple processing of WH Review of Result Reminders
FRemWipe: integer;
FMHTestArray: TORStringList;
protected
function GetIEN: string; virtual;
function GetPrintName: string; virtual;
procedure BeginNeedRedraw;
procedure EndNeedRedraw(Sender: TObject);
procedure BeginTextChanged;
procedure EndTextChanged(Sender: TObject);
function GetDlgSL: TORStringList;
procedure ComboBoxResized(Sender: TObject);
procedure ComboBoxCheckedText(Sender: TObject; NumChecked: integer; var Text: string);
function AddData(Lst: TStrings; Finishing: boolean = FALSE; Historical: boolean = FALSE): integer;
function Visible: boolean;
public
constructor BaseCreate;
constructor Create(ADlgData: string);
destructor Destroy; override;
procedure FinishProblems(List: TStrings; var MissingTemplateFields: boolean);
function BuildControls(ParentWidth: integer; AParent, AOwner: TWinControl): TWinControl;
function Processing: boolean;
procedure AddText(Lst: TStrings);
property PrintName: string read GetPrintName;
property IEN: string read GetIEN;
property Elements: TStringList read FElements;
property OnNeedRedraw: TNotifyEvent read FOnNeedRedraw write FOnNeedRedraw;
property OnTextChanged: TNotifyEvent read FOnTextChanged write FOnTextChanged;
property PCEDataObj: TPCEData read FPCEDataObj write FPCEDataObj;
property DlgData: string read FDlgData; //AGP Change 24.8
property WHReviewIEN: string read FWHReviewIEN write FWHReviewIEN; //AGP CHANGE 23.13
property RemWipe: integer read FRemWipe write FRemWipe;
property MHTestArray: TORStringList read FMHTestArray write FMHTestArray;
end;
TReminder = class(TReminderDialog)
private
FRemData: string;
FCurNodeID: string;
protected
function GetDueDateStr: string;
function GetLastDateStr: string;
function GetIEN: string; override;
function GetPrintName: string; override;
function GetPriority: integer;
function GetStatus: string;
public
constructor Create(ARemData: string);
property DueDateStr: string read GetDueDateStr;
property LastDateStr: string read GetLastDateStr;
property Priority: integer read GetPriority;
property Status: string read GetStatus;
property RemData: string read FRemData;
property CurrentNodeID: string read FCurNodeID write FCurNodeID;
end;
TRDChildReq = (crNone, crOne, crAtLeastOne, crNoneOrOne, crAll);
TRDElemType = (etCheckBox, etTaxonomy, etDisplayOnly);
TRemPrompt = class;
TRemDlgElement = class(TObject)
private
FReminder: TReminderDialog;
FParent: TRemDlgElement;
FChildren: TList; // Points to other TRemDlgElement objects
FData: TList; // List of TRemData objects
FPrompts: TList; // list of TRemPrompts objects
FText: string;
FPNText: string;
FRec1: string;
FID: string;
FDlgID: string;
FHaveData: boolean;
FTaxID: string;
FChecked: boolean;
FChildrenShareChecked: boolean;
FHasSharedPrompts: boolean;
FHasComment: boolean;
FHasSubComments: boolean;
FCommentPrompt: TRemPrompt;
FFieldValues: TORStringList;
FMSTPrompt: TRemPrompt;
FWHPrintDevice, FWHResultChk, FWHResultNot: String;
FVitalDateTime: TFMDateTime; //AGP Changes 26.1
protected
procedure Check4ChildrenSharedPrompts;
function ShowChildren: boolean;
function EnableChildren: boolean;
function Enabled: boolean;
procedure SetChecked(const Value: boolean);
procedure UpdateData;
procedure GetData;
function TrueIndent: integer;
procedure cbClicked(Sender: TObject);
procedure cbEntered(Sender: TObject);
procedure FieldPanelEntered(Sender: TObject);
procedure FieldPanelExited(Sender: TObject);
procedure FieldPanelKeyPress(Sender: TObject; var Key: Char);
procedure FieldPanelOnClick(Sender: TObject);
procedure FieldPanelLabelOnClick(Sender: TObject);
function BuildControls(var Y: integer; ParentWidth: integer;
BaseParent, AOwner: TWinControl): TWinControl;
function AddData(Lst: TStrings; Finishing: boolean; AHistorical: boolean = FALSE): integer;
procedure FinishProblems(List: TStrings);
function IsChecked: boolean;
procedure SubCommentChange(Sender: TObject);
function EntryID: string;
procedure FieldPanelChange(Sender: TObject);
procedure GetFieldValues(FldData: TStrings);
procedure ParentCBEnter(Sender: TObject);
procedure ParentCBExit(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
function ElemType: TRDElemType;
function Add2PN: boolean;
function Indent: integer;
function FindingType: string;
function Historical: boolean;
function ResultDlgID: string;
function IncludeMHTestInPN: boolean;
function HideChildren: boolean;
function ChildrenIndent: integer;
function ChildrenSharePrompts: boolean;
function ChildrenRequired: TRDChildReq;
function Box: boolean;
function BoxCaption: string;
function IndentChildrenInPN: boolean;
function IndentPNLevel: integer;
function GetTemplateFieldValues(const Text: string; FldValues: TORStringList = nil): string;
procedure AddText(Lst: TStrings);
property Text: string read FText;
property ID: string read FID;
property DlgID: string read FDlgID;
property Checked: boolean read FChecked write SetChecked;
property Reminder: TReminderDialog read FReminder;
property HasComment: boolean read FHasComment;
property WHPrintDevice: String read FWHPrintDevice write FWHPrintDevice;
property WHResultChk: String read FWHResultChk write FWHResultChk;
property WHResultNot: String read FWHResultNot write FWHResultNot;
property VitalDateTime: TFMDateTime read FVitalDateTime write FVitalDateTime;
end;
TRemDataType = (dtDiagnosis, dtProcedure, dtPatientEducation,
dtExam, dtHealthFactor, dtImmunization, dtSkinTest,
dtVitals, dtOrder, dtMentalHealthTest, dtWHPapResult,
dtWhNotPurp);
TRemPCERoot = class;
TRemData = class(TObject)
private
FPCERoot: TRemPCERoot;
FParent: TRemDlgElement;
FRec3: string;
FActiveDates: TStringList; //Active dates for finding items. (rectype 3)
// FRoot: string;
FChoices: TORStringList;
FChoicesActiveDates: TList; //Active date ranges for taxonomies. (rectype 5)
//List of TStringList objects that contain active date
//ranges for each FChoices object of the same index
FChoicePrompt: TRemPrompt; //rectype 4
FChoicesMin: integer;
FChoicesMax: integer;
FChoicesFont: THandle;
FSyncCount: integer;
protected
function AddData(List: TStrings; Finishing: boolean): integer;
public
destructor Destroy; override;
function Add2PN: boolean;
function DisplayWHResults: boolean;
function InternalValue: string;
function ExternalValue: string;
function Narrative: string;
function Category: string;
function DataType: TRemDataType;
property Parent: TRemDlgElement read FParent;
end;
TRemPromptType = (ptComment, ptVisitLocation, ptVisitDate, ptQuantity,
ptPrimaryDiag, ptAdd2PL, ptExamResults, ptSkinResults,
ptSkinReading, ptLevelSeverity, ptSeries, ptReaction,
ptContraindicated, ptLevelUnderstanding, ptWHPapResult,
ptWHNotPurp);
TRemPrompt = class(TObject)
private
FFromControl: boolean;
FParent: TRemDlgElement;
FRec4: string;
FCaptionAssigned: boolean;
FData: TRemData;
FValue: string;
FOverrideType: TRemPromptType;
FIsShared: boolean;
FSharedChildren: TList;
FCurrentControl: TControl;
FFromParent: boolean;
FInitializing: boolean;
FMiscText: string;
FMonthReq: boolean;
FPrintNow: String;
FMHTestComplete: integer;
protected
function RemDataActive(RData: TRemData; EncDt: TFMDateTime):Boolean;
function RemDataChoiceActive(RData: TRemData; j: integer; EncDt: TFMDateTime):Boolean;
function GetValue: string;
procedure SetValueFromParent(Value: string);
procedure SetValue(Value: string);
procedure PromptChange(Sender: TObject);
procedure VitalVerify(Sender: TObject);
procedure ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
function CanShare(Prompt: TRemPrompt): boolean;
procedure InitValue;
procedure DoMHTest(Sender: TObject);
procedure DoWHReport(Sender: TObject);
procedure ViewWHText(Sender: TObject);
procedure GAFHelp(Sender: TObject);
function EntryID: string;
procedure EditKeyPress(Sender: TObject; var Key: Char);
public
constructor Create;
destructor Destroy; override;
function PromptOK: boolean;
function PromptType: TRemPromptType;
function Add2PN: boolean;
function InternalValue: string;
function Forced: boolean;
function Caption: string;
function ForcedCaption: string;
function SameLine: boolean;
function Required: boolean;
function NoteText: string;
function VitalType: TVitalType;
function VitalValue: string;
function VitalUnitValue: string;
property Value: string read GetValue write SetValue;
end;
TRemPCERoot = class(TObject)
private
FData: TList;
FID: string;
FForcedPrompts: TStringList;
FValue: string;
FValueSet: string;
protected
class function GetRoot(Data: TRemData; Rec3: string; Historical: boolean): TRemPCERoot;
procedure Done(Data: TRemData);
procedure Sync(Prompt: TRemPrompt);
procedure UnSync(Prompt: TRemPrompt);
function GetValue(PromptType: TRemPromptType; var NewValue: string): boolean;
public
destructor Destroy; override;
end;
TReminderStatus = (rsDue, rsApplicable, rsNotApplicable, rsNone, rsUnknown);
TRemCanFinishProc = function: boolean of object;
TRemDisplayPCEProc = procedure of object;
TRemForm = record
Form: TForm;
PCEObj: TPCEData;
RightPanel: TPanel;
CanFinishProc: TRemCanFinishProc;
DisplayPCEProc: TRemDisplayPCEProc;
Drawers: TFrmDrawers;
NewNoteRE: TRichEdit;
NoteList: TORListBox;
end;
var
RemForm: TRemForm;
NotPurposeValue: string;
WHRemPrint: string;
InitialRemindersLoaded: boolean = FALSE;
const
HAVE_REMINDERS = 0;
NO_REMINDERS = 1;
RemPriorityText: array[1..3] of string = ('High','','Low');
ClinMaintText = 'Clinical Maintenance';
dtUnknown = TRemDataType(-1);
dtAll = TRemDataType(-2);
dtHistorical = TRemDataType(-3);
ptUnknown = TRemPromptType(-1);
ptSubComment = TRemPromptType(-2);
ptDataList = TRemPromptType(-3);
ptVitalEntry = TRemPromptType(-4);
ptMHTest = TRemPromptType(-5);
ptGAF = TRemPromptType(-6);
ptMST = TRemPromptType(-7);
MSTCode = 'MST';
MSTDataTypes = [pdcHF, pdcExam];
pnumMST = ord(pnumComment)+4;
procedure NotifyWhenRemindersChange(Proc: TNotifyEvent);
procedure RemoveNotifyRemindersChange(Proc: TNotifyEvent);
procedure StartupReminders;
function GetReminderStatus: TReminderStatus;
function RemindersEvaluatingInBackground: boolean;
procedure ResetReminderLoad;
procedure LoadReminderData(ProcessingInBackground: boolean = FALSE);
function ReminderEvaluated(Data: string; ForceUpdate: boolean = FALSE): boolean;
procedure RemindersEvaluated(List: TStringList);
procedure EvalReminder(ien: integer);
procedure EvalProcessed;
procedure EvaluateCategoryClicked(AData: pointer; Sender: TObject);
procedure SetReminderPopupRoutine(Menu: TPopupMenu);
procedure SetReminderPopupCoverRoutine(Menu: TPopupMenu);
procedure SetReminderMenuSelectRoutine(Menu: TMenuItem);
procedure BuildReminderTree(Tree: TORTreeView);
function ReminderNode(Node: TTreeNode): TORTreeNode;
procedure ClearReminderData;
function GetReminder(ARemData: string): TReminder;
procedure WordWrap(AText: string; Output: TStrings; LineLength: integer;
AutoIndent: integer = 4; MHTest: boolean = false);
function InteractiveRemindersActive: boolean;
function GetReminderData(Rem: TReminderDialog; Lst: TStrings; Finishing: boolean = FALSE;
Historical: boolean = FALSE): integer; overload;
function GetReminderData(Lst: TStrings; Finishing: boolean = FALSE;
Historical: boolean = FALSE): integer; overload;
procedure SetReminderFormBounds(Frm: TForm; DefX, DefY, DefW, DefH, ALeft, ATop, AWidth, AHeight: integer);
procedure UpdateReminderDialogStatus;
//const
// InteractiveRemindersActive = FALSE;
var
{ ActiveReminder string format:
IEN^PRINT NAME^DUE DATE/TIME^LAST OCCURENCE DATE/TIME^PRIORITY^DUE^DIALOG
where PRIORITY 1=High, 2=Normal, 3=Low
DUE 0=Applicable, 1=Due, 2=Not Applicable }
ActiveReminders: TORStringList = nil;
{ OtherReminder string format:
IDENTIFIER^TYPE^NAME^PARENT IDENTIFIER^REMINDER IEN^DIALOG
where TYPE C=Category, R=Reminder }
OtherReminders: TORStringList = nil;
RemindersInProcess: TORStringList = nil;
CoverSheetRemindersInBackground: boolean = FALSE;
KillReminderDialogProc: procedure(frm: TForm) = nil;
RemindersStarted: boolean = FALSE;
ProcessedReminders: TORStringList = nil;
ReminderDialogInfo: TStringList = nil;
const
CatCode = 'C';
RemCode = 'R';
EduCode = 'E';
pnumVisitLoc = pnumComment + 1;
pnumVisitDate = pnumComment + 2;
RemTreeDateIdx = 8;
IncludeParentID = ';';
OtherCatID = CatCode + '-6';
RemDataCodes: array[TRemDataType] of string =
{ dtDiagnosis } ('POV',
{ dtProcedure } 'CPT',
{ dtPatientEducation } 'PED',
{ dtExam } 'XAM',
{ dtHealthFactor } 'HF',
{ dtImmunization } 'IMM',
{ dtSkinTest } 'SK',
{ dtVitals } 'VIT',
{ dtOrder } 'Q',
{ dtMentalHealthTest } 'MH',
{ dtWHPapResult } 'WHR',
{ dtWHNotPurp } 'WH');
implementation
uses rCore, uCore, rReminders, fRptBox, uConst, fReminderDialog, fNotes, rMisc,
fMHTest, rPCE, rTemplates, dShared, uTemplateFields, fIconLegend, fReminderTree, uInit,
VAUtils, VA508AccessibilityRouter, VA508AccessibilityManager, uDlgComponents,
fBase508Form;
type
TRemFolder = (rfUnknown, rfDue, rfApplicable, rfNotApplicable, rfEvaluated, rfOther);
TRemFolders = set of TRemFolder;
TValidRemFolders = succ(low(TRemFolder)) .. high(TRemFolder);
TExposedComponent = class(TControl);
TWHCheckBox = class(TCPRSDialogCheckBox)
private
FPrintNow: TCPRSDialogCheckBox;
FViewLetter: TCPRSDialogCheckBox;
FCheck1: TWHCheckBox;
FCheck2: TWHCheckBox;
FCheck3: TWHCheckBox;
FEdit: TEdit;
FButton: TButton;
FOnDestroy: TNotifyEvent;
Flbl, Flbl2: TControl;
FPrintVis: String;
//FPrintDevice: String;
FPntNow: String;
FPntBatch: String;
FButtonText: String;
FCheckNum: String;
protected
public
property lbl: TControl read Flbl write Flbl;
property lbl2: TControl read Flbl2 write Flbl2;
property PntNow: String read FPntNow write FPntNow;
property PntBatch: String read FPntBatch write FPntBatch;
property CheckNum: String read FCheckNum write FCheckNum;
property ButtonText: String read FButtonText write FButtonText;
property PrintNow: TCPRSDialogCheckBox read FPrintNow write FPrintNow;
property Check1: TWHCheckBox read FCheck1 write FCheck1;
property Check2: TWHCheckBox read FCheck2 write FCheck2;
property Check3: TWHCheckBox read FCheck3 write FCheck3;
property ViewLetter: TCPRSDialogCheckBox read FViewLetter write FViewLetter;
property Button: TButton read FButton write FButton;
property Edit: TEdit read FEdit write FEdit;
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
property PrintVis: String read FPrintVis write FPrintVis;
end;
var
LastReminderLocation: integer = -2;
EvaluatedReminders: TORStringList = nil;
ReminderTreeMenu: TORPopupMenu = nil;
ReminderTreeMenuDlg: TORPopupMenu = nil;
ReminderCatMenu: TPopupMenu = nil;
EducationTopics: TORStringList = nil;
WebPages: TORStringList = nil;
ReminderCallList: TORStringList = nil;
LastProcessingList: string = '';
InteractiveRemindersActiveChecked: boolean = FALSE;
InteractiveRemindersActiveStatus: boolean = FALSE;
PCERootList: TStringList;
PrimaryDiagRoot: TRemPCERoot = nil;
ElementChecked: TRemDlgElement = nil;
HistRootCount: longint = 0;
uRemFolders: TRemFolders = [rfUnknown];
const
DueText = 'Due';
ApplicableText = 'Applicable';
NotApplicableText = 'Not Applicable';
EvaluatedText = 'All Evaluated';
OtherText = 'Other Categories';
DueCatID = CatCode + '-2';
DueCatString = DueCatID + U + DueText;
ApplCatID = CatCode + '-3';
ApplCatString = ApplCatID + U + ApplicableText;
NotApplCatID = CatCode + '-4';
NotApplCatString = NotApplCatID + U + NotApplicableText;
EvaluatedCatID = CatCode + '-5';
EvaluatedCatString = EvaluatedCatID + U + EvaluatedText;
// OtherCatID = CatCode + '-6';
OtherCatString = OtherCatID + U + OtherText;
LostCatID = CatCode + '-7';
LostCatString = LostCatID + U + 'In Process';
ReminderDateFormat = 'mm/dd/yyyy';
RemData2PCECat: array[TRemDataType] of TPCEDataCat =
{ dtDiagnosis } (pdcDiag,
{ dtProcedure } pdcProc,
{ dtPatientEducation } pdcPED,
{ dtExam } pdcExam,
{ dtHealthFactor } pdcHF,
{ dtImmunization } pdcImm,
{ dtSkinTest } pdcSkin,
{ dtVitals } pdcVital,
{ dtOrder } pdcOrder,
{ dtMentalHealthTest } pdcMH,
{ dtWHPapResult } pdcWHR,
{ dtWHNotPurp } pdcWH);
RemPromptCodes: array[TRemPromptType] of string =
{ ptComment } ('COM',
{ ptVisitLocation } 'VST_LOC',
{ ptVisitDate } 'VST_DATE',
{ ptQuantity } 'CPT_QTY',
{ ptPrimaryDiag } 'POV_PRIM',
{ ptAdd2PL } 'POV_ADD',
{ ptExamResults } 'XAM_RES',
{ ptSkinResults } 'SK_RES',
{ ptSkinReading } 'SK_READ',
{ ptLevelSeverity } 'HF_LVL',
{ ptSeries } 'IMM_SER',
{ ptReaction } 'IMM_RCTN',
{ ptContraindicated } 'IMM_CNTR',
{ ptLevelUnderstanding } 'PED_LVL',
{ ptWHPapResult } 'WH_PAP_RESULT',
{ ptWHNotPurp } 'WH_NOT_PURP');
RemPromptTypes: array[TRemPromptType] of TRemDataType =
{ ptComment } (dtAll,
{ ptVisitLocation } dtHistorical,
{ ptVisitDate } dtHistorical,
{ ptQuantity } dtProcedure,
{ ptPrimaryDiag } dtDiagnosis,
{ ptAdd2PL } dtDiagnosis,
{ ptExamResults } dtExam,
{ ptSkinResults } dtSkinTest,
{ ptSkinReading } dtSkinTest,
{ ptLevelSeverity } dtHealthFactor,
{ ptSeries } dtImmunization,
{ ptReaction } dtImmunization,
{ ptContraindicated } dtImmunization,
{ ptLevelUnderstanding } dtPatientEducation,
{ ptWHPapResult } dtWHPapResult,
{ ptWHNotPurp } dtWHNotPurp);
FinishPromptPieceNum: array[TRemPromptType] of integer =
{ ptComment } (pnumComment,
{ ptVisitLocation } pnumVisitLoc,
{ ptVisitDate } pnumVisitDate,
{ ptQuantity } pnumProcQty,
{ ptPrimaryDiag } pnumDiagPrimary,
{ ptAdd2PL } pnumDiagAdd2PL,
{ ptExamResults } pnumExamResults,
{ ptSkinResults } pnumSkinResults,
{ ptSkinReading } pnumSkinReading,
{ ptLevelSeverity } pnumHFLevel,
{ ptSeries } pnumImmSeries,
{ ptReaction } pnumImmReaction,
{ ptContraindicated } pnumImmContra,
{ ptLevelUnderstanding } pnumPEDLevel,
{ ptWHPapResult } pnumWHPapResult,
{ ptWHNotPurp } pnumWHNotPurp);
ComboPromptTags: array[TRemPromptType] of integer =
{ ptComment } (0,
{ ptVisitLocation } TAG_HISTLOC,
{ ptVisitDate } 0,
{ ptQuantity } 0,
{ ptPrimaryDiag } 0,
{ ptAdd2PL } 0,
{ ptExamResults } TAG_XAMRESULTS,
{ ptSkinResults } TAG_SKRESULTS,
{ ptSkinReading } 0,
{ ptLevelSeverity } TAG_HFLEVEL,
{ ptSeries } TAG_IMMSERIES,
{ ptReaction } TAG_IMMREACTION,
{ ptContraindicated } 0,
{ ptLevelUnderstanding } TAG_PEDLEVEL,
{ ptWHPapResult } 0,
{ ptWHNotPurp } 0);
PromptDescriptions: array [TRemPromptType] of string =
{ ptComment } ('Comment',
{ ptVisitLocation } 'Visit Location',
{ ptVisitDate } 'Visit Date',
{ ptQuantity } 'Quantity',
{ ptPrimaryDiag } 'Primary Diagnosis',
{ ptAdd2PL } 'Add to Problem List',
{ ptExamResults } 'Exam Results',
{ ptSkinResults } 'Skin Test Results',
{ ptSkinReading } 'Skin Test Reading',
{ ptLevelSeverity } 'Level of Severity',
{ ptSeries } 'Series',
{ ptReaction } 'Reaction',
{ ptContraindicated } 'Repeat Contraindicated',
{ ptLevelUnderstanding } 'Level of Understanding',
{ ptWHPapResult } 'Women''s Health Procedure',
{ ptWHNotPurp } 'Women Health Notification Purpose');
RemFolderCodes: array[TValidRemFolders] of char =
{ rfDue } ('D',
{ rfApplicable } 'A',
{ rfNotApplicable } 'N',
{ rfEvaluated } 'E',
{ rfOther } 'O');
MSTDescTxt: array[0..4,0..1] of string = (('Yes','Y'),('No','N'),('Declined','D'),
('Normal','N'),('Abnormal','A'));
SyncPrompts = [ptComment, ptQuantity, ptAdd2PL, ptExamResults,
ptSkinResults, ptSkinReading, ptLevelSeverity, ptSeries,
ptReaction, ptContraindicated, ptLevelUnderstanding];
Gap = 3;
LblGap = 4;
IndentGap = 18;
PromptGap = 10;
NewLinePromptGap = 18;
IndentMult = 9;
PromptIndent = 30;
gbLeftIndent = 2;
gbTopIndent = 9;
gbTopIndent2 = 16;
DisabledFontColor = clBtnShadow;
r3Type = 4;
r3Code2 = 6;
r3Code = 7;
r3Cat = 9;
r3Nar = 8;
r3GAF = 12;
RemTreeCode = 999;
CRCode = '<br>';
CRCodeLen = length(CRCode);
REMEntryCode = 'REM';
MonthReqCode = 'M';
function InitText(const InStr: string): string;
var
i: integer;
begin
Result := InStr;
if(copy(Result, 1, CRCodeLen) = CRCode) then
begin
i := pos(CRCode, copy(Result, CRCodeLen+1, MaxInt));
if(i > 0) and ((i = (CRCodeLen + 1)) or
(Trim(copy(Result, CrCodeLen+1, i - 1)) = '')) then
delete(Result,1,CRCodeLen + i - 1);
end;
end;
function CRLFText(const InStr: string): string;
var
i: integer;
begin
Result := InitText(InStr);
repeat
i := pos(CRCode, Result);
if(i > 0) then
Result := copy(Result,1,i-1) + CRLF + copy(REsult,i + CRCodeLen, MaxInt);
until(i = 0);
end;
function Code2VitalType(Code: string): TVitalType;
var
v: TVitalType;
begin
Result := vtUnknown;
for v := low(TValidVitalTypes) to high(TValidVitalTypes) do
begin
if(Code = VitalPCECodes[v]) then
begin
Result := v;
break;
end;
end;
end;
type
TMultiClassObj = record
case integer of
0: (edt: TCPRSDialogFieldEdit);
1: (cb: TCPRSDialogCheckBox);
2: (cbo: TCPRSDialogComboBox);
3: (dt: TCPRSDialogDateCombo);
4: (ctrl: TORExposedControl);
5: (vedt: TVitalEdit);
6: (vcbo: TVitalComboBox);
7: (btn: TCPRSDialogButton);
8: (pNow: TORCheckBox);
9: (pBat: TORCheckBox);
10: (lbl: TLabel);
11: (WHChk: TWHCheckBox);
end;
EForcedPromptConflict = class(EAbort);
function IsSyncPrompt(pt: TRemPromptType): boolean;
begin
if(pt in SyncPrompts) then
Result := TRUE
else
Result := (pt = ptVitalEntry);
end;
procedure NotifyWhenRemindersChange(Proc: TNotifyEvent);
begin
ActiveReminders.Notifier.NotifyWhenChanged(Proc);
OtherReminders.Notifier.NotifyWhenChanged(Proc);
RemindersInProcess.Notifier.NotifyWhenChanged(Proc);
Proc(nil);
end;
procedure RemoveNotifyRemindersChange(Proc: TNotifyEvent);
begin
ActiveReminders.Notifier.RemoveNotify(Proc);
OtherReminders.Notifier.RemoveNotify(Proc);
RemindersInProcess.Notifier.RemoveNotify(Proc);
end;
function ProcessingChangeString: string;
var
i: integer;
TmpSL: TStringList;
begin
Result := U;
if(RemindersInProcess.Count > 0) then
begin
TmpSL := TStringList.Create;
try
FastAssign(RemindersInProcess, TmpSL);
TmpSL.Sort;
for i := 0 to TmpSL.Count-1 do
begin
if(TReminder(TmpSL.Objects[i]).Processing) then
Result := Result + TmpSL[i] + U;
end;
finally
TmpSL.Free;
end;
end;
end;
procedure StartupReminders;
begin
if(not InitialRemindersLoaded) then
begin
RemindersStarted := TRUE;
InitialRemindersLoaded := TRUE;
LoadReminderData;
end;
end;
function GetReminderStatus: TReminderStatus;
begin
if(EvaluatedReminders.IndexOfPiece('1',U,6) >= 0) then Result := rsDue
else if(EvaluatedReminders.IndexOfPiece('0',U,6) >= 0) then Result := rsApplicable
else if(EvaluatedReminders.IndexOfPiece('2',U,6) >= 0) then Result := rsNotApplicable
else Result := rsUnknown;
// else if(EvaluatedReminders.Count > 0) or (OtherReminders.Count > 0) or
// (not InitialRemindersLoaded) or
// (ProcessingChangeString <> U) then Result := rsUnknown
// else Result := rsNone;
end;
function RemindersEvaluatingInBackground: boolean;
begin
Result := CoverSheetRemindersInBackground;
if(not Result) then
Result := (ReminderCallList.Count > 0)
end;
var
TmpActive: TStringList = nil;
TmpOther: TStringList = nil;
procedure BeginReminderUpdate;
begin
ActiveReminders.Notifier.BeginUpdate;
OtherReminders.Notifier.BeginUpdate;
TmpActive := TStringList.Create;
FastAssign(ActiveReminders, TmpActive);
TmpOther := TStringList.Create;
FastAssign(OtherReminders, TmpOther);
end;
procedure EndReminderUpdate(Force: boolean = FALSE);
var
DoNotify: boolean;
begin
DoNotify := Force;
if(not DoNotify) then
DoNotify := (not ActiveReminders.Equals(TmpActive));
KillObj(@TmpActive);
if(not DoNotify) then
DoNotify := (not OtherReminders.Equals(TmpOther));
KillObj(@TmpOther);
OtherReminders.Notifier.EndUpdate;
ActiveReminders.Notifier.EndUpdate(DoNotify);
end;
function GetRemFolders: TRemFolders;
var
i: TRemFolder;
tmp: string;
begin
if rfUnknown in uRemFolders then
begin
tmp := GetReminderFolders;
uRemFolders := [];
for i := low(TValidRemFolders) to high(TValidRemFolders) do
if(pos(RemFolderCodes[i], tmp) > 0) then
include(uRemFolders, i);
end;
Result := uRemFolders;
end;
procedure SetRemFolders(const Value: TRemFolders);
var
i: TRemFolder;
tmp: string;
begin
if(Value <> uRemFolders) then
begin
BeginReminderUpdate;
try
uRemFolders := Value;
tmp := '';
for i := low(TValidRemFolders) to high(TValidRemFolders) do
if(i in Value) then
tmp := tmp + RemFolderCodes[i];
SetReminderFolders(tmp);
finally
EndReminderUpdate(TRUE);
end;
end;
end;
function ReminderEvaluated(Data: string; ForceUpdate: boolean = FALSE): boolean;
var
idx: integer;
Code, Sts, Before: string;
begin
Result := ForceUpdate;
if(Data <> '') then
begin
Code := Piece(Data, U, 1);
if StrToIntDef(Code,0) > 0 then
begin
ActiveReminders.Notifier.BeginUpdate;
try
idx := EvaluatedReminders.IndexOfPiece(Code);
if(idx < 0) then
begin
EvaluatedReminders.Add(Data);
Result := TRUE;
end
else
begin
Before := Piece(EvaluatedReminders[idx], U, 6);
EvaluatedReminders[idx] := Data;
if(not Result) then
Result := (Before <> Piece(Data, U, 6));
end;
idx := ActiveReminders.IndexOfPiece(Code);
if(idx < 0) then
begin
Sts := Piece(Data, U, 6);
//if(Sts = '0') or (Sts = '1') then
if(Sts = '0') or (Sts = '1') or (Sts = '3') or (Sts = '4') then //AGP Error change 26.8
begin
Result := TRUE;
ActiveReminders.Add(Data);
end;
end
else
begin
if(not Result) then
Result := (ActiveReminders[idx] <> Data);
ActiveReminders[idx] := Data;
end;
idx := ProcessedReminders.IndexOfPiece(Code);
if(idx >= 0) then
ProcessedReminders.Delete(idx);
finally
ActiveReminders.Notifier.EndUpdate(Result);
end;
end
else
Result := TRUE; // If Code = 0 then it's 0^No Reminders Due, indicating a status change.
end;
end;
procedure RemindersEvaluated(List: TStringList);
var
i: integer;
DoUpdate, RemChanged: boolean;
begin
DoUpdate := FALSE;
ActiveReminders.Notifier.BeginUpdate;
try
for i := 0 to List.Count-1 do
begin
RemChanged := ReminderEvaluated(List[i]);
if(RemChanged) then DoUpdate := TRUE;
end;
finally
ActiveReminders.Notifier.EndUpdate(DoUpdate);
end;
end;
(*
procedure CheckReminders; forward;
procedure IdleCallEvaluateReminder(Msg: string);
var
i:integer;
Code: string;
begin
Code := Piece(Msg,U,1);
repeat
i := ReminderCallList.IndexOfPiece(Code);
if(i >= 0) then
ReminderCallList.Delete(i);
until(i < 0);
ReminderEvaluated(EvaluateReminder(Msg), (ReminderCallList.Count = 0));
CheckReminders;
end;
procedure CheckReminders;
var
i:integer;
begin
for i := ReminderCallList.Count-1 downto 0 do
if(EvaluatedReminders.IndexOfPiece(Piece(ReminderCallList[i], U, 1)) >= 0) then
ReminderCallList.Delete(i);
if(ReminderCallList.Count > 0) then
CallRPCWhenIdle(IdleCallEvaluateReminder,ReminderCallList[0])
end;
*)
procedure CheckReminders;
var
RemList: TStringList;
i: integer;
Code: string;
begin
for i := ReminderCallList.Count-1 downto 0 do
if(EvaluatedReminders.IndexOfPiece(Piece(ReminderCallList[i],U,1)) >= 0) then
ReminderCallList.Delete(i);
if(ReminderCallList.Count > 0) then
begin
RemList := TStringList.Create;
try
while (ReminderCallList.Count > 0) do
begin
Code := Piece(ReminderCallList[0],U,1);
ReminderCallList.Delete(0);
repeat
i := ReminderCallList.IndexOfPiece(Code);
if(i >= 0) then
ReminderCallList.Delete(i);
until(i < 0);
RemList.Add(Code);
end;
if(RemList.Count > 0) then
begin
EvaluateReminders(RemList);
FastAssign(RPCBrokerV.Results, RemList);
for i := 0 to RemList.Count-1 do
ReminderEvaluated(RemList[i], (i = (RemList.Count-1)));
end;
finally
RemList.Free;
end;
end;
end;
procedure ResetReminderLoad;
begin
LastReminderLocation := -2;
LoadReminderData;
end;
procedure LoadReminderData(ProcessingInBackground: boolean = FALSE);
var
i, idx: integer;
RemID: string;
TempList: TORStringList;
begin
if(RemindersStarted and (LastReminderLocation <> Encounter.Location)) then
begin
LastReminderLocation := Encounter.Location;
BeginReminderUpdate;
try
GetCurrentReminders;
TempList := TORStringList.Create;
try
if(RPCBrokerV.Results.Count > 0) then
begin
for i := 0 to RPCBrokerV.Results.Count-1 do
begin
RemID := RPCBrokerV.Results[i];
idx := EvaluatedReminders.IndexOfPiece(RemID);
if(idx < 0) then
begin
TempList.Add(RemID);
if(not ProcessingInBackground) then
ReminderCallList.Add(RemID);
end
else
TempList.Add(EvaluatedReminders[idx]);
end;
end;
// FastAssign(TempList,ActiveReminders);
for i := 0 to TempList.Count-1 do
begin
RemID := Piece(TempList[i],U,1);
if(ActiveReminders.indexOfPiece(RemID) < 0) then
ActiveReminders.Add(TempList[i]);
end;
finally
TempList.Free;
end;
CheckReminders;
GetOtherReminders(OtherReminders);
finally
EndReminderUpdate;
end;
end;
end;
{ Supporting events for Reminder TreeViews }
procedure GetImageIndex(AData: Pointer; Sender: TObject; Node: TTreeNode);
var
iidx, oidx: integer;
Data, Tmp: string;
begin
if(Assigned(Node)) then
begin
oidx := -1;
Data := (Node as TORTreeNode).StringData;
if(copy(Piece(Data, U, 1),1,1) = CatCode) then
begin
if(Node.Expanded) then
iidx := 1
else
iidx := 0;
end
else
begin
Tmp := Piece(Data, U, 6);
//if(Tmp = '1') then iidx := 2
if (Tmp = '3') or (Tmp = '4') or (Tmp = '1') then iidx :=2 //AGP ERROR CHANGE 26.8
else if(Tmp = '0') then iidx := 3
else
begin
if(EvaluatedReminders.IndexOfPiece(copy(Piece(Data, U, 1),2,MaxInt),U,1) < 0) then
iidx := 5
else
iidx := 4;
end;
if(Piece(Data,U,7) = '1') then
begin
Tmp := copy(Piece(Data, U, 1),2,99);
if(ProcessedReminders.IndexOfPiece(Tmp,U,1) >=0) then
oidx := 1
else
oidx:= 0;
end;
end;
Node.ImageIndex := iidx;
Node.SelectedIndex := iidx;
if(Node.OverlayIndex <> oidx) then
begin
Node.OverlayIndex := oidx;
Node.TreeView.Invalidate;
end;
end;
end;
type
TRemMenuCmd = (rmClinMaint, rmEdu, rmInq, rmWeb, rmDash, rmEval,
rmDue, rmApplicable, rmNotApplicable, rmEvaluated, rmOther,
rmLegend);
TRemViewCmds = rmDue..rmOther;
const
RemMenuFolder: array[TRemViewCmds] of TRemFolder =
{ rmDue } (rfDue,
{ rmApplicable } rfApplicable,
{ rmNotApplicable } rfNotApplicable,
{ rmEvaluated } rfEvaluated,
{ rmOther } rfOther);
RemMenuNames: array[TRemMenuCmd] of string = (
{ rmClinMaint } ClinMaintText,
{ rmEdu } 'Education Topic Definition',
{ rmInq } 'Reminder Inquiry',
{ rmWeb } 'Reference Information',
{ rmDash } '-',
{ rmEval } 'Evaluate Reminder',
{ rmDue } DueText,
{ rmApplicable } ApplicableText,
{ rmNotApplicable } NotApplicableText,
{ rmEvaluated } EvaluatedText,
{ rmOther } OtherText,
{ rmLegend } 'Reminder Icon Legend');
EvalCatName = 'Evaluate Category Reminders';
function GetEducationTopics(EIEN: string): string;
var
i, idx: integer;
Tmp, Data: string;
begin
if(not assigned(EducationTopics)) then
EducationTopics := TORStringList.Create;
idx := EducationTopics.IndexOfPiece(EIEN);
if(idx < 0) then
begin
Tmp := copy(EIEN,1,1);
idx := StrToIntDef(copy(EIEN,2,MaxInt),0);
if(Tmp = RemCode) then
GetEducationTopicsForReminder(idx)
else
if(Tmp = EduCode) then
GetEducationSubtopics(idx)
else
RPCBrokerV.Results.Clear;
Tmp := EIEN;
if(RPCBrokerV.Results.Count > 0) then
begin
for i := 0 to RPCBrokerV.Results.Count-1 do
begin
Data := RPCBrokerV.Results[i];
Tmp := Tmp + U + Piece(Data, U, 1) + ';';
if(Piece(Data, U, 3) = '') then
Tmp := Tmp + Piece(Data, U, 2)
else
Tmp := Tmp + Piece(Data, U, 3);
end;
end;
idx := EducationTopics.Add(Tmp);
end;
Result := EducationTopics[idx];
idx := pos(U, Result);
if(idx > 0) then
Result := copy(Result,Idx+1,MaxInt)
else
Result := '';
end;
function GetWebPageName(idx :integer): string;
begin
Result := Piece(WebPages[idx],U,2);
end;
function GetWebPageAddress(idx: integer): string;
begin
Result := Piece(WebPages[idx],U,3);
end;
function GetWebPages(EIEN: string): string; overload;
var
i, idx: integer;
Tmp, Data, Title: string;
RIEN: string;
begin
RIEN := RemCode + EIEN;
if(not assigned(WebPages)) then
WebPages := TORStringList.Create;
idx := WebPages.IndexOfPiece(RIEN);
if(idx < 0) then
begin
GetReminderWebPages(EIEN);
Tmp := RIEN;
if(RPCBrokerV.Results.Count > 0) then
begin
for i := 0 to RPCBrokerV.Results.Count-1 do
begin
Data := RPCBrokerV.Results[i];
if(Piece(Data,U,1) = '1') and (Piece(Data,U,3) <> '') then
begin
Data := U + Piece(Data,U,4) + U + Piece(Data,U,3);
if(Piece(Data,U,2) = '') then
begin
Title := Piece(data,U,3);
if(length(Title) > 60) then
Title := copy(Title,1,57) + '...';
SetPiece(Data,U,2,Title);
end;
//if(copy(UpperCase(Piece(Data, U, 3)),1,7) <> 'HTTP://') then
// SetPiece(Data, U, 3,'http://'+Piece(Data,U,3));
idx := WebPages.IndexOf(Data);
if(idx < 0) then
idx := WebPages.Add(Data);
Tmp := Tmp + U + IntToStr(idx);
end;
end;
end;
idx := WebPages.Add(Tmp);
end;
Result := WebPages[idx];
idx := pos(U, Result);
if(idx > 0) then
Result := copy(Result,Idx+1,MaxInt)
else
Result := '';
end;
function ReminderName(IEN: integer): string;
var
idx: integer;
SIEN: string;
begin
SIEN := IntToStr(IEN);
Result := '';
idx := EvaluatedReminders.IndexOfPiece(SIEN);
if(idx >= 0) then
Result := piece(EvaluatedReminders[idx],U,2);
if(Result = '') then
begin
idx := ActiveReminders.IndexOfPiece(SIEN);
if(idx >= 0) then
Result := piece(ActiveReminders[idx],U,2);
end;
if(Result = '') then
begin
idx := OtherReminders.IndexOfPiece(SIEN, U, 5);
if(idx >= 0) then
Result := piece(OtherReminders[idx],U,3);
end;
if(Result = '') then
begin
idx := RemindersInProcess.IndexOfPiece(SIEN);
if(idx >= 0) then
Result := TReminder(RemindersInProcess.Objects[idx]).PrintName;
end;
end;
procedure ReminderClinMaintClicked(AData: pointer; Sender: TObject);
var
ien: integer;
begin
ien := (Sender as TMenuItem).Tag;
if(ien > 0) then
ReportBox(DetailReminder(ien), RemMenuNames[rmClinMaint] + ': '+ ReminderName(ien), TRUE);
end;
procedure ReminderEduClicked(AData: pointer; Sender: TObject);
var
ien: integer;
begin
ien := (Sender as TMenuItem).Tag;
if(ien > 0) then
ReportBox(EducationTopicDetail(ien), 'Education Topic: ' + (Sender as TMenuItem).Caption, TRUE);
end;
procedure ReminderInqClicked(AData: pointer; Sender: TObject);
var
ien: integer;
begin
ien := (Sender as TMenuItem).Tag;
if(ien > 0) then
ReportBox(ReminderInquiry(ien), 'Reminder Inquiry: '+ ReminderName(ien), TRUE);
end;
procedure ReminderWebClicked(AData: pointer; Sender: TObject);
var
idx: integer;
begin
idx := (Sender as TMenuItem).Tag-1;
if(idx >= 0) then
GotoWebPage(GetWebPageAddress(idx));
end;
procedure EvalReminder(ien: integer);
var
Msg, RName: string;
NewStatus: string;
begin
if(ien > 0) then
begin
NewStatus := EvaluateReminder(IntToStr(ien));
ReminderEvaluated(NewStatus);
NewStatus := piece(NewStatus,U,6);
RName := ReminderName(ien);
if(RName = '') then RName := 'Reminder';
if(NewStatus = '1') then Msg := 'Due'
else if(NewStatus = '0') then Msg := 'Applicable'
else if(NewStatus = '3') then Msg := 'Error' //AGP Error code change 26.8
else if (NewStatus = '4') then Msg := 'CNBD' //AGP Error code change 26.8
else Msg := 'Not Applicable';
Msg := RName + ' is ' + Msg + '.';
InfoBox(Msg, RName + ' Evaluation', MB_OK);
end;
end;
procedure EvalProcessed;
var
i: integer;
begin
if(ProcessedReminders.Count > 0) then
begin
BeginReminderUpdate;
try
while(ProcessedReminders.Count > 0) do
begin
if(ReminderCallList.IndexOf(ProcessedReminders[0]) < 0) then
ReminderCallList.Add(ProcessedReminders[0]);
repeat
i := EvaluatedReminders.IndexOfPiece(Piece(ProcessedReminders[0],U,1));
if(i >= 0) then
EvaluatedReminders.Delete(i);
until(i < 0);
ProcessedReminders.Delete(0);
end;
CheckReminders;
finally
EndReminderUpdate(TRUE);
end;
end;
end;
procedure ReminderEvalClicked(AData: pointer; Sender: TObject);
begin
EvalReminder((Sender as TMenuItem).Tag);
end;
procedure ReminderViewFolderClicked(AData: pointer; Sender: TObject);
var
rfldrs: TRemFolders;
rfldr: TRemFolder;
begin
rfldrs := GetRemFolders;
rfldr := TRemFolder((Sender as TMenuItem).Tag);
if rfldr in rfldrs then
exclude(rfldrs, rfldr)
else
include(rfldrs, rfldr);
SetRemFolders(rfldrs);
end;
procedure EvaluateCategoryClicked(AData: pointer; Sender: TObject);
var
Node: TORTreeNode;
Code: string;
i: integer;
begin
if(Sender is TMenuItem) then
begin
BeginReminderUpdate;
try
Node := TORTreeNode(TORTreeNode(TMenuItem(Sender).Tag).GetFirstChild);
while assigned(Node) do
begin
Code := Piece(Node.StringData,U,1);
if(copy(Code,1,1) = RemCode) then
begin
Code := copy(Code,2,MaxInt);
if(ReminderCallList.IndexOf(Code) < 0) then
ReminderCallList.Add(copy(Node.StringData,2,MaxInt));
repeat
i := EvaluatedReminders.IndexOfPiece(Code);
if(i >= 0) then
EvaluatedReminders.Delete(i);
until(i < 0);
end;
Node := TORTreeNode(Node.GetNextSibling);
end;
CheckReminders;
finally
EndReminderUpdate(TRUE);
end;
end;
end;
procedure ReminderIconLegendClicked(AData: pointer; Sender: TObject);
begin
ShowIconLegend(ilReminders);
end;
procedure ReminderMenuBuilder(MI: TMenuItem; RemStr: string;
IncludeActions, IncludeEval, ViewFolders: boolean);
var
M: TMethod;
Tmp: string;
Cnt: integer;
RemID: integer;
cmd: TRemMenuCmd;
function Add(Text: string; Parent: TMenuItem; Tag: integer; Typ: TRemMenuCmd): TORMenuItem;
var
InsertMenu: boolean;
idx: integer;
begin
Result := nil;
InsertMenu := TRUE;
if(Parent = MI) then
begin
if(MI.Count > Cnt) then
begin
Result := TORMenuItem(MI.Items[Cnt]);
Result.Enabled := TRUE;
Result.Visible := TRUE;
Result.ImageIndex := -1;
while Result.Count > 0 do
Result.Delete(Result.Count-1);
InsertMenu := FALSE;
end;
inc(Cnt);
end;
if(not assigned(Result)) then
Result := TORMenuItem.Create(MI);
if(Text = '') then
Result.Caption := RemMenuNames[Typ]
else
Result.Caption := Text;
Result.Tag := Tag;
Result.Data := RemStr;
if(Tag <> 0) then
begin
case Typ of
rmClinMaint: M.Code := @ReminderClinMaintClicked;
rmEdu: M.Code := @ReminderEduClicked;
rmInq: M.Code := @ReminderInqClicked;
rmWeb: M.Code := @ReminderWebClicked;
rmEval: M.Code := @ReminderEvalClicked;
rmDue..rmOther:
begin
M.Code := @ReminderViewFolderClicked;
case Typ of
rmDue: idx := 0;
rmApplicable: idx := 2;
rmNotApplicable: idx := 4;
rmEvaluated: idx := 6;
rmOther: idx := 8;
else idx := -1;
end;
if(idx >= 0) and (RemMenuFolder[Typ] in GetRemFolders) then
inc(idx);
Result.ImageIndex := idx;
end;
rmLegend: M.Code := @ReminderIconLegendClicked;
else
M.Code := nil;
end;
if(assigned(M.Code)) then
Result.OnClick := TNotifyEvent(M)
else
Result.OnClick := nil;
end;
if(InsertMenu) then
Parent.Add(Result);
end;
procedure AddEducationTopics(Item: TMenuItem; EduStr: string);
var
i, j: integer;
Code: String;
NewEduStr: string;
itm: TMenuItem;
begin
if(EduStr <> '') then
begin
repeat
i := pos(';', EduStr);
j := pos(U, EduStr);
if(j = 0) then j := length(EduStr)+1;
Code := copy(EduStr,1,i-1);
//AddEducationTopics(Add(copy(EduStr,i+1,j-i-1), Item, StrToIntDef(Code, 0), rmEdu),
// GetEducationTopics(EduCode + Code));
NewEduStr := GetEducationTopics(EduCode + Code);
if(NewEduStr = '') then
Add(copy(EduStr,i+1,j-i-1), Item, StrToIntDef(Code, 0), rmEdu)
else
begin
itm := Add(copy(EduStr,i+1,j-i-1), Item, 0, rmEdu);
Add(copy(EduStr,i+1,j-i-1), itm, StrToIntDef(Code, 0), rmEdu);
Add('', Itm, 0, rmDash);
AddEducationTopics(itm, NewEduStr);
end;
delete(EduStr,1,j);
until(EduStr = '');
end;
end;
procedure AddWebPages(Item: TMenuItem; WebStr: string);
var
i, idx: integer;
begin
if(WebStr <> '') then
begin
repeat
i := pos(U, WebStr);
if(i = 0) then i := length(WebStr)+1;
idx := StrToIntDef(copy(WebStr,1,i-1),-1);
if(idx >= 0) then
Add(GetWebPageName(idx), Item, idx+1, rmWeb);
delete(WebStr,1,i);
until(WebStr = '');
end;
end;
begin
RemID := StrToIntDef(copy(Piece(RemStr,U,1),2,MaxInt),0);
Cnt := 0;
M.Data := nil;
if(RemID > 0) then
begin
Add('', MI, RemID, rmClinMaint);
Tmp := GetEducationTopics(RemCode + IntToStr(RemID));
if(Tmp <> '') then
AddEducationTopics(Add('', MI, 0, rmEdu), Tmp)
else
Add('', MI, 0, rmEdu).Enabled := FALSE;
Add('', MI, RemID, rmInq);
Tmp := GetWebPages(IntToStr(RemID));
if(Tmp <> '') then
AddWebPages(Add('', MI, 0, rmWeb), Tmp)
else
Add('', MI, 0, rmWeb).Enabled := FALSE;
if(IncludeActions or IncludeEval) then
begin
Add('', MI, 0, rmDash);
Add('', MI, RemID, rmEval);
end;
end;
if(ViewFolders) then
begin
Add('', MI, 0, rmDash);
for cmd := low(TRemViewCmds) to high(TRemViewCmds) do
Add('', MI, ord(RemMenuFolder[cmd]), cmd);
end;
Add('', MI, 0, rmDash);
Add('', MI, 1, rmLegend);
while MI.Count > Cnt do
MI.Delete(MI.Count-1);
end;
procedure ReminderTreePopup(AData: pointer; Sender: TObject);
begin
ReminderMenuBuilder((Sender as TPopupMenu).Items, (Sender as TORPopupMenu).Data, TRUE, FALSE, FALSE);
end;
procedure ReminderTreePopupCover(AData: pointer; Sender: TObject);
begin
ReminderMenuBuilder((Sender as TPopupMenu).Items, (Sender as TORPopupMenu).Data, FALSE, FALSE, FALSE);
end;
procedure ReminderTreePopupDlg(AData: pointer; Sender: TObject);
begin
ReminderMenuBuilder((Sender as TPopupMenu).Items, (Sender as TORPopupMenu).Data, FALSE, TRUE, FALSE);
end;
procedure ReminderMenuItemSelect(AData: pointer; Sender: TObject);
begin
ReminderMenuBuilder((Sender as TMenuItem), (Sender as TORMenuItem).Data, FALSE, FALSE, TRUE);
end;
procedure SetReminderPopupRoutine(Menu: TPopupMenu);
var
M: TMethod;
begin
M.Code := @ReminderTreePopup;
M.Data := nil;
Menu.OnPopup := TNotifyEvent(M);
end;
procedure SetReminderPopupCoverRoutine(Menu: TPopupMenu);
var
M: TMethod;
begin
M.Code := @ReminderTreePopupCover;
M.Data := nil;
Menu.OnPopup := TNotifyEvent(M);
end;
procedure SetReminderPopupDlgRoutine(Menu: TPopupMenu);
var
M: TMethod;
begin
M.Code := @ReminderTreePopupDlg;
M.Data := nil;
Menu.OnPopup := TNotifyEvent(M);
end;
procedure SetReminderMenuSelectRoutine(Menu: TMenuItem);
var
M: TMethod;
begin
M.Code := @ReminderMenuItemSelect;
M.Data := nil;
Menu.OnClick := TNotifyEvent(M);
end;
function ReminderMenu(Sender: TComponent): TORPopupMenu;
begin
if(Sender.Tag = RemTreeCode) then
begin
if(not assigned(ReminderTreeMenuDlg)) then
begin
ReminderTreeMenuDlg := TORPopupMenu.Create(nil);
SetReminderPopupDlgRoutine(ReminderTreeMenuDlg)
end;
Result := ReminderTreeMenuDlg;
end
else
begin
if(not assigned(ReminderTreeMenu)) then
begin
ReminderTreeMenu := TORPopupMenu.Create(nil);
SetReminderPopupRoutine(ReminderTreeMenu);
end;
Result := ReminderTreeMenu;
end;
end;
procedure RemContextPopup(AData: Pointer; Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
var
Menu: TORPopupMenu;
MItem: TMenuItem;
M: TMethod;
p1: string;
UpdateMenu: boolean;
begin
UpdateMenu := TRUE;
Menu := nil;
with (Sender as TORTreeView) do
begin
if((htOnItem in GetHitTestInfoAt(MousePos.X, MousePos.Y)) and (assigned(Selected))) then
begin
p1 := Piece((Selected as TORTreeNode).StringData, U, 1);
if(Copy(p1,1,1) = RemCode) then
begin
Menu := ReminderMenu(TComponent(Sender));
Menu.Data := TORTreeNode(Selected).StringData;
end
else
if(Copy(p1,1,1) = CatCode) and (p1 <> OtherCatID) and (Selected.HasChildren) then
begin
if(not assigned(ReminderCatMenu)) then
begin
ReminderCatMenu := TPopupMenu.Create(nil);
MItem := TMenuItem.Create(ReminderCatMenu);
MItem.Caption := EvalCatName;
M.Data := nil;
M.Code := @EvaluateCategoryClicked;
MItem.OnClick := TNotifyEvent(M);
ReminderCatMenu.Items.Add(MItem);
end
else
MItem := ReminderCatMenu.Items[0];
PopupMenu := ReminderCatMenu;
MItem.Tag := Integer(TORTreeNode(Selected));
UpdateMenu := FALSE;
end;
end;
if UpdateMenu then
PopupMenu := Menu;
Selected := Selected; // This strange line Keeps item selected after a right click
if(not assigned(PopupMenu)) then
Handled := TRUE;
end;
end;
{ StringData of the TORTreeNodes will be in the format:
1 2 3 4 5 6 7
TYPE + IEN^PRINT NAME^DUE DATE/TIME^LAST OCCURENCE DATE/TIME^PRIORITY^DUE^DIALOG
8 9 10
Formated Due Date^Formated Last Occurence Date^InitialAbsoluteIdx
where TYPE C=Category, R=Reminder
PRIORITY 1=High, 2=Normal, 3=Low
DUE 0=Applicable, 1=Due, 2=Not Applicable
DIALOG 1=Active Dialog Exists
}
procedure BuildReminderTree(Tree: TORTreeView);
var
ExpandedStr: string;
TopID1, TopID2: string;
SelID1, SelID2: string;
i, j: integer;
NeedLost: boolean;
Tmp, Data, LostCat, Code: string;
Node: TORTreeNode;
M: TMethod;
Rem: TReminder;
OpenDue, Found: boolean;
function Add2Tree(Folder: TRemFolder; CatID: string; Node: TORTreeNode = nil): TORTreeNode;
begin
if (Folder = rfUnknown) or (Folder in GetRemFolders) then
begin
if(CatID = LostCatID) then
begin
if(NeedLost) then
begin
(Tree.Items.AddFirst(nil,'') as TORTreeNode).StringData := LostCatString;
NeedLost := FALSE;
end;
end;
if(not assigned(Node)) then
Node := Tree.FindPieceNode(CatID, 1);
if(assigned(Node)) then
begin
Result := (Tree.Items.AddChild(Node,'') as TORTreeNode);
Result.StringData := Data;
end
else
Result := nil;
end
else
Result := nil;
end;
begin
if(not assigned(Tree)) then exit;
Tree.Items.BeginUpdate;
try
Tree.NodeDelim := U;
Tree.NodePiece := 2;
M.Code := @GetImageIndex;
M.Data := nil;
Tree.OnGetImageIndex := TTVExpandedEvent(M);
Tree.OnGetSelectedIndex := TTVExpandedEvent(M);
M.Code := @RemContextPopup;
Tree.OnContextPopup := TContextPopupEvent(M);
if(assigned(Tree.TopItem)) then
begin
TopID1 := Tree.GetNodeID(TORTreeNode(Tree.TopItem), 1, IncludeParentID);
TopID2 := Tree.GetNodeID(TORTreeNode(Tree.TopItem), 1);
end
else
TopID1 := U;
if(assigned(Tree.Selected)) then
begin
SelID1 := Tree.GetNodeID(TORTreeNode(Tree.Selected), 1, IncludeParentID);
SelID2 := Tree.GetNodeID(TORTreeNode(Tree.Selected), 1);
end
else
SelID1 := U;
ExpandedStr := Tree.GetExpandedIDStr(1, IncludeParentID);
OpenDue := (ExpandedStr = '');
Tree.Items.Clear;
NeedLost := TRUE;
if(rfDue in GetRemFolders) then
(Tree.Items.Add(nil,'') as TORTreeNode).StringData := DueCatString;
if(rfApplicable in GetRemFolders) then
(Tree.Items.Add(nil,'') as TORTreeNode).StringData := ApplCatString;
if(rfNotApplicable in GetRemFolders) then
(Tree.Items.Add(nil,'') as TORTreeNode).StringData := NotApplCatString;
if(rfEvaluated in GetRemFolders) then
(Tree.Items.Add(nil,'') as TORTreeNode).StringData := EvaluatedCatString;
if(rfOther in GetRemFolders) then
(Tree.Items.Add(nil,'') as TORTreeNode).StringData := OtherCatString;
for i := 0 to EvaluatedReminders.Count-1 do
begin
Data := RemCode + EvaluatedReminders[i];
Tmp := Piece(Data,U,6);
// if(Tmp = '1') then Add2Tree(rfDue, DueCatID)
if(Tmp = '1') or (Tmp = '3') or (Tmp = '4') then Add2Tree(rfDue, DueCatID) //AGP Error code change 26.8
else if(Tmp = '0') then Add2Tree(rfApplicable, ApplCatID)
else Add2Tree(rfNotApplicable, NotApplCatID);
Add2Tree(rfEvaluated, EvaluatedCatID);
end;
if(rfOther in GetRemFolders) and (OtherReminders.Count > 0) then
begin
for i := 0 to OtherReminders.Count-1 do
begin
Tmp := OtherReminders[i];
if(Piece(Tmp, U, 2) = CatCode) then
Data := CatCode + Piece(Tmp, U, 1)
else
begin
Code := Piece(Tmp, U, 5);
Data := RemCode + Code;
Node := Tree.FindPieceNode(Data, 1);
if(assigned(Node)) then
Data := Node.StringData
else
begin
j := EvaluatedReminders.IndexOfPiece(Code);
if(j >= 0) then
SetPiece(Data, U, 6, Piece(EvaluatedReminders[j], U, 6));
end;
end;
SetPiece(Data, U, 2, Piece(Tmp, U ,3));
SetPiece(Data, U, 7, Piece(Tmp, U, 6));
Tmp := CatCode + Piece(Tmp, U, 4);
Add2Tree(rfOther, OtherCatID, Tree.FindPieceNode(Tmp, 1));
end;
end;
{ The Lost category is for reminders being processed that are no longer in the
reminder tree view. This can happen with reminders that were Due or Applicable,
but due to user action are no longer applicable, or due to location changes.
The Lost category will not be used if a lost reminder is in the other list. }
if(RemindersInProcess.Count > 0) then
begin
for i := 0 to RemindersInProcess.Count-1 do
begin
Rem := TReminder(RemindersInProcess.Objects[i]);
Tmp := RemCode + Rem.IEN;
Found := FALSE;
Node := nil;
repeat
Node := Tree.FindPieceNode(Tmp, 1, #0, Node); // look in the tree first
if((not Found) and (not assigned(Node))) then
begin
Data := Tmp + U + Rem.PrintName + U + Rem.DueDateStr + U + Rem.LastDateStr + U +
IntToStr(Rem.Priority) + U + Rem.Status;
if(Rem.Status = '1') then LostCat := DueCatID
else if(Rem.Status = '0') then LostCat := ApplCatID
else LostCat := LostCatID;
Node := Add2Tree(rfUnknown, LostCat);
end;
if(assigned(Node)) then
begin
Node.Bold := Rem.Processing;
Found := TRUE;
end;
until(Found and (not assigned(Node)));
end;
end;
for i := 0 to Tree.Items.Count-1 do
begin
Node := TORTreeNode(Tree.Items[i]);
for j := 3 to 4 do
begin
Tmp := Piece(Node.StringData, U, j);
if(Tmp = '') then
Data := ''
else
Data := FormatFMDateTimeStr(ReminderDateFormat, Tmp);
Node.SetPiece(j + (RemTreeDateIdx - 3), Data);
end;
Node.SetPiece(RemTreeDateIdx + 2, IntToStr(Node.AbsoluteIndex));
Tmp := Piece(Node.StringData, U, 5);
if(Tmp <> '1') and (Tmp <> '3') then
Node.SetPiece(5, '2');
end;
finally
Tree.Items.EndUpdate;
end;
if(SelID1 = U) then
Node := nil
else
begin
Node := Tree.FindPieceNode(SelID1, 1, IncludeParentID);
if(not assigned(Node)) then
Node := Tree.FindPieceNode(SelID2, 1);
if(assigned(Node)) then
Node.EnsureVisible;
end;
Tree.Selected := Node;
Tree.SetExpandedIDStr(1, IncludeParentID, ExpandedStr);
if(OpenDue) then
begin
Node := Tree.FindPieceNode(DueCatID, 1);
if(assigned(Node)) then
Node.Expand(FALSE);
end;
if(TopID1 = U) then
Tree.TopItem := Tree.Items.GetFirstNode
else
begin
Tree.TopItem := Tree.FindPieceNode(TopID1, 1, IncludeParentID);
if(not assigned(Tree.TopItem)) then
Tree.TopItem := Tree.FindPieceNode(TopID2, 1);
end;
end;
function ReminderNode(Node: TTreeNode): TORTreeNode;
var
p1: string;
begin
Result := nil;
if(assigned(Node)) then
begin
p1 := Piece((Node as TORTreeNode).StringData, U, 1);
if(Copy(p1,1,1) = RemCode) then
Result := (Node as TORTreeNode)
end;
end;
procedure LocationChanged(Sender: TObject);
begin
LoadReminderData;
end;
procedure ClearReminderData;
var
Changed: boolean;
begin
if(assigned(frmReminderTree)) then
frmReminderTree.Free;
Changed := ((ActiveReminders.Count > 0) or (OtherReminders.Count > 0) or
(ProcessingChangeString <> U));
ActiveReminders.Notifier.BeginUpdate;
OtherReminders.Notifier.BeginUpdate;
RemindersInProcess.Notifier.BeginUpdate;
try
ProcessedReminders.Clear;
if(assigned(KillReminderDialogProc)) then
KillReminderDialogProc(nil);
ActiveReminders.Clear;
OtherReminders.Clear;
EvaluatedReminders.Clear;
ReminderCallList.Clear;
RemindersInProcess.KillObjects;
RemindersInProcess.Clear;
LastProcessingList := '';
InitialRemindersLoaded := FALSE;
CoverSheetRemindersInBackground := FALSE;
finally
RemindersInProcess.Notifier.EndUpdate;
OtherReminders.Notifier.EndUpdate;
ActiveReminders.Notifier.EndUpdate(Changed);
RemindersStarted := FALSE;
LastReminderLocation := -2;
RemForm.Form := nil;
end;
end;
procedure RemindersInProcessChanged(Data: Pointer; Sender: TObject; var CanNotify: boolean);
var
CurProcessing: string;
begin
CurProcessing := ProcessingChangeString;
CanNotify := (LastProcessingList <> CurProcessing);
if(CanNotify) then
LastProcessingList := CurProcessing;
end;
procedure InitReminderObjects;
var
M: TMethod;
procedure InitReminderList(var List: TORStringList);
begin
if(not assigned(List)) then
List := TORStringList.Create;
end;
begin
InitReminderList(ActiveReminders);
InitReminderList(OtherReminders);
InitReminderList(EvaluatedReminders);
InitReminderList(ReminderCallList);
InitReminderList(RemindersInProcess);
InitReminderList(ProcessedReminders);
M.Code := @RemindersInProcessChanged;
M.Data := nil;
RemindersInProcess.Notifier.OnNotify := TCanNotifyEvent(M);
AddToNotifyWhenCreated(LocationChanged, TEncounter);
RemForm.Form := nil;
end;
procedure FreeReminderObjects;
begin
KillObj(@ActiveReminders);
KillObj(@OtherReminders);
KillObj(@EvaluatedReminders);
KillObj(@ReminderTreeMenuDlg);
KillObj(@ReminderTreeMenu);
KillObj(@ReminderCatMenu);
KillObj(@EducationTopics);
KillObj(@WebPages);
KillObj(@ReminderCallList);
KillObj(@TmpActive);
KillObj(@TmpOther);
KillObj(@RemindersInProcess, TRUE);
KillObj(@ReminderDialogInfo, TRUE);
KillObj(@PCERootList, TRUE);
KillObj(@ProcessedReminders);
end;
function GetReminder(ARemData: string): TReminder;
var
idx: integer;
SIEN: string;
begin
Result := nil;
SIEN := Piece(ARemData, U, 1);
if(Copy(SIEN,1,1) = RemCode) then
begin
SIEN := copy(Sien, 2, MaxInt);
idx := RemindersInProcess.IndexOf(SIEN);
if(idx < 0) then
begin
RemindersInProcess.Notifier.BeginUpdate;
try
idx := RemindersInProcess.AddObject(SIEN, TReminder.Create(ARemData));
finally
RemindersInProcess.Notifier.EndUpdate;
end;
end;
Result := TReminder(RemindersInProcess.Objects[idx]);
end;
end;
var
ScootOver: integer = 0;
procedure WordWrap(AText: string; Output: TStrings; LineLength: integer;
AutoIndent: integer = 4; MHTest: boolean = false);
var
i, j, l, max, FCount, MHLoop: integer;
First, MHRes: boolean;
OrgText, Text, Prefix, tmpText: string;
begin
StripScreenReaderCodes(AText);
inc(LineLength, ScootOver);
dec(AutoIndent, ScootOver);
FCount := Output.Count;
First := TRUE;
MHLoop := 1;
MHRes := False;
tmpText := '';
if (MHTest = True) and (Pos('~', AText)>0) then MHLoop := 2;
for j := 1 to MHLoop do
begin
if (j = 1) and (MHLoop = 2) then
begin
tmpText := Piece(AText, '~', 1);
MHRes := True;
end
else if (j = 2) then
begin
tmpText := Piece(AText, '~', 2);
First := False;
MHRes := False;
end
else if (j = 1) and (MHLoop = 1) then
begin
tmpText := AText;
First := False;
MHRes := False;
end;
if tmpText <> '' then OrgText := tmpText
else OrgText := InitText(AText);
Prefix := StringOfChar(' ',74-LineLength);
repeat
i := pos(CRCode, OrgText);
if(i = 0) then
begin
Text := OrgText;
OrgText := '';
end
else
begin
Text := copy(OrgText, 1, i - 1);
delete(OrgText, 1, i + CRCodeLen - 1);
end;
if(Text = '') and (OrgText <> '') then
begin
Output.Add('');
inc(FCount);
end;
while(Text <> '') do
begin
max := length(Text);
if(max > LineLength) then
begin
l := LineLength + 1;
while(l > 0) and (Text[l] <> ' ') do dec(l);
if(l < 1) then
begin
Output.Add(Prefix+copy(Text,1,LineLength));
delete(Text,1,LineLength);
end
else
begin
Output.Add(Prefix+copy(Text,1,l-1));
while(l <= max) and (Text[l] = ' ') do inc(l);
delete(Text,1,l-1);
end;
if(First) then
begin
dec(LineLength, AutoIndent);
Prefix := Prefix + StringOfChar(' ', AutoIndent);
First := FALSE;
end;
end
else
begin
Output.Add(Prefix+Text);
Text := '';
end;
end;
if ((First) and (FCount <> Output.Count)) and (MHRes = False) then
begin
dec(LineLength, AutoIndent);
Prefix := Prefix + StringOfChar(' ', AutoIndent);
First := FALSE;
end;
until(OrgText = '');
end;
end;
function InteractiveRemindersActive: boolean;
begin
if(not InteractiveRemindersActiveChecked) then
begin
InteractiveRemindersActiveStatus := GetRemindersActive;
InteractiveRemindersActiveChecked := TRUE;
end;
Result := InteractiveRemindersActiveStatus;
end;
function GetReminderData(Rem: TReminderDialog; Lst: TStrings; Finishing: boolean = FALSE;
Historical: boolean = FALSE): integer;
begin
Result := Rem.AddData(Lst, Finishing, Historical);
end;
function GetReminderData(Lst: TStrings; Finishing: boolean = FALSE;
Historical: boolean = FALSE): integer;
var
i: integer;
begin
Result := 0;
for i := 0 to RemindersInProcess.Count-1 do
inc(Result, TReminder(RemindersInProcess.Objects[i]).AddData(Lst, Finishing, Historical));
end;
procedure SetReminderFormBounds(Frm: TForm; DefX, DefY, DefW, DefH, ALeft, ATop, AWidth, AHeight: integer);
var
Rect: TRect;
ScreenW, ScreenH: integer;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0);
ScreenW := Rect.Right - Rect.Left + 1;
ScreenH := Rect.Bottom - Rect.Top + 1;
if(AWidth = 0) then
AWidth := DefW
else
DefW := AWidth;
if(AHeight = 0) then
AHeight := DefH
else
DefH := AHeight;
if(DefX = 0) and (DefY = 0) then
begin
DefX := (ScreenW - DefW) div 2;
DefY := (ScreenH - DefH) div 2;
end
else
dec(DefY, DefH);
if((ALeft <= 0) or (ATop <= 0) or
((ALeft + AWidth) > ScreenW) or
((ATop + AHeight) > ScreenH)) then
begin
if(DefX < 0) then
DefX := 0
else
if((DefX + DefW) > ScreenW) then
DefX := ScreenW-DefW;
if(DefY < 0) then
DefY := 0
else
if((DefY + DefH) > ScreenH) then
DefY := ScreenH-DefH;
Frm.SetBounds(Rect.Left + DefX, Rect.Top + DefY, DefW, DefH);
end
else
Frm.SetBounds(Rect.Left + ALeft, Rect.Top + ATop, AWidth, AHeight);
end;
procedure UpdateReminderDialogStatus;
var
TmpSL: TStringList;
Changed: boolean;
procedure Build(AList :TORStringList; PNum: integer);
var
i: integer;
Code: string;
begin
for i := 0 to AList.Count-1 do
begin
Code := Piece(AList[i],U,PNum);
if((Code <> '') and (TmpSL.IndexOf(Code) < 0)) then
TmpSL.Add(Code);
end;
end;
procedure Reset(AList: TORStringList; PNum, DlgPNum: integer);
var
i, j: integer;
Tmp, Code, Dlg: string;
begin
for i := 0 to TmpSL.Count-1 do
begin
Code := Piece(TmpSL[i],U,1);
j := -1;
repeat
j := AList.IndexOfPiece(Code, U, PNum, j);
if(j >= 0) then
begin
Dlg := Piece(TmpSL[i],U,2);
if(Dlg <> Piece(AList[j], U, DlgPNum)) then
begin
Tmp := AList[j];
SetPiece(Tmp, U, DlgPNum, Dlg);
AList[j] := Tmp;
Changed := TRUE;
end;
end;
until (j < 0);
end;
end;
begin
Changed := FALSE;
BeginReminderUpdate;
try
TmpSL := TStringList.Create;
try
Build(ActiveReminders, 1);
Build(OtherReminders, 5);
Build(EvaluatedReminders, 1);
GetDialogStatus(TmpSL);
Reset(ActiveReminders, 1, 7);
Reset(OtherReminders, 5, 6);
Reset(EvaluatedReminders, 1, 7);
finally
TmpSL.Free;
end;
finally
EndReminderUpdate(Changed);
end;
end;
procedure PrepText4NextLine(var txt: string);
var
tlen: integer;
begin
if(txt <> '') then
begin
tlen := length(txt);
if(copy(txt, tlen - CRCodeLen + 1, CRCodeLen) = CRCode) then
exit;
if(copy(txt, tlen, 1) = '.') then
txt := txt + ' ';
txt := txt + ' ';
end;
end;
procedure ExpandTIUObjects(var Txt: string; msg: string = '');
var
ObjList: TStringList;
Err: TStringList;
i, j, k, oLen: integer;
obj, ObjTxt: string;
begin
ObjList := TStringList.Create;
try
Err := nil;
if(not dmodShared.BoilerplateOK(Txt, CRCode, ObjList, Err)) and (assigned(Err)) then
begin
try
Err.Add(CRLF + 'Contact IRM and inform them about this error.' + CRLF +
'Make sure you give them the name of the reminder that you are processing,' + CRLF +
'and which dialog elements were selected to produce this error.');
InfoBox(Err.Text,'Reminder Boilerplate Object Error', MB_OK + MB_ICONERROR);
finally
Err.Free;
end;
end;
if(ObjList.Count > 0) then
begin
GetTemplateText(ObjList);
i := 0;
while (i < ObjList.Count) do
begin
if(pos(ObjMarker, ObjList[i]) = 1) then
begin
obj := copy(ObjList[i], ObjMarkerLen+1, MaxInt);
if(obj = '') then break;
j := i + 1;
while (j < ObjList.Count) and (pos(ObjMarker, ObjList[j]) = 0) do
inc(j);
if((j - i) > 2) then
begin
ObjTxt := '';
for k := i+1 to j-1 do
ObjTxt := ObjTxt + CRCode + ObjList[k];
end
else
ObjTxt := ObjList[i+1];
i := j;
obj := '|' + obj + '|';
oLen := length(obj);
repeat
j := pos(obj, Txt);
if(j > 0) then
begin
delete(Txt, j, OLen);
insert(ObjTxt, Txt, j);
end;
until(j = 0);
end
else
inc(i);
end
end;
finally
ObjList.Free;
end;
end;
{ TReminderDialog }
const
RPCCalled = '99';
DlgCalled = RPCCalled + U + 'DLG';
constructor TReminderDialog.BaseCreate;
var
idx, eidx, i: integer;
TempSL: TORStringList;
ParentID: string;
// Line: string;
Element: TRemDlgElement;
begin
TempSL := GetDlgSL;
if Piece(TempSL[0],U,2)='1' then
begin
Self.RemWipe := 1;
end;
idx := -1;
repeat
idx := TempSL.IndexOfPiece('1', U, 1, idx);
if(idx >= 0) then
begin
if(not assigned(FElements)) then
FElements := TStringList.Create;
eidx := FElements.AddObject('',TRemDlgElement.Create);
Element := TRemDlgElement(FElements.Objects[eidx]);
with Element do
begin
FReminder := Self;
FRec1 := TempSL[idx];
FID := Piece(FRec1, U, 2);
FDlgID := Piece(FRec1, U, 3);
FElements[eidx] := FDlgID;
if(ElemType = etTaxonomy) then
FTaxID := BOOLCHAR[Historical] + FindingType
else
FTaxID := '';
FText := '';
i := -1;
// if Piece(FRec1,U,5) <> '1' then
repeat
i := TempSL.IndexOfPieces(['2',FID,FDlgID],i);
if(i >= 0) then
begin
PrepText4NextLine(FText);
FText := FText + Trim(Piece(TempSL[i], U, 4));
end;
until(i < 0);
ExpandTIUObjects(FText);
AssignFieldIDs(FText);
if(pos('.',FDlgID)>0) then
begin
ParentID := FDlgID;
i := length(ParentID);
while((i > 0) and (ParentID[i] <> '.')) do
dec(i);
if(i > 0) then
begin
ParentID := copy(ParentID,1,i-1);
i := FElements.IndexOf(ParentID);
if(i >= 0) then
begin
FParent := TRemDlgElement(FElements.Objects[i]);
if(not assigned(FParent.FChildren)) then
FParent.FChildren := TList.Create;
FParent.FChildren.Add(Element);
end;
end;
end;
if(ElemType = etDisplayOnly) then
SetChecked(TRUE);
UpdateData;
end;
end;
until(idx < 0);
end;
constructor TReminderDialog.Create(ADlgData: string);
begin
FDlgData := ADlgData;
BaseCreate;
end;
destructor TReminderDialog.Destroy;
begin
KillObj(@FElements, TRUE);
inherited;
end;
function TReminderDialog.Processing: boolean;
var
i,j: integer;
Elem: TRemDlgElement;
RData: TRemData;
function ChildrenChecked(Prnt: TRemDlgElement): boolean; forward;
function CheckItem(Item: TRemDlgElement): boolean;
begin
if(Item.ElemType = etDisplayOnly) then
begin
Result := ChildrenChecked(Item);
if(not Result) then
Result := Item.Add2PN;
end
else
Result := Item.FChecked;
end;
function ChildrenChecked(Prnt: TRemDlgElement): boolean;
var
i: integer;
begin
Result := FALSE;
if(assigned(Prnt.FChildren)) then
begin
for i := 0 to Prnt.FChildren.Count-1 do
begin
Result := CheckItem(TRemDlgElement(Prnt.FChildren[i]));
if(Result) then break;
end;
end;
end;
begin
Result := FALSE;
if(assigned(FElements)) then
begin
for i := 0 to FElements.Count-1 do
begin
Elem := TRemDlgElement(FElements.Objects[i]);
if(not assigned(Elem.FParent)) then
begin
Result := CheckItem(Elem);
if (Result = false) then //(AGP CHANGE 24.9 add check to have the finish problem check for MH test)
begin
if (assigned(Elem.FData)) then
begin
for j := 0 to Elem.FData.Count-1 do
begin
RData := TRemData(Elem.FData[j]);
if piece(RData.FRec3,U,4)='MH' then
Result := True;
if (Result) then break;
end;
end;
end;
if(Result) then break;
end;
end;
end;
end;
function TReminderDialog.GetDlgSL: TORStringList;
var
idx: integer;
begin
if(not assigned(ReminderDialogInfo)) then
ReminderDialogInfo := TStringList.Create;
idx := ReminderDialogInfo.IndexOf(GetIEN);
if(idx < 0) then
idx := ReminderDialogInfo.AddObject(GetIEN, TORStringList.Create);
Result := TORStringList(ReminderDialogInfo.Objects[idx]);
if(Result.Count = 0) then
begin
FastAssign(GetDialogInfo(GetIEN, (Self is TReminder)), Result);
Result.Add(DlgCalled); // Used to prevent repeated calling of RPC if dialog is empty
end;
end;
function TReminderDialog.BuildControls(ParentWidth: integer; AParent, AOwner: TWinControl): TWinControl;
var
Y, i: integer;
Elem: TRemDlgElement;
ERes: TWinControl;
begin
Result := nil;
if(assigned(FElements)) then
begin
Y := 0;
for i := 0 to FElements.Count-1 do
begin
Elem := TRemDlgElement(FElements.Objects[i]);
if (not assigned(Elem.FParent)) then
begin
ERes := Elem.BuildControls(Y, ParentWidth, AParent, AOwner);
if(not assigned(Result)) then
Result := ERes;
end;
end;
end;
if(AParent.ControlCount = 0) then
begin
with TVA508StaticText.Create(AOwner) do
begin
Parent := AParent;
Caption := 'No Dialog found for ' + Trim(GetPrintName) + ' Reminder.';
Left := Gap;
Top := Gap;
end;
end;
ElementChecked := nil;
end;
procedure TReminderDialog.AddText(Lst: TStrings);
var
i, idx: integer;
Elem: TRemDlgElement;
temp: string;
begin
if(assigned(FElements)) then
begin
idx := Lst.Count;
for i := 0 to FElements.Count-1 do
begin
Elem := TRemDlgElement(FElements.Objects[i]);
if (not assigned(Elem.FParent)) then
Elem.AddText(Lst);
end;
if (Self is TReminder) and (PrintName <> '') and (idx <> Lst.Count) then
begin
temp := PrintName;
StripScreenReaderCodes(temp);
Lst.Insert(idx, ' ' + temp + ':')
end;
end;
end;
function TReminderDialog.AddData(Lst: TStrings; Finishing: boolean = FALSE;
Historical: boolean = FALSE): integer;
var
i: integer;
Elem: TRemDlgElement;
begin
Result := 0;
if(assigned(FElements)) then
begin
for i := 0 to FElements.Count-1 do
begin
Elem := TRemDlgElement(FElements.Objects[i]);
if (not assigned(Elem.FParent)) then
inc(Result, Elem.AddData(Lst, Finishing, Historical));
end;
end;
end;
procedure TReminderDialog.ComboBoxCheckedText(Sender: TObject; NumChecked: integer; var Text: string);
var
i, Done: integer;
DotLen, ComLen, TxtW, TotalW, NewLen: integer;
tmp: string;
Fnt: THandle;
lb: TORListBox;
begin
if(NumChecked = 0) then
Text := '(None Selected)'
else
if(NumChecked > 1) then
begin
Text := '';
lb := (Sender as TORListBox);
Fnt := lb.Font.Handle;
DotLen := TextWidthByFont(Fnt, '...');
TotalW := (lb.Owner as TControl).ClientWidth - 15;
ComLen := TextWidthByFont(fnt, ', ');
dec(TotalW,(NumChecked-1) * ComLen);
Done := 0;
for i := 0 to lb.Items.Count-1 do
begin
if(lb.Checked[i]) then
begin
inc(Done);
if(Text <> '') then
begin
Text := Text + ', ';
dec(TotalW, ComLen);
end;
Tmp := lb.DisplayText[i];
if(Done = NumChecked) then
TxtW := TotalW
else
TxtW := TotalW div (NumChecked - Done + 1);
NewLen := NumCharsFitInWidth(fnt, Tmp, TxtW);
if(NewLen < length(Tmp)) then
Tmp := copy(Tmp,1,NumCharsFitInWidth(fnt, Tmp, (TxtW - DotLen))) + '...';
dec(TotalW, TextWidthByFont(fnt, Tmp));
Text := Text + Tmp;
end;
end;
end;
end;
procedure TReminderDialog.BeginTextChanged;
begin
inc(FTextChangedCount);
end;
procedure TReminderDialog.EndTextChanged(Sender: TObject);
begin
if(FTextChangedCount > 0) then
begin
dec(FTextChangedCount);
if(FTextChangedCount = 0) and assigned(FOnTextChanged) then
FOnTextChanged(Sender);
end;
end;
function TReminderDialog.GetIEN: string;
begin
Result := Piece(FDlgData, U, 1);
end;
function TReminderDialog.GetPrintName: string;
begin
Result := Piece(FDlgData, U, 2);
end;
procedure TReminderDialog.BeginNeedRedraw;
begin
inc(FNeedRedrawCount);
end;
procedure TReminderDialog.EndNeedRedraw(Sender: TObject);
begin
if(FNeedRedrawCount > 0) then
begin
dec(FNeedRedrawCount);
if(FNeedRedrawCount = 0) and (assigned(FOnNeedRedraw)) then
FOnNeedRedraw(Sender);
end;
end;
procedure TReminderDialog.FinishProblems(List: TStrings; var MissingTemplateFields: boolean);
var
i: integer;
Elem: TRemDlgElement;
TmpSL: TStringList;
FldData: TORStringList;
begin
if(Processing and assigned(FElements)) then
begin
TmpSL := TStringList.Create;
try
FldData := TORStringList.Create;
try
for i := 0 to FElements.Count-1 do
begin
Elem := TRemDlgElement(FElements.Objects[i]);
if (not assigned(Elem.FParent)) then
begin
Elem.FinishProblems(List);
Elem.GetFieldValues(FldData);
end;
end;
FNoResolve := TRUE;
try
AddText(TmpSL);
finally
FNoResolve := FALSE;
end;
MissingTemplateFields := AreTemplateFieldsRequired(TmpSL.Text, FldData);
finally
FldData.Free;
end;
finally
TmpSL.Free;
end;
end;
end;
procedure TReminderDialog.ComboBoxResized(Sender: TObject);
begin
// This causes the ONCheckedText event to re-fire and re-update the text,
// based on the new size of the combo box.
if(Sender is TORComboBox) then
with (Sender as TORComboBox) do
OnCheckedText := OnCheckedText;
end;
function TReminderDialog.Visible: boolean;
begin
Result := (CurrentReminderInDialog = Self);
end;
{ TReminder }
constructor TReminder.Create(ARemData: string);
begin
FRemData := ARemData;
BaseCreate;
end;
function TReminder.GetDueDateStr: string;
begin
Result := Piece(FRemData, U ,3);
end;
function TReminder.GetIEN: string;
begin
Result := copy(Piece(FRemData, U, 1), 2, MaxInt);
end;
function TReminder.GetLastDateStr: string;
begin
Result := Piece(FRemData, U ,4);
end;
function TReminder.GetPrintName: string;
begin
Result := Piece(FRemData, U ,2);
end;
function TReminder.GetPriority: integer;
begin
Result := StrToIntDef(Piece(FRemData, U ,5), 2);
end;
function TReminder.GetStatus: string;
begin
Result := Piece(FRemData, U ,6);
end;
{ TRemDlgElement }
function Code2DataType(Code: string): TRemDataType;
var
idx: TRemDataType;
begin
Result := dtUnknown;
for idx := low(TRemDataType) to high(TRemDataType) do
begin
if(Code = RemDataCodes[idx]) then
begin
Result := idx;
break;
end;
end;
end;
function Code2PromptType(Code: string): TRemPromptType;
var
idx: TRemPromptType;
begin
if(Code = '') then
Result := ptSubComment
else
if(Code = MSTCode) then
Result := ptMST
else
begin
Result := ptUnknown;
for idx := low(TRemPromptType) to high(TRemPromptType) do
begin
if(Code = RemPromptCodes[idx]) then
begin
Result := idx;
break;
end;
end;
end;
end;
function TRemDlgElement.Add2PN: boolean;
var
Lst: TStringList;
begin
if (FChecked) then
begin
Result := (Piece(FRec1, U, 5) <> '1');
//Suppress := (Piece(FRec1,U,1)='1');
if(Result and (ElemType = etDisplayOnly)) then
begin
//Result := FALSE;
if(assigned(FPrompts) and (FPrompts.Count > 0)) or
(assigned(FData) and (FData.Count > 0)) or Result then
begin
Lst := TStringList.Create;
try
AddData(Lst, FALSE);
Result := (Lst.Count > 0);
if not assigned(FData) then Result := True;
finally
Lst.Free;
end;
end;
end;
end
else
Result := FALSE;
end;
function TRemDlgElement.Box: boolean;
begin
Result := (Piece(FRec1, U, 19) = '1');
end;
function TRemDlgElement.BoxCaption: string;
begin
if(Box) then
Result := Piece(FRec1, U, 20)
else
Result := '';
end;
function TRemDlgElement.ChildrenIndent: integer;
begin
Result := StrToIntDef(Piece(FRec1, U, 16), 0);
end;
function TRemDlgElement.ChildrenRequired: TRDChildReq;
var
Tmp: string;
begin
Tmp := Piece(FRec1, U, 18);
if Tmp = '1' then Result := crOne
else if Tmp = '2' then Result := crAtLeastOne
else if Tmp = '3' then Result := crNoneOrOne
else if Tmp = '4' then result := crAll
else Result := crNone;
end;
function TRemDlgElement.ChildrenSharePrompts: boolean;
begin
Result := (Piece(FRec1, U, 17) = '1');
end;
destructor TRemDlgElement.Destroy;
begin
KillObj(@FFieldValues);
KillObj(@FData, TRUE);
KillObj(@FPrompts, TRUE);
KillObj(@FChildren);
inherited;
end;
function TRemDlgElement.ElemType: TRDElemType;
var
Tmp: string;
begin
Tmp := Piece(FRec1, U, 4);
if(Tmp = 'D') then Result := etDisplayOnly
else if(Tmp = 'T') then Result := etTaxonomy
else Result := etCheckBox;
end;
function TRemDlgElement.FindingType: string;
begin
if(ElemType = etTaxonomy) then
Result := Piece(FRec1, U, 7)
else
Result := '';
end;
function TRemDlgElement.HideChildren: boolean;
begin
Result := (Piece(FRec1, U, 15) <> '0');
end;
function TRemDlgElement.Historical: boolean;
begin
Result := (Piece(FRec1, U, 8) = '1');
end;
function TRemDlgElement.Indent: integer;
begin
Result := StrToIntDef(Piece(FRec1, U, 6), 0);
end;
procedure TRemDlgElement.GetData;
var
TempSL: TStrings;
i: integer;
Tmp: string;
begin
if FHaveData then exit;
if(FReminder.GetDlgSL.IndexOfPieces([RPCCalled, FID, FTaxID]) < 0) then
begin
TempSL := GetDialogPrompts(FID, Historical, FindingType);
TempSL.Add(RPCCalled);
for i := 0 to TempSL.Count-1 do
begin
Tmp := TempSL[i];
SetPiece(Tmp,U,2,FID);
SetPiece(Tmp,U,3,FTaxID);
TempSL[i] := Tmp;
end;
FastAddStrings(TempSL, FReminder.GetDlgSL);
end;
UpdateData;
end;
procedure TRemDlgElement.UpdateData;
var
Ary: array of integer;
idx, i,cnt: integer;
TempSL: TORStringList;
RData: TRemData;
RPrompt: TRemPrompt;
Tmp, Tmp2: string;
NewLine: boolean;
dt: TRemDataType;
pt: TRemPromptType;
DateRange: string;
ChoicesActiveDates: TStringList;
ChoiceIdx: integer;
Piece7: string;
begin
if FHaveData then exit;
TempSL := FReminder.GetDlgSL;
if(TempSL.IndexOfPieces([RPCCalled, FID, FTaxID]) >= 0) then
begin
FHaveData := TRUE;
RData := nil;
idx := -1;
repeat
idx := TempSL.IndexOfPieces(['3', FID, FTaxID], idx);
if (idx >= 0) and (Pieces(TempSL[idx-1],U,1,6) = Pieces(TempSL[idx],u,1,6)) then
if pos(':', Piece(TempSL[idx],U,7)) > 0 then //if has date ranges
begin
if RData <> nil then
begin
if (not assigned(RData.FActiveDates)) then
RData.FActiveDates := TStringList.Create;
DateRange := Pieces(Piece(TempSL[idx],U,7),':',2,3);
RData.FActiveDates.Add(DateRange);
end;
end;
if(idx >= 0) and (Pieces(TempSL[idx-1],U,1,6) <> Pieces(TempSL[idx],u,1,6)) then
begin
dt := Code2DataType(piece(TempSL[idx], U, r3Type));
if(dt <> dtUnknown) and ((dt <> dtOrder) or
(CharAt(piece(TempSL[idx], U, 11),1) in ['D', 'Q', 'M', 'O', 'A'])) and //AGP change 26.10 for allergy orders
((dt <> dtMentalHealthTest) or MHTestsOK) then
begin
if(not assigned(FData)) then
FData := TList.Create;
RData := TRemData(FData[FData.Add(TRemData.Create)]);
if pos(':',Piece(TempSL[idx],U,7)) > 0 then
begin
RData.FActiveDates := TStringList.Create;
RData.FActiveDates.Add(Pieces(Piece(TempSL[idx],U,7),':',2,3));
end;
with RData do
begin
FParent := Self;
Piece7 := Piece(Piece(TempSL[idx],U,7),':',1);
FRec3 := TempSL[idx];
SetPiece(FRec3,U,7,Piece7);
// FRoot := FRec3;
i := idx + 1;
ChoiceIdx := 0;
while((i < TempSL.Count) and (TempSL.PiecesEqual(i, ['5', FID, FTaxID]))) do
begin
if (Pieces(TempSL[i-1],U,1,6) = Pieces(TempSL[i],U,1,6)) then
begin
if pos(':', Piece(TempSL[i],U,7)) > 0 then
begin
if (not assigned(FChoicesActiveDates)) then
begin
FChoicesActiveDates := TList.Create;
ChoicesActiveDates := TStringList.Create;
FChoicesActiveDates.Insert(ChoiceIdx, ChoicesActiveDates);
end;
TStringList(FChoicesActiveDates[ChoiceIdx]).Add(Pieces(Piece(TempSL[i],U,7),':',2,3));
end;
inc(i);
end
else
begin
if(not assigned(FChoices)) then
begin
FChoices := TORStringList.Create;
if(not assigned(FPrompts)) then
FPrompts := TList.Create;
FChoicePrompt := TRemPrompt(FPrompts[FPrompts.Add(TRemPrompt.Create)]);
with FChoicePrompt do
begin
FParent := Self;
Tmp := Piece(FRec3,U,10);
NewLine := (Tmp <> '');
FRec4 := '4' + U + FID + U + FTaxID + U + U + BOOLCHAR[not RData.Add2PN] + U + U +
'P' + U + Tmp + U + BOOLCHAR[NewLine] + U + '1';
FData := RData;
FOverrideType := ptDataList;
InitValue;
end;
end;
Tmp := TempSL[i];
Piece7 := Piece(Piece(TempSL[i],U,7),':',1);
SetPiece(Tmp,U,7,Piece7);
Tmp2 := Piece(Piece(Tmp,U,r3Code),':',1);
if(Tmp2 <> '') then Tmp2 := ' (' + Tmp2 + ')';
Tmp2 := MixedCase(Piece(Tmp,U,r3Nar)) + Tmp2;
SetPiece(Tmp,U,12,Tmp2);
ChoiceIdx := FChoices.Add(Tmp);
if pos(':',Piece(TempSL[i],U,7)) > 0 then
begin
if (not assigned(FChoicesActiveDates)) then
FChoicesActiveDates := TList.Create;
ChoicesActiveDates := TStringList.Create;
ChoicesActiveDates.Add(Pieces(Piece(TempSL[i],U,7),':',2,3));
FChoicesActiveDates.Insert(ChoiceIdx, ChoicesActiveDates);
end
else
if assigned(FChoicesActiveDates) then
FChoicesActiveDates.Insert(ChoiceIdx, TStringList.Create);
inc(i);
end;
end;
if(assigned(FChoices)) and (FChoices.Count = 1) then // If only one choice just pick it
begin
FPrompts.Remove(FChoicePrompt);
KillObj(@FChoicePrompt);
Tmp := FChoices[0];
KillObj(@FChoices);
cnt := 5;
if(Piece(FRec3,U,9) = '') then inc(cnt);
SetLength(Ary,cnt);
for i := 0 to cnt-1 do
Ary[i] := i+4;
SetPieces(FRec3, U, Ary, Tmp);
end;
if(assigned(FChoices)) then
begin
for i := 0 to FChoices.Count-1 do
FChoices.Objects[i] := TRemPCERoot.GetRoot(RData, FChoices[i], Historical);
end
else
FPCERoot := TRemPCERoot.GetRoot(RData, RData.FRec3, Historical);
if(dt = dtVitals) then
begin
if(Code2VitalType(Piece(FRec3,U,6)) <> vtUnknown) then
begin
if(not assigned(FPrompts)) then
FPrompts := TList.Create;
FChoicePrompt := TRemPrompt(FPrompts[FPrompts.Add(TRemPrompt.Create)]);
with FChoicePrompt do
begin
FParent := Self;
Tmp := Piece(FRec3,U,10);
NewLine := FALSE;
// FRec4 := '4' + U + FID + U + FTaxID + U + U + BOOLCHAR[not RData.Add2PN] + U +
// RData.InternalValue + U + 'P' + U + Tmp + U + BOOLCHAR[SameL] + U + '1';
FRec4 := '4' + U + FID + U + FTaxID + U + U + BOOLCHAR[not RData.Add2PN] + U +
U + 'P' + U + Tmp + U + BOOLCHAR[NewLine] + U + '0';
FData := RData;
FOverrideType := ptVitalEntry;
InitValue;
end;
end;
end;
if(dt = dtMentalHealthTest) then
begin
if(not assigned(FPrompts)) then
FPrompts := TList.Create;
FChoicePrompt := TRemPrompt(FPrompts[FPrompts.Add(TRemPrompt.Create)]);
with FChoicePrompt do
begin
FParent := Self;
Tmp := Piece(FRec3,U,10);
NewLine := FALSE;
// FRec4 := '4' + U + FID + U + FTaxID + U + U + BOOLCHAR[not RData.Add2PN] + U +
// RData.InternalValue + U + 'P' + U + Tmp + U + BOOLCHAR[SameL] + U + '1';
FRec4 := '4' + U + FID + U + FTaxID + U + U + BOOLCHAR[not RData.Add2PN] + U +
U + 'P' + U + Tmp + U + BOOLCHAR[NewLine] + U + '0';
FData := RData;
if ((Piece(FRec3, U, r3GAF) = '1')) and (MHDLLFound = false) then
begin
FOverrideType := ptGAF;
SetPiece(FRec4, U, 8, ForcedCaption + ':');
end
else
FOverrideType := ptMHTest;
end;
end;
end;
end;
end;
until(idx < 0);
idx := -1;
repeat
idx := TempSL.IndexOfPieces(['4', FID, FTaxID], idx);
if(idx >= 0) then
begin
pt := Code2PromptType(piece(TempSL[idx], U, 4));
if(pt <> ptUnknown) and ((pt <> ptComment) or (not FHasComment)) then
begin
if(not assigned(FPrompts)) then
FPrompts := TList.Create;
RPrompt := TRemPrompt(FPrompts[FPrompts.Add(TRemPrompt.Create)]);
with RPrompt do
begin
FParent := Self;
FRec4 := TempSL[idx];
InitValue;
end;
if(pt = ptComment) then
begin
FHasComment := TRUE;
FCommentPrompt := RPrompt;
end;
if(pt = ptSubComment) then
FHasSubComments := TRUE;
if(pt = ptMST) then
FMSTPrompt := RPrompt;
end;
end;
until(idx < 0);
idx := -1;
repeat
idx := TempSL.IndexOfPieces(['6', FID, FTaxID], idx);
if(idx >= 0) then
begin
PrepText4NextLine(FPNText);
FPNText := FPNText + Trim(Piece(TempSL[idx], U, 4));
end;
until(idx < 0);
ExpandTIUObjects(FPNText);
end;
end;
procedure TRemDlgElement.SetChecked(const Value: boolean);
var
i, j, k: integer;
Kid: TRemDlgElement;
Prompt: TRemPrompt;
RData: TRemData;
procedure UpdateForcedValues(Elem: TRemDlgElement);
var
i: integer;
begin
if(Elem.IsChecked) then
begin
if(assigned(Elem.FPrompts)) then
begin
for i := 0 to Elem.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(Elem.FPrompts[i]);
if Prompt.Forced then
begin
try
Prompt.SetValueFromParent(Prompt.FValue);
except
on E: EForcedPromptConflict do
begin
Elem.FChecked := FALSE;
InfoBox(E.Message, 'Error', MB_OK or MB_ICONERROR);
break;
end
else
raise;
end;
end;
end;
end;
if(Elem.FChecked) and (assigned(Elem.FChildren)) then
for i := 0 to Elem.FChildren.Count-1 do
UpdateForcedValues(TRemDlgElement(Elem.FChildren[i]));
end;
end;
begin
if(FChecked <> Value) then
begin
FChecked := Value;
if(Value) then
begin
GetData;
if(FChecked and assigned(FParent)) then
begin
FParent.Check4ChildrenSharedPrompts;
if(FParent.ChildrenRequired in [crOne, crNoneOrOne]) then
begin
for i := 0 to FParent.FChildren.Count-1 do
begin
Kid := TRemDlgElement(FParent.FChildren[i]);
if(Kid <> Self) and (Kid.FChecked) then
Kid.SetChecked(FALSE);
end;
end;
end;
UpdateForcedValues(Self);
end
else
if(assigned(FPrompts) and assigned(FData)) then
begin
for i := 0 to FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FPrompts[i]);
if Prompt.Forced and (IsSyncPrompt(Prompt.PromptType)) then
begin
for j := 0 to FData.Count-1 do
begin
RData := TRemData(FData[j]);
if(assigned(RData.FPCERoot)) then
RData.FPCERoot.UnSync(Prompt);
if(assigned(RData.FChoices)) then
begin
for k := 0 to RData.FChoices.Count-1 do
begin
if(assigned(RData.FChoices.Objects[k])) then
TRemPCERoot(RData.FChoices.Objects[k]).UnSync(Prompt);
end;
end;
end;
end;
end;
end;
end;
end;
function TRemDlgElement.TrueIndent: integer;
var
Prnt: TRemDlgElement;
Nudge: integer;
begin
Result := Indent;
Nudge := Gap;
Prnt := FParent;
while assigned(Prnt) do
begin
if(Prnt.Box) then
begin
Prnt := nil;
inc(Nudge, Gap);
end
else
begin
Result := Result + Prnt.ChildrenIndent;
Prnt := Prnt.FParent;
end;
end;
Result := (Result * IndentMult) + Nudge;
end;
procedure TRemDlgElement.cbClicked(Sender: TObject);
begin
FReminder.BeginTextChanged;
try
FReminder.BeginNeedRedraw;
try
if(assigned(Sender)) then
begin
SetChecked((Sender as TORCheckBox).Checked);
ElementChecked := Self;
end;
finally
FReminder.EndNeedRedraw(Sender);
end;
finally
FReminder.EndTextChanged(Sender);
end;
RemindersInProcess.Notifier.Notify;
if assigned(TORCheckBox(Sender).Associate) and (not ScreenReaderSystemActive) then
TDlgFieldPanel(TORCheckBox(Sender).Associate).SetFocus;
end;
function TRemDlgElement.EnableChildren: boolean;
var
Chk: boolean;
begin
if(assigned(FParent)) then
Chk := FParent.EnableChildren
else
Chk := TRUE;
if(Chk) then
begin
if(ElemType = etDisplayOnly) then
Result := TRUE
else
Result := FChecked;
end
else
Result := FALSE;
end;
function TRemDlgElement.Enabled: boolean;
begin
if(assigned(FParent)) then
Result := FParent.EnableChildren
else
Result := TRUE;
end;
function TRemDlgElement.ShowChildren: boolean;
begin
if(assigned(FChildren) and (FChildren.Count > 0)) then
begin
if((ElemType = etDisplayOnly) or FChecked) then
Result := TRUE
else
Result := (not HideChildren);
end
else
Result := FALSE;
end;
type
TAccessCheckBox = class(TORCheckBox);
procedure TRemDlgElement.cbEntered(Sender: TObject);
begin
// changing focus because of a mouse click sets ClicksDisabled to false during the
// call to SetFocus - this is how we allow the cbClicked code to execute on a mouse
// click, which will set the focus after the mouse click. All other cases and the
// ClicksDisabled will be FALSE and the focus is reset here. If we don't make this
// check, you can't click on the check box..
if (Last508KeyCode = VK_UP) or (Last508KeyCode = VK_LEFT) then
begin
UnfocusableControlEnter(nil, Sender);
exit;
end;
if not TAccessCheckBox(Sender).ClicksDisabled then
begin
if ScreenReaderSystemActive then
(Sender as TCPRSDialogParentCheckBox).FocusOnBox := true
else
TDlgFieldPanel(TORCheckBox(Sender).Associate).SetFocus;
end;
end;
procedure TRemDlgElement.ParentCBEnter(Sender: TObject);
begin
(Sender as TORCheckBox).FocusOnBox := true;
end;
procedure TRemDlgElement.ParentCBExit(Sender: TObject);
begin
(Sender as TORCheckBox).FocusOnBox := false;
end;
type
TORExposedWinControl = class(TWinControl);
function TRemDlgElement.BuildControls(var Y: integer; ParentWidth: integer;
BaseParent, AOwner: TWinControl): TWinControl;
var
lbl: TLabel;
lblText: string;
sLbl: TCPRSDialogStaticLabel;
lblCtrl: TControl;
pnl: TDlgFieldPanel;
AutoFocusControl: TWinControl;
cb: TCPRSDialogParentCheckBox;
gb: TGroupBox;
ERes, prnt: TWinControl;
PrntWidth: integer;
i, X, Y1: integer;
LastX, MinX, MaxX: integer;
Prompt: TRemPrompt;
Ctrl: TMultiClassObj;
OK, DoLbl, HasVCombo, cbSingleLine: boolean;
ud: TUpDown;
HelpBtn: TButton;
vCombo: TComboBox;
pt: TRemPromptType;
SameLineCtrl: TList;
Kid: TRemDlgElement;
vt: TVitalType;
DefaultDate: TFMDateTime;
Req: boolean;
function GetPanel(const EID, AText: string; const PnlWidth: integer;
OwningCheckBox: TCPRSDialogParentCheckBox): TDlgFieldPanel;
var
idx, p: integer;
Entry: TTemplateDialogEntry;
begin
// This call creates a new TTemplateDialogEntry if necessary and creates the
// necessary template field controls with their default values stored in the
// TTemplateField object.
Entry := GetDialogEntry(BaseParent, EID + IntToStr(Integer(BaseParent)), AText);
Entry.InternalID := EID;
// This call looks for the Entry's values in TRemDlgElement.FFieldValues
idx := FFieldValues.IndexOfPiece(EID);
// If the Entry's values were found in the previous step then they will be
// restored to the TTemplateDialogEntry.FieldValues in the next step.
if(idx >= 0) then
begin
p := pos(U, FFieldValues[idx]); // Can't use Piece because 2nd piece may contain ^ characters
if(p > 0) then
Entry.FieldValues := copy(FFieldValues[idx],p+1,MaxInt);
end;
Entry.AutoDestroyOnPanelFree := TRUE;
// The FieldPanelChange event handler is where the Entry.FieldValues are saved to the
// Element.FFieldValues.
Entry.OnChange := FieldPanelChange;
//AGP BACKED OUT THE CHANGE CAUSE A PROBLEM WITH TEMPLATE WORD PROCESSING FIELDS WHEN RESIZING
//FieldPanelChange(Entry); // to accomodate fields with default values - CQ#15960
//AGP END BACKED OUT
// Calls TTemplateDialogEntry.SetFieldValues which calls
// TTemplateDialogEntry.SetControlText to reset the template field default
// values to the values that were restored to the Entry from the Element if
// they exist, otherwise the default values will remain.
Result := Entry.GetPanel(PnlWidth, BaseParent, OwningCheckBox);
end;
procedure NextLine(var Y: integer);
var
i: integer;
MaxY: integer;
C: TControl;
begin
MaxY := 0;
for i := 0 to SameLineCtrl.Count-1 do
begin
C := TControl(SameLineCtrl[i]);
if(MaxY < C.Height) then
MaxY := C.Height;
end;
for i := 0 to SameLineCtrl.Count-1 do
begin
C := TControl(SameLineCtrl[i]);
if(MaxY > C.Height) then
C.Top := Y + ((MaxY - C.Height) div 2);
end;
inc(Y, MaxY);
if assigned(cb) and assigned(pnl) then
cb.Top := pnl.Top;
SameLineCtrl.Clear;
end;
procedure ProcessLabel(Required, AEnabled: boolean;
AParent: TWinControl; Control: TControl); begin
if(Trim(Prompt.Caption) = '') and (not Required) then
lblCtrl := nil
else
begin
lbl := TLabel.Create(AOwner);
lbl.Parent := AParent;
if ScreenReaderSystemActive then
begin
sLbl := TCPRSDialogStaticLabel.Create(AOwner);
sLbl.Parent := AParent;
sLbl.Height := lbl.Height;
// get groop box hearder, if any
// (sLbl as ICPRSDialogComponent).BeforeText := ScreenReaderSystem_GetPendingText;
lbl.Free;
lblCtrl := sLbl;
end
else
lblCtrl := lbl;
lblText := Prompt.Caption;
if Required then
begin
if assigned(Control) and Supports(Control, ICPRSDialogComponent) then
begin
(Control as ICPRSDialogComponent).RequiredField := TRUE;
if ScreenReaderSystemActive and (AOwner = frmRemDlg) then
frmRemDlg.amgrMain.AccessText[sLbl] := lblText;
end;
lblText := lblText + ' *';
end;
SetStrProp(lblCtrl, CaptionProperty, lblText);
if ScreenReaderSystemActive then
begin
ScreenReaderSystem_CurrentLabel(sLbl);
ScreenReaderSystem_AddText(lblText);
end;
lblCtrl.Enabled := AEnabled;
UpdateColorsFor508Compliance(lblCtrl);
end;
end;
procedure ScreenReaderSupport(Control: TWinControl);
begin
if ScreenReaderSystemActive then
begin
if Supports(Control, ICPRSDialogComponent) then
ScreenReaderSystem_CurrentComponent(Control as ICPRSDialogComponent)
else
ScreenReaderSystem_Stop;
end;
end;
procedure AddPrompts(Shared: boolean; AParent: TWinControl; PWidth: integer; var Y: integer);
var
i, j, k, idx: integer;
DefLoc: TStrings;
LocText: string;
LocFound: boolean;
m, n: integer;
ActDt, InActDt: Double;
EncDt: TFMDateTime;
ActChoicesSL: TORStringList;
Piece12, WHReportStr: String;
WrapLeft, LineWidth: integer;
begin
SameLineCtrl := TList.Create;
try
if(assigned(cb)) then
begin
if(not Shared) then
begin
SameLineCtrl.Add(cb);
SameLineCtrl.Add(pnl);
end;
if(cbSingleLine and (not Shared)) then
LastX := cb.Left + pnl.Width + PromptGap + IndentGap
else
LastX := PWidth;
end
else
begin
if(not Shared) then SameLineCtrl.Add(pnl);
LastX := PWidth;
end;
for i := 0 to FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FPrompts[i]);
OK := ((Prompt.FIsShared = Shared) and Prompt.PromptOK and (not Prompt.Forced));
if(OK and Shared) then
begin
OK := FALSE;
for j := 0 to Prompt.FSharedChildren.Count-1 do
begin
Kid := TRemDlgElement(Prompt.FSharedChildren[j]);
// if(Kid.ElemType <> etDisplayOnly) and (Kid.FChecked) then
if(Kid.FChecked) then
begin
OK := TRUE;
break;
end;
end;
end;
Ctrl.Ctrl := nil;
ud := nil;
HelpBtn := nil;
vCombo := nil;
HasVCombo := FALSE;
if(OK) then
begin
pt := Prompt.PromptType;
MinX := 0;
MaxX := 0;
lbl := nil;
sLbl := nil;
lblCtrl := nil;
DoLbl := Prompt.Required;
case pt of
ptComment, ptQuantity:
begin
Ctrl.edt := TCPRSDialogFieldEdit.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.edt.Text := Prompt.Value;
if(pt = ptComment) then
begin
Ctrl.edt.MaxLength := 245;
MinX := TextWidthByFont(Ctrl.edt.Font.Handle, 'AbCdEfGhIjKlMnOpQrStUvWxYz 1234');
MaxX := PWidth;
end
else
begin
ud := TUpDown.Create(AOwner);
ud.Parent := AParent;
ud.Associate := Ctrl.edt;
if(pt = ptQuantity) then
begin
ud.Min := 1;
ud.Max := 100;
end
else
begin
ud.Min := 0;
ud.Max := 40;
end;
MinX := TextWidthByFont(Ctrl.edt.Font.Handle, IntToStr(ud.Max)) + 24;
ud.Position := StrToIntDef(Prompt.Value, ud.Min);
UpdateColorsFor508Compliance(ud);
end;
Ctrl.edt.OnKeyPress := Prompt.EditKeyPress;
Ctrl.edt.OnChange := Prompt.PromptChange;
UpdateColorsFor508Compliance(Ctrl.edt);
DoLbl := TRUE;
end;
ptVisitLocation, ptLevelUnderstanding,
ptSeries, ptReaction, ptExamResults,
ptLevelSeverity, ptSkinResults, ptSkinReading:
begin
Ctrl.cbo := TCPRSDialogComboBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.cbo.OnKeyDown := Prompt.ComboBoxKeyDown;
Ctrl.cbo.Style := orcsDropDown;
Ctrl.cbo.Pieces := '2';
if pt = ptSkinReading then
begin
Ctrl.cbo.Pieces := '1';
Ctrl.cbo.Items.Add('');
for j := 0 to 50 do Ctrl.cbo.Items.Add(inttostr(j));
GetComboBoxMinMax(Ctrl.cbo,MinX, MaxX);
end;
if pt <> ptSkinReading then
begin
Ctrl.cbo.Tag := ComboPromptTags[pt];
PCELoadORCombo(Ctrl.cbo, MinX, MaxX);
end;
if pt = ptVisitLocation then
begin
DefLoc := GetDefLocations;
if DefLoc.Count > 0 then
begin
idx := 1;
for j := 0 to DefLoc.Count-1 do
begin
LocText := piece(DefLoc[j],U,2);
if LocText <> '' then
begin
if (LocText <> '0') and (IntToStr(StrToIntDef(LocText,0)) = LocText) then
begin
LocFound := FALSE;
for k := 0 to Ctrl.cbo.Items.Count-1 do
begin
if(piece(Ctrl.cbo.Items[k],U,1) = LocText) then
begin
LocText := Ctrl.cbo.Items[k];
LocFound := TRUE;
break;
end;
end;
if not LocFound then
LocText := '';
end
else
LocText := '0^'+LocText;
if LocText <> '' then
begin
Ctrl.cbo.Items.Insert(idx, LocText);
inc(idx);
end;
end;
end;
if idx > 1 then
begin
Ctrl.cbo.Items.Insert(idx, '-1' + LLS_LINE);
Ctrl.cbo.Items.Insert(idx+1, '-1' + LLS_SPACE);
end;
end;
end;
MinX := MaxX;
Ctrl.cbo.SelectByID(Prompt.Value);
if(Ctrl.cbo.ItemIndex < 0) then
begin
Ctrl.cbo.Text := Prompt.Value;
if(pt = ptVisitLocation) then
Ctrl.cbo.Items[0] := '0' + U + Prompt.Value;
end;
if(Ctrl.cbo.ItemIndex < 0) then
Ctrl.cbo.ItemIndex := 0;
Ctrl.cbo.OnChange := Prompt.PromptChange;
DoLbl := TRUE;
Ctrl.cbo.ListItemsOnly := (pt <> ptVisitLocation);
UpdateColorsFor508Compliance(Ctrl.cbo);
end;
ptWHPapResult:
begin
if FData<>nil then
begin
if (TRemData(FData[i]).DisplayWHResults)=true then
begin
NextLine(Y);
Ctrl.btn := TCPRSDialogButton.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.btn.Left := NewLInePromptGap+15;
Ctrl.btn.Top := Y+7;
Ctrl.btn.OnClick := Prompt.DoWHReport;
Ctrl.btn.Caption := 'Review complete report';
Ctrl.btn.Width := TextWidthByFont(Ctrl.btn.Font.Handle, Ctrl.btn.Caption) + 13;
Ctrl.btn.Height := TextHeightByFont(Ctrl.btn.Font.Handle, Ctrl.btn.Caption) + 13;
Ctrl.btn.Height := TextHeightByFont(Ctrl.btn.Handle, Ctrl.btn.Caption) + 8;
ScreenReaderSupport(Ctrl.btn);
UpdateColorsFor508Compliance(Ctrl.btn);
Y := ctrl.btn.Top + Ctrl.btn.Height;
NextLine(Y);
Ctrl.WHChk := TWHCheckBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
ProcessLabel(Prompt.Required, TRUE, Ctrl.WHChk.Parent, Ctrl.WHChk);
if lblCtrl is TWinControl then
TWinControl(lblCtrl).TabOrder := Ctrl.WHChk.TabOrder;
Ctrl.WHChk.Flbl := lblCtrl;
Ctrl.WHChk.Flbl.Top := Y + 5;
Ctrl.WHChk.Flbl.Left := NewLinePromptGap+15;
WrapLeft := Ctrl.WHChk.Flbl.Left;
// Ctrl.WHChk.Flbl.Width := TextWidthByFont(
// TExposedComponent(Ctrl.WHChk.Flbl).Font.Handle,
// TExposedComponent(Ctrl.WHChk.Flbl).Caption)+25;
// Ctrl.WHChk.Flbl.Height := TextHeightByFont(
// TExposedComponent(Ctrl.WHChk.Flbl).Font.Handle,
// TExposedComponent(Ctrl.WHChk.Flbl).Caption);
//LineWidth := WrapLeft + Ctrl.WHChk.Flbl.Width+10;
Y := Ctrl.WHChk.Flbl.Top + Ctrl.WHChk.Flbl.Height;
NextLine(Y);
Ctrl.WHChk.RadioStyle:=true;
Ctrl.WHChk.GroupIndex:=1;
Ctrl.WHChk.Check2 := TWHCheckBox.Create(AOwner);
Ctrl.WHChk.Check2.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.Check2.RadioStyle:=true;
Ctrl.WHChk.Check2.GroupIndex:=1;
Ctrl.WHChk.Check3 := TWHCheckBox.Create(AOwner);
Ctrl.WHChk.Check3.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.Check3.RadioStyle:=true;
Ctrl.WHChk.Check3.GroupIndex:=1;
Ctrl.WHChk.Caption := 'NEM (No Evidence of Malignancy)';
Ctrl.WHChk.ShowHint := true;
Ctrl.WHChk.Hint := 'No Evidence of Malignancy';
Ctrl.WHChk.Width := TextWidthByFont(Ctrl.WHChk.Font.Handle, Ctrl.WHChk.Caption)+20;
Ctrl.WHChk.Height := TextHeightByFont(Ctrl.WHChk.Font.Handle, Ctrl.WHChk.Caption)+4;
Ctrl.WHChk.Top := Y + 5;
Ctrl.WHChk.Left := WrapLeft;
Ctrl.WHChk.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Checked := (WHResultChk = 'N');
LineWidth := WrapLeft + Ctrl.WHChk.Width+5;
Ctrl.WHChk.Check2.Caption := 'Abnormal';
Ctrl.WHChk.Check2.Width := TextWidthByFont(Ctrl.WHChk.Check2.Font.Handle, Ctrl.WHChk.Check2.Caption) + 20;
Ctrl.WHChk.Check2.Height := TextHeightByFont(Ctrl.WHChk.check2.Font.Handle, Ctrl.WHChk.check2.Caption)+4;
if (LineWidth + Ctrl.WHChk.Check2.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.Top + Ctrl.WHChk.Height;
Nextline(Y);
end;
Ctrl.WHChk.Check2.Top := Y + 5;
Ctrl.WHChk.Check2.Left := LineWidth;
Ctrl.WHChk.Check2.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Check2.Checked := (WHResultChk = 'A');
LineWidth := LineWidth + Ctrl.WHChk.Check2.Width+5;
Ctrl.WHChk.Check3.Caption := 'Unsatisfactory for Diagnosis';
Ctrl.WHChk.Check3.Width := TextWidthByFont(Ctrl.WHChk.Check3.Font.Handle, Ctrl.WHChk.Check3.Caption)+20;
Ctrl.WHChk.Check3.Height := TextHeightByFont(Ctrl.WHChk.check3.Font.Handle, Ctrl.WHChk.check3.Caption)+4;
if (LineWidth + Ctrl.WHChk.Check3.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.Check2.Top + Ctrl.WHChk.Check2.Height;
Nextline(Y);
end;
Ctrl.WHChk.Check3.Top := Y + 5;
Ctrl.WHChk.Check3.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Check3.Checked := (WHResultChk = 'U');
Ctrl.WHChk.Check3.Left := LineWidth;
UpdateColorsFor508Compliance(Ctrl.WHChk);
UpdateColorsFor508Compliance(Ctrl.WHChk.Flbl);
UpdateColorsFor508Compliance(Ctrl.WHChk.Check2);
UpdateColorsFor508Compliance(Ctrl.WHChk.Check3);
ScreenReaderSupport(Ctrl.WHChk);
ScreenReaderSupport(Ctrl.WHChk.Check2);
ScreenReaderSupport(Ctrl.WHChk.Check3);
Y := Ctrl.WHChk.Check3.Top + Ctrl.WHChk.Check3.Height;
Nextline(Y);
end
else
DoLbl := FALSE;
end
else
DoLbl :=FALSE;
end;
ptWHNotPurp:
begin
NextLine(Y);
Ctrl.WHChk := TWHCheckBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
ProcessLabel(Prompt.Required, TRUE, Ctrl.WHChk.Parent, Ctrl.WHChk);
Ctrl.WHChk.Flbl := lblCtrl;
if lblCtrl is TWinControl then
TWinControl(lblCtrl).TabOrder := Ctrl.WHChk.TabOrder;
Ctrl.WHChk.Flbl.Top := Y + 7;
Ctrl.WHChk.Flbl.Left := NewLInePromptGap+30;
WrapLeft := Ctrl.WHChk.Flbl.Left;
// Ctrl.WHChk.Flbl.Width := TextWidthByFont(
// TExposedComponent(Ctrl.WHChk.Flbl).Font.Handle,
// TExposedComponent(Ctrl.WHChk.Flbl).Caption)+25;
// Ctrl.WHChk.Flbl.Height := TextHeightByFont(
// TExposedComponent(Ctrl.WHChk.Flbl).Font.Handle,
// TExposedComponent(Ctrl.WHChk.Flbl).Caption)+4;
LineWidth := WrapLeft + Ctrl.WHChk.Flbl.Width+10;
Ctrl.WHChk.Check2 := TWHCheckBox.Create(AOwner);
Ctrl.WHChk.Check2.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.Check3 := TWHCheckBox.Create(AOwner);
Ctrl.WHChk.Check3.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.ShowHint := true;
Ctrl.WHChk.Hint := 'Letter will print with next WH batch run';
Ctrl.WHChk.Caption := 'Letter';
Ctrl.WHChk.Width := TextWidthByFont(Ctrl.WHChk.Font.Handle, Ctrl.WHChk.Caption)+25;
Ctrl.WHChk.Height := TextHeightByFont(Ctrl.WHChk.Font.Handle, Ctrl.WHChk.Caption)+4;
if (LineWidth + Ctrl.WHChk.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.Flbl.Top + Ctrl.WHChk.Flbl.Height;
Nextline(Y);
end;
Ctrl.WHChk.Top := Y + 7;
Ctrl.WHChk.Left := LineWidth;
Ctrl.WHChk.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Checked := (Pos('L',WHResultNot)>0);
LineWidth := LineWidth + Ctrl.WHChk.Width+10;
Ctrl.WHChk.Check2.Caption := 'In-Person';
Ctrl.WHChk.Check2.Width := TextWidthByFont(Ctrl.WHChk.Check2.Font.Handle, Ctrl.WHChk.Check2.Caption) + 25;
Ctrl.WHChk.Check2.Height := TextHeightByFont(Ctrl.WHChk.check2.Font.Handle, Ctrl.WHChk.check2.Caption)+4;
if (LineWidth + Ctrl.WHChk.Check2.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.Top + Ctrl.WHChk.Height;
Nextline(Y);
end;
Ctrl.WHChk.Check2.Top := Y + 7;
Ctrl.WHChk.Check2.Left := LineWidth;
Ctrl.WHChk.Check2.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Check2.Checked := (Pos('I',WHResultNot)>0);
LineWidth := LineWidth + Ctrl.WHChk.Check2.Width+10;
Ctrl.WHChk.Check3.Caption := 'Phone Call';
Ctrl.WHChk.Check3.Width := TextWidthByFont(Ctrl.WHChk.Check3.Font.Handle, Ctrl.WHChk.Check3.Caption)+20;
Ctrl.WHChk.Check3.Height := TextHeightByFont(Ctrl.WHChk.check3.Font.Handle, Ctrl.WHChk.check3.Caption)+4;
if (LineWidth + Ctrl.WHChk.Check3.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.Check2.Top + Ctrl.WHChk.Check2.Height;
Nextline(Y);
end;
Ctrl.WHChk.Check3.Top := Y + 7;
Ctrl.WHChk.Check3.OnClick := Prompt.PromptChange;
Ctrl.WHChk.Check3.Checked := (Pos('P',WHResultNot)>0);
Ctrl.WHChk.Check3.Left := LineWidth;
Y := Ctrl.WHChk.Check3.Top + Ctrl.WHChk.Check3.Height;
Nextline(Y);
Ctrl.WHChk.Fbutton := TCPRSDialogButton.Create(AOwner);
Ctrl.WHChk.FButton.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.FButton.Enabled:=(Pos('L',WHResultNot)>0);
Ctrl.WHChk.FButton.Left := Ctrl.WHChk.Flbl.Left;
Ctrl.WHChk.FButton.Top := Y+7;
Ctrl.WHChk.FButton.OnClick := Prompt.ViewWHText;
Ctrl.WHChk.FButton.Caption := 'View WH Notification Letter';
Ctrl.WHChk.FButton.Width := TextWidthByFont(Ctrl.WHChk.FButton.Font.Handle, Ctrl.WHChk.FButton.Caption) + 13;
Ctrl.WHChk.FButton.Height := TextHeightByFont(Ctrl.WHChk.FButton.Font.Handle, Ctrl.WHChk.FButton.Caption) + 13;
UpdateColorsFor508Compliance(Ctrl.WHChk);
UpdateColorsFor508Compliance(Ctrl.WHChk.Flbl);
UpdateColorsFor508Compliance(Ctrl.WHChk.Check2);
UpdateColorsFor508Compliance(Ctrl.WHChk.Check3);
UpdateColorsFor508Compliance(Ctrl.WHChk.FButton);
ScreenReaderSupport(Ctrl.WHChk);
ScreenReaderSupport(Ctrl.WHChk.Check2);
ScreenReaderSupport(Ctrl.WHChk.Check3);
ScreenReaderSupport(Ctrl.WHChk.FButton);
LineWidth := Ctrl.WHChk.FButton.Left + Ctrl.WHChk.FButton.Width;
if piece(Prompt.FRec4,u,12)='1' then
begin
Ctrl.WHChk.FPrintNow :=TCPRSDialogCheckBox.Create(AOwner);
Ctrl.WHChk.FPrintNow.Parent := Ctrl.WHChk.Parent;
Ctrl.WHChk.FPrintNow.ShowHint := true;
Ctrl.WHChk.FPrintNow.Hint := 'Letter will print after "Finish" button is clicked';
Ctrl.WHChk.FPrintNow.Caption:='Print Now';
Ctrl.WHChk.FPrintNow.Width := TextWidthByFont(Ctrl.WHChk.FPrintNow.Font.Handle, Ctrl.WHChk.FPrintNow.Caption)+20;
Ctrl.WHChk.FPrintNow.Height := TextHeightByFont(Ctrl.WHChk.FPrintNow.Font.Handle, Ctrl.WHChk.FPrintNow.Caption)+4;
if (LineWidth + Ctrl.WHChk.FPrintNow.Width) > PWidth - 10 then
begin
LineWidth := WrapLeft;
Y := Ctrl.WHChk.FButton.Top + Ctrl.WHChk.FButton.Height;
Nextline(Y);
end;
Ctrl.WHChk.FPrintNow.Left := LineWidth + 15;
Ctrl.WHChk.FPrintNow.Top := Y + 7;
Ctrl.WHChk.FPrintNow.Enabled := (Pos('L',WHResultNot)>0);
Ctrl.WHChk.FPrintNow.Checked :=(WHPrintDevice<>'');
Ctrl.WHChk.FPrintNow.OnClick := Prompt.PromptChange;
UpdateColorsFor508Compliance(Ctrl.WHChk.FPrintNow);
MinX :=PWidth;
if (Ctrl.WHChk.FButton.Top + Ctrl.WHChk.FButton.Height) > (Ctrl.WHChk.FPrintNow.Top + Ctrl.WHChk.FPrintNow.Height) then
Y := Ctrl.WHChk.FButton.Top + Ctrl.WHChk.FButton.Height + 7
else
Y := Ctrl.WHChk.FPrintNow.Top + Ctrl.WHChk.FPrintNow.Height + 7;
ScreenReaderSupport(Ctrl.WHChk.FPrintNow);
end
else
Y := Ctrl.WHChk.FButton.Top + Ctrl.WHChk.FButton.Height + 7;
NextLine(Y);
end;
ptVisitDate:
begin
Ctrl.dt := TCPRSDialogDateCombo.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.dt.LongMonths := TRUE;
try
DefaultDate := Ctrl.dt.FMDate;
Ctrl.dt.FMDate := StrToFloat(Prompt.Value);
except
on EConvertError do
Ctrl.dt.FMDate := DefaultDate;
else
raise;
end;
Ctrl.dt.OnChange := Prompt.PromptChange;
UpdateColorsFor508Compliance(Ctrl.dt);
DoLbl := TRUE;
MinX := Ctrl.dt.Width;
//TextWidthByFont(Ctrl.dt.Font.Handle, 'May 22, 2000') + 26;
end;
ptPrimaryDiag, ptAdd2PL, ptContraindicated:
begin
Ctrl.cb := TCPRSDialogCheckBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.cb.Checked := (Prompt.Value = '1');
Ctrl.cb.Caption := Prompt.Caption;
if prompt.Required=false then DoLbl := true;
Ctrl.cb.AutoSize := False;
Ctrl.cb.OnEnter := ParentCBEnter;
Ctrl.cb.OnExit := ParentCBExit;
Ctrl.cb.Height := TORCheckBox(Ctrl.cb).Height + 5;
Ctrl.cb.Width := 17;
Ctrl.cb.OnClick := Prompt.PromptChange;
UpdateColorsFor508Compliance(Ctrl.cb);
MinX := Ctrl.cb.Width;
end;
else
begin
if(pt = ptSubComment) then
begin
Ctrl.cb := TCPRSDialogCheckBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.cb.Checked := (Prompt.Value = '1');
Ctrl.cb.Caption := Prompt.Caption;
Ctrl.cb.AutoSize := TRUE;
Ctrl.cb.OnClick := SubCommentChange;
Ctrl.cb.Tag := Integer(Prompt);
UpdateColorsFor508Compliance(Ctrl.cb);
MinX := Ctrl.cb.Width;
end
else
if pt = ptVitalEntry then
begin
vt := Prompt.VitalType;
if(vt = vtPain) then
begin
Ctrl.cbo := TCPRSDialogComboBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.cbo.Style := orcsDropDown;
Ctrl.cbo.Pieces := '1,2';
Ctrl.cbo.OnKeyDown := Prompt.ComboBoxKeyDown;
InitPainCombo(Ctrl.cbo);
Ctrl.cbo.ListItemsOnly := TRUE;
Ctrl.cbo.SelectByID(Prompt.VitalValue);
Ctrl.cbo.OnChange := Prompt.PromptChange;
Ctrl.cbo.SelLength := 0;
MinX := TextWidthByFont(Ctrl.cbo.Font.Handle, Ctrl.cbo.DisplayText[0]) + 24;
MaxX := TextWidthByFont(Ctrl.cbo.Font.Handle, Ctrl.cbo.DisplayText[1]) + 24;
if(ElementChecked = Self) then
begin
AutoFocusControl := Ctrl.cbo;
ElementChecked := nil;
end;
UpdateColorsFor508Compliance(Ctrl.cbo);
end
else
begin
Ctrl.vedt := TVitalEdit.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
MinX := TextWidthByFont(Ctrl.vedt.Font.Handle, '12345.67');
Ctrl.vedt.OnKeyPress := Prompt.EditKeyPress;
Ctrl.vedt.OnChange := Prompt.PromptChange;
Ctrl.vedt.OnExit := Prompt.VitalVerify;
UpdateColorsFor508Compliance(Ctrl.vedt);
if(vt in [vtTemp, vtHeight, vtWeight]) then
begin
HasVCombo := TRUE;
Ctrl.vedt.LinkedCombo := TVitalComboBox.Create(AOwner);
Ctrl.vedt.LinkedCombo.Parent := AParent;
Ctrl.vedt.LinkedCombo.OnChange := Prompt.PromptChange;
Ctrl.vedt.LinkedCombo.Tag := VitalControlTag(vt, TRUE);
Ctrl.vedt.LinkedCombo.OnExit := Prompt.VitalVerify;
Ctrl.vedt.LinkedCombo.LinkedEdit := Ctrl.vedt;
case vt of
vtTemp:
begin
Ctrl.vedt.LinkedCombo.Items.Add('F');
Ctrl.vedt.LinkedCombo.Items.Add('C');
end;
vtHeight:
begin
Ctrl.vedt.LinkedCombo.Items.Add('IN');
Ctrl.vedt.LinkedCombo.Items.Add('CM');
end;
vtWeight:
begin
Ctrl.vedt.LinkedCombo.Items.Add('LB');
Ctrl.vedt.LinkedCombo.Items.Add('KG');
end;
end;
Ctrl.vedt.LinkedCombo.SelectByID(Prompt.VitalUnitValue);
if(Ctrl.vedt.LinkedCombo.ItemIndex < 0) then
Ctrl.vedt.LinkedCombo.ItemIndex := 0;
Ctrl.vedt.LinkedCombo.Width := TextWidthByFont(Ctrl.vedt.Font.Handle,
Ctrl.vedt.LinkedCombo.Items[1]) + 30;
Ctrl.vedt.LinkedCombo.SelLength := 0;
UpdateColorsFor508Compliance(Ctrl.vedt.LinkedCombo);
inc(MinX, Ctrl.vedt.LinkedCombo.Width);
end;
if(ElementChecked = Self) then
begin
AutoFocusControl := Ctrl.vedt;
ElementChecked := nil;
end;
end;
Ctrl.ctrl.Text := Prompt.VitalValue;
Ctrl.ctrl.Tag := VitalControlTag(vt);
DoLbl := TRUE;
end
else
if pt = ptDataList then
begin
Ctrl.cbo := TCPRSDialogComboBox.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.cbo.Style := orcsDropDown;
Ctrl.cbo.Pieces := '12';
if ActChoicesSL = nil then
ActChoicesSL := TORStringList.Create;
if Self.Historical then
EncDt := DateTimeToFMDateTime(Date)
else
EncDt := RemForm.PCEObj.VisitDateTime;
if assigned(Prompt.FData.FChoicesActiveDates) then {csv active/inactive dates}
for m := 0 to (Prompt.FData.FChoices.Count - 1) do
begin
for n := 0 to (TStringList(Prompt.FData.FChoicesActiveDates[m]).Count - 1) do
begin
ActDt := StrToIntDef((Piece(TStringList(Prompt.FData.FChoicesActiveDates[m]).Strings[n], ':', 1)),0);
InActDt := StrToIntDef((Piece(TStringList(Prompt.FData.FChoicesActiveDates[m]).Strings[n], ':', 2)),9999999);
Piece12 := Piece(Piece(Prompt.FData.FChoices.Strings[m],U,12),':',1);
Prompt.FData.FChoices.SetStrPiece(m,12,Piece12);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
ActChoicesSL.AddObject(Prompt.FData.FChoices[m], Prompt.FData.FChoices.Objects[m]);
end; {loop through the TStringList object in FChoicesActiveDates[m] object property}
end {loop through FChoices/FChoicesActiveDates}
else
FastAssign(Prompt.FData.FChoices, ActChoicesSL);
FastAssign(ActChoicesSL, Ctrl.cbo.Items);
Ctrl.cbo.CheckBoxes := TRUE;
Ctrl.cbo.SelectByID(Prompt.Value);
Ctrl.cbo.OnCheckedText := FReminder.ComboBoxCheckedText;
Ctrl.cbo.OnResize := FReminder.ComboBoxResized;
Ctrl.cbo.CheckedString := Prompt.Value;
Ctrl.cbo.OnChange := Prompt.PromptChange;
Ctrl.cbo.ListItemsOnly := TRUE;
UpdateColorsFor508Compliance(Ctrl.cbo);
if(ElementChecked = Self) then
begin
AutoFocusControl := Ctrl.cbo;
ElementChecked := nil;
end;
DoLbl := TRUE;
if(Prompt.FData.FChoicesFont = Ctrl.cbo.Font.Handle) then
begin
MinX := Prompt.FData.FChoicesMin;
MaxX := Prompt.FData.FChoicesMax;
end
else
begin
GetComboBoxMinMax(Ctrl.cbo, MinX, MaxX);
inc(MaxX,18); // Adjust for checkboxes
MinX := MaxX;
Prompt.FData.FChoicesFont := Ctrl.cbo.Font.Handle;
Prompt.FData.FChoicesMin := MinX;
Prompt.FData.FChoicesMax := MaxX;
end;
end
else
if(pt = ptMHTest) or ((pt = ptGaf) and (MHDLLFound = true)) then
begin
Ctrl.btn := TCPRSDialogButton.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.btn.OnClick := Prompt.DoMHTest;
Ctrl.btn.Caption := Prompt.ForcedCaption;
if Piece(Prompt.FData.FRec3,U,13)='1' then
begin
Ctrl.btn.Caption := Ctrl.btn.Caption + ' *';
(Ctrl.btn as ICPRSDialogComponent).RequiredField := TRUE;
end;
MinX := TextWidthByFont(Ctrl.btn.Font.Handle, Ctrl.btn.Caption) + 13;
Ctrl.btn.Height := TextHeightByFont(Ctrl.btn.Font.Handle, Ctrl.btn.Caption) + 8;
DoLbl := TRUE;
end
else
if ((pt = ptGAF)) and (MHDLLFound = false) then
begin
Ctrl.edt := TCPRSDialogFieldEdit.Create(AOwner);
Ctrl.ctrl.Parent := AParent;
Ctrl.edt.Text := Prompt.Value;
ud := TUpDown.Create(AOwner);
ud.Parent := AParent;
ud.Associate := Ctrl.edt;
ud.Min := 0;
ud.Max := 100;
MinX := TextWidthByFont(Ctrl.edt.Font.Handle, IntToStr(ud.Max)) + 24 + Gap;
ud.Position := StrToIntDef(Prompt.Value, ud.Min);
Ctrl.edt.OnKeyPress := Prompt.EditKeyPress;
Ctrl.edt.OnChange := Prompt.PromptChange;
if(User.WebAccess and (GAFURL <> '')) then
begin
HelpBtn := TCPRSDialogButton.Create(AOwner);
HelpBtn.Parent := AParent;
HelpBtn.Caption := 'Reference Info';
HelpBtn.OnClick := Prompt.GAFHelp;
HelpBtn.Width := TextWidthByFont(HelpBtn.Font.Handle, HelpBtn.Caption) + 13;
HelpBtn.Height := Ctrl.edt.Height;
inc(MinX, HelpBtn.Width);
end;
DoLbl := TRUE;
end
else
Ctrl.ctrl := nil;
end;
end;
if(DoLbl) and ((pt <> ptWHNotPurp) and (pt <> ptWHPapResult)) then
//if(DoLbl) then
begin
Req := Prompt.Required;
if (not Req) and (pt = ptGaf) and (MHDLLFound = false) then
Req := (Piece(Prompt.FData.FRec3,U,13) = '1');
ProcessLabel(Req, Prompt.FParent.Enabled, AParent, Ctrl.Ctrl);
if assigned(lblCtrl) then
begin
inc(MinX, lblCtrl.Width + LblGap);
inc(MaxX, lblCtrl.Width + LblGap);
end
else
DoLbl := FALSE;
end;
if(MaxX < MinX) then
MaxX := MinX;
if((Prompt.SameLine) and ((LastX + MinX + Gap) < PWidth)) and
((pt <> ptWHNotPurp) and (pt <> ptWHPapResult)) then
//if((Prompt.SameLine) and ((LastX + MinX + Gap) < PWidth)) then
begin
X := LastX;
end
else
begin
if(Shared) and (assigned(FChildren)) and (FChildren.Count > 0) then
X := TRemDlgElement(FChildren[0]).TrueIndent
else
begin
if(assigned(cb)) then
X := cb.Left + NewLinePromptGap
else
X := pnl.Left + NewLinePromptGap;
end;
NextLine(Y);
end;
if(MaxX > (PWidth - X - Gap)) then
MaxX := PWidth - X - Gap;
if((DoLbl) or (assigned(Ctrl.Ctrl))) and
((pt <> ptWHNotPurp) and (pt <> ptWHPapResult)) then
//if((DoLbl) or (assigned(Ctrl.Ctrl))) then
begin
if DoLbl then
begin
lblCtrl.Left := X;
lblCtrl.Top := Y;
inc(X, lblCtrl.Width + LblGap);
dec(MinX, lblCtrl.Width + LblGap);
dec(MaxX, lblCtrl.Width + LblGap);
SameLineCtrl.Add(lblCtrl);
end;
if(assigned(Ctrl.Ctrl)) then
begin
if ScreenReaderSystemActive then
begin
if Supports(Ctrl.Ctrl, ICPRSDialogComponent) then
ScreenReaderSystem_CurrentComponent(Ctrl.Ctrl as ICPRSDialogComponent)
else
ScreenReaderSystem_Stop;
end;
Ctrl.Ctrl.Enabled := Prompt.FParent.Enabled;
if not Ctrl.Ctrl.Enabled then
Ctrl.Ctrl.Font.Color := DisabledFontColor;
Ctrl.Ctrl.Left := X;
Ctrl.Ctrl.Top := Y;
SameLineCtrl.Add(Ctrl.Ctrl);
if(assigned(ud)) then
begin
SameLineCtrl.Add(ud);
if(assigned(HelpBtn)) then
begin
SameLineCtrl.Add(HelpBtn);
Ctrl.Ctrl.Width := MinX - HelpBtn.Width - ud.Width;
HelpBtn.Left := X + Ctrl.Ctrl.Width + ud.Width + Gap;
HelpBtn.Top := Y;
HelpBtn.Enabled := Prompt.FParent.Enabled;
end
else
Ctrl.Ctrl.Width := MinX - ud.Width;
ud.Left := X + Ctrl.Ctrl.Width;
ud.Top := Y;
LastX := X + MinX + PromptGap;
ud.Enabled := Prompt.FParent.Enabled;
end
else
if(HasVCombo) then
begin
SameLineCtrl.Add(Ctrl.vedt.LinkedCombo);
Ctrl.Ctrl.Width := MinX - Ctrl.vedt.LinkedCombo.Width;
Ctrl.vedt.LinkedCombo.Left := X + Ctrl.Ctrl.Width;
Ctrl.vedt.LinkedCombo.Top := Y;
LastX := X + MinX + PromptGap;
Ctrl.vedt.LinkedCombo.Enabled := Prompt.FParent.Enabled;
end
else
begin
Ctrl.Ctrl.Width := MaxX;
LastX := X + MaxX + PromptGap;
end;
end;
end;
end;
if(assigned(ud)) then
Prompt.FCurrentControl := ud
else
Prompt.FCurrentControl := Ctrl.Ctrl;
end;
NextLine(Y);
finally
SameLineCtrl.Free;
end;
end;
procedure UpdatePrompts(EnablePanel: boolean; ClearCB: boolean);
begin
if EnablePanel then
begin
if not ScreenReaderSystemActive then
begin
pnl.TabStop := TRUE; {tab through the panels instead of the checkboxes}
pnl.OnEnter := FieldPanelEntered;
pnl.OnExit := FieldPanelExited;
end;
if ClearCB then
cb := nil;
end;
if (FChecked and assigned(FPrompts) and (FPrompts.Count > 0)) then
begin
AddPrompts(FALSE, BaseParent, ParentWidth, Y);
end
else
inc(Y, pnl.Height);
end;
begin
Result := nil;
cb := nil;
pnl := nil;
AutoFocusControl := nil;
X := TrueIndent;
if(assigned(FPrompts)) then
begin
for i := 0 to FPrompts.Count-1 do
TRemPrompt(FPrompts[i]).FCurrentControl := nil;
end;
if(ElemType = etDisplayOnly) then
begin
if(FText <> '') then
begin
inc(Y,Gap);
pnl := GetPanel(EntryID, CRLFText(FText), ParentWidth - X - (Gap * 2), nil);
pnl.Left := X;
pnl.Top := Y;
UpdatePrompts(ScreenReaderSystemActive, TRUE);
end;
end
else
begin
inc(Y,Gap);
cb := TCPRSDialogParentCheckBox.Create(AOwner);
cb.Parent := BaseParent;
cb.Left := X;
cb.Top := Y;
cb.Tag := Integer(Self);
cb.WordWrap := TRUE;
cb.AutoSize := TRUE;
cb.Checked := FChecked;
cb.Width := ParentWidth - X - Gap;
if not ScreenReaderSystemActive then
cb.Caption := CRLFText(FText);
cb.AutoAdjustSize;
cbSingleLine := cb.SingleLine;
// cb.AutoSize := FALSE;
cb.WordWrap := FALSE;
cb.Caption := ' ';
// cb.Width := 13;
// cb.Height := 17;
if not ScreenReaderSystemActive then
cb.TabStop := False; {take checkboxes out of the tab order}
pnl := GetPanel(EntryID, CRLFText(FText), ParentWidth - X - (Gap * 2) - IndentGap, cb);
pnl.Left := X + IndentGap;
pnl.Top := Y;
cb.Associate := pnl;
pnl.Tag := Integer(cb); {So the panel can check the checkbox}
cb.OnClick := cbClicked;
cb.OnEnter := cbEntered;
if ScreenReaderSystemActive then
cb.OnExit := ParentCBExit;
UpdateColorsFor508Compliance(cb);
pnl.OnKeyPress := FieldPanelKeyPress;
pnl.OnClick := FieldPanelOnClick;
for i := 0 to pnl.ControlCount - 1 do
if ((pnl.Controls[i] is TLabel) or (pnl.Controls[i] is TVA508StaticText)) and
not (fsUnderline in TLabel(pnl.Controls[i]).Font.Style) then //If this isn't a hyperlink change then event handler
TLabel(pnl.Controls[i]).OnClick := FieldPanelLabelOnClick;
//cb.Enabled := Enabled;
if(assigned(FParent) and (FParent.ChildrenRequired in [crOne, crNoneOrOne])) then
cb.RadioStyle := TRUE;
UpdatePrompts(TRUE, FALSE);
end;
if(ShowChildren) then
begin
gb := nil;
if(Box) then
begin
gb := TGroupBox.Create(AOwner);
gb.Parent := BaseParent;
gb.Left := TrueIndent + (ChildrenIndent * IndentMult);
gb.Top := Y;
gb.Width := ParentWidth - gb.Left - Gap;
PrntWidth := gb.Width - (Gap * 2);
gb.Caption := BoxCaption;
// if ScreenReaderSystemActive then
// begin
// ScreenReaderSystem_AddText(gb.Caption + ',');
// end;
gb.Enabled := EnableChildren;
if(not EnableChildren) then
gb.Font.Color := DisabledFontColor;
UpdateColorsFor508Compliance(gb);
prnt := gb;
if(gb.Caption = '') then
Y1 := gbTopIndent
else
Y1 := gbTopIndent2;
end
else
begin
prnt := BaseParent;
Y1 := Y;
PrntWidth := ParentWidth;
end;
for i := 0 to FChildren.Count-1 do
begin
ERes := TRemDlgElement(FChildren[i]).BuildControls(Y1, PrntWidth, prnt, AOwner);
if(not assigned(Result)) then
Result := ERes;
end;
if(FHasSharedPrompts) then
AddPrompts(TRUE, prnt, PrntWidth, Y1);
if(Box) then
begin
gb.Height := Y1 + (Gap * 3);
inc(Y, Y1 + (Gap * 4));
end
else
Y := Y1;
end;
SubCommentChange(nil);
if(assigned(AutoFocusControl)) then
begin
if(AutoFocusControl is TORComboBox) and
(TORComboBox(AutoFocusControl).CheckBoxes) and
(pos('1',TORComboBox(AutoFocusControl).CheckedString) = 0) then
Result := AutoFocusControl
else
if(TORExposedControl(AutoFocusControl).Text = '') then
Result := AutoFocusControl
end;
if ScreenReaderSystemActive then
ScreenReaderSystem_Stop;
end;
//This is used to get the template field values if this reminder is not the
//current reminder in dialog, in which case no uEntries will exist so we have
//to get the template field values that were saved in the element.
function TRemDlgElement.GetTemplateFieldValues(const Text: string; FldValues: TORStringList = nil): string;
var
flen, CtrlID, i, j: integer;
Fld: TTemplateField;
Temp, FldName, NewTxt: string;
const
TemplateFieldBeginSignature = '{FLD:';
TemplateFieldEndSignature = '}';
TemplateFieldSignatureLen = length(TemplateFieldBeginSignature);
TemplateFieldSignatureEndLen = length(TemplateFieldEndSignature);
FieldIDDelim = '`';
FieldIDLen = 6;
procedure AddNewTxt;
begin
if(NewTxt <> '') then
begin
insert(StringOfChar('x',length(NewTxt)), Temp, i);
insert(NewTxt, Result, i);
inc(i, length(NewTxt));
end;
end;
begin
Result := Text;
Temp := Text;
repeat
i := pos(TemplateFieldBeginSignature, Temp);
if(i > 0) then
begin
CtrlID := 0;
if(copy(Temp, i + TemplateFieldSignatureLen, 1) = FieldIDDelim) then
begin
CtrlID := StrToIntDef(copy(Temp, i + TemplateFieldSignatureLen + 1, FieldIDLen-1), 0);
delete(Temp,i + TemplateFieldSignatureLen, FieldIDLen);
delete(Result,i + TemplateFieldSignatureLen, FieldIDLen);
end;
j := pos(TemplateFieldEndSignature, copy(Temp, i + TemplateFieldSignatureLen, MaxInt));
if(j > 0) then
begin
inc(j, i + TemplateFieldSignatureLen - 1);
flen := j - i - TemplateFieldSignatureLen;
FldName := copy(Temp, i + TemplateFieldSignatureLen, flen);
Fld := GetTemplateField(FldName, FALSE);
delete(Temp,i,flen + TemplateFieldSignatureLen + 1);
delete(Result,i,flen + TemplateFieldSignatureLen + 1);
end
else
begin
delete(Temp,i,TemplateFieldSignatureLen);
delete(Result,i,TemplateFieldSignatureLen);
Fld := nil;
end;
// Get the value that was entered if there is one
if assigned(FldValues) and (CtrlID > 0) then
begin
j := FldValues.IndexOfPiece(IntToStr(CtrlID));
if not(j<0) then
if Fld.DateType in DateComboTypes then
NewTxt := Piece(Piece(FldValues[j],U,2),':',1)
else
NewTxt := Piece(FldValues[j],U,2);
end;
// If nothing has been entered, use the default
if (NewTxt = '') and assigned(Fld) and
//If this template field is a dftHyperlink or dftText that is
//excluded (FSepLines = True) then don't get the default text
not ((Fld.FldType in [dftHyperlink, dftText]) and Fld.SepLines) then
NewTxt := Fld.TemplateFieldDefault;
AddNewTxt;
end;
until not (i > 0);
end;
procedure TRemDlgElement.AddText(Lst: TStrings);
var
i, ilvl: integer;
Prompt: TRemPrompt;
txt: string;
FldData: TORStringList;
begin
if (not (FReminder is TReminder)) then
ScootOver := 4;
try
if Add2PN then
begin
ilvl := IndentPNLevel;
if(FPNText <> '') then
txt := FPNText
else
begin
txt := FText;
if not FReminder.FNoResolve then
//If this is the CurrentReminderInDialog then we get the template field
//values from the visual control in the dialog window.
if FReminder = CurrentReminderInDialog then
txt := ResolveTemplateFields(txt, TRUE)
else
//If this is not the CurrentReminderInDialog (i.e.: Next or Back button
//has been pressed), then we have to get the template field values
//that were saved in the element.
begin
FldData := TORStringList.Create;
GetFieldValues(FldData);
txt := GetTemplateFieldValues(txt, FldData);
end;
end;
if FReminder.FNoResolve then
begin
StripScreenReaderCodes(txt);
Lst.Add(txt);
end
else
WordWrap(txt, Lst, ilvl);
dec(ilvl,2);
if(assigned(FPrompts)) then
begin
for i := 0 to FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FPrompts[i]);
if(not Prompt.FIsShared) then
begin
if Prompt.PromptType = ptMHTest then WordWrap(Prompt.NoteText, Lst, ilvl, 4, true)
else WordWrap(Prompt.NoteText, Lst, ilvl);
end;
end;
end;
if(assigned(FParent) and FParent.FHasSharedPrompts) then
begin
for i := 0 to FParent.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FParent.FPrompts[i]);
if(Prompt.FIsShared) and (Prompt.FSharedChildren.IndexOf(Self) >= 0) then
begin
//AGP Change MH dll
if (Prompt.PromptType = ptMHTest) then WordWrap(Prompt.NoteText, Lst, ilvl, 4, True)
else WordWrap(Prompt.NoteText, Lst, ilvl);
end;
end;
end;
end;
if (assigned(FChildren)) and (FChecked or (ElemType = etDisplayOnly)) then
begin
for i := 0 to FChildren.Count-1 do
begin
TRemDlgElement(FChildren[i]).AddText(Lst);
end;
end;
finally
if (not (FReminder is TReminder)) then
ScootOver := 0;
end;
end;
function TRemDlgElement.AddData(Lst: TStrings; Finishing: boolean;
AHistorical: boolean = FALSE): integer;
var
i, j: integer;
OK: boolean;
ActDt, InActDt, EncDt: double;
RData: TRemData;
begin
Result := 0;
// OK := ((ElemType <> etDisplayOnly) and FChecked);
OK := FChecked;
if(OK and Finishing) then
OK := (Historical = AHistorical);
if OK then
begin
if(assigned(FData)) then
begin
if Self.Historical then
EncDt := DateTimeToFMDateTime(Date)
else
EncDt := RemForm.PCEObj.VisitDateTime;
for i := 0 to FData.Count-1 do
begin
RData := TRemData(FData[i]);
if assigned(RData.FActiveDates) then
for j := 0 to (TRemData(FData[i]).FActiveDates.Count - 1) do
begin
ActDt := StrToIntDef(Piece(TRemData(FData[i]).FActiveDates[j],':',1), 0);
InActDt := StrToIntDef(Piece(TRemData(FData[i]).FActiveDates[j], ':', 2), 9999999);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
begin
inc(Result, TRemData(FData[i]).AddData(Lst, Finishing));
Break;
end;
end
else
inc(Result, TRemData(FData[i]).AddData(Lst, Finishing));
end;
end;
end;
if (assigned(FChildren)) and (FChecked or (ElemType = etDisplayOnly)) then
begin
for i := 0 to FChildren.Count-1 do
inc(Result, TRemDlgElement(FChildren[i]).AddData(Lst, Finishing, AHistorical));
end;
end;
procedure TRemDlgElement.Check4ChildrenSharedPrompts;
var
i, j: integer;
Kid: TRemDlgElement;
PList, EList: TList;
FirstMatch: boolean;
Prompt: TRemPrompt;
begin
if(not FChildrenShareChecked) then
begin
FChildrenShareChecked := TRUE;
if(ChildrenSharePrompts and assigned(FChildren)) then
begin
for i := 0 to FChildren.Count-1 do
TRemDlgElement(FChildren[i]).GetData;
PList := TList.Create;
try
EList := TList.Create;
try
for i := 0 to FChildren.Count-1 do
begin
Kid := TRemDlgElement(FChildren[i]);
// if(Kid.ElemType <> etDisplayOnly) and (assigned(Kid.FPrompts)) then
if(assigned(Kid.FPrompts)) then
begin
for j:= 0 to Kid.FPrompts.Count-1 do
begin
PList.Add(Kid.FPrompts[j]);
EList.Add(Kid);
end;
end;
end;
if(PList.Count > 1) then
begin
for i := 0 to PList.Count-2 do
begin
if(assigned(EList[i])) then
begin
FirstMatch := TRUE;
Prompt := TRemPrompt(PList[i]);
for j := i+1 to PList.Count-1 do
begin
if(assigned(EList[j]) and
(Prompt.CanShare(TRemPrompt(PList[j])))) then
begin
if(FirstMatch) then
begin
FirstMatch := FALSE;
if(not assigned(FPrompts)) then
FPrompts := TList.Create;
FHasSharedPrompts := TRUE;
Prompt.FIsShared := TRUE;
if(not assigned(Prompt.FSharedChildren)) then
Prompt.FSharedChildren := TList.Create;
Prompt.FSharedChildren.Add(EList[i]);
FPrompts.Add(PList[i]);
TRemDlgElement(EList[i]).FPrompts.Remove(PList[i]);
EList[i] := nil;
end;
Prompt.FSharedChildren.Add(EList[j]);
Kid := TRemDlgElement(EList[j]);
Kid.FPrompts.Remove(PList[j]);
if(Kid.FHasComment) and (Kid.FCommentPrompt = PList[j]) then
begin
Kid.FHasComment := FALSE;
Kid.FCommentPrompt := nil;
end;
TRemPrompt(PList[j]).Free;
EList[j] := nil;
end;
end;
end;
end;
end;
finally
EList.Free;
end;
finally
PList.Free;
end;
for i := 0 to FChildren.Count-1 do
begin
Kid := TRemDlgElement(FChildren[i]);
if(assigned(Kid.FPrompts) and (Kid.FPrompts.Count = 0)) then
begin
Kid.FPrompts.Free;
Kid.FPrompts := nil;
end;
end;
end;
end;
end;
procedure TRemDlgElement.FinishProblems(List: TStrings);
var
i,cnt: integer;
cReq: TRDChildReq;
Kid: TRemDlgElement;
Prompt: TRemPrompt;
txt, msg, Value: string;
pt: TRemPromptType;
begin
// if(ElemType <> etDisplayOnly) and (FChecked) and (assigned(FPrompts)) then
if(FChecked and (assigned(FPrompts))) then
begin
for i := 0 to FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FPrompts[i]);
Value := Prompt.GetValue;
pt := Prompt.PromptType;
if(Prompt.PromptOK and (not Prompt.Forced) and Prompt.Required and
(((pt<>ptWHNotPurp)and(pt<>ptWHPapResult))and
((Value = '') or (Value = '@')) or
((pt = ptVisitDate) and Prompt.FMonthReq and (StrToIntDef(copy(Value,4,2),0) = 0)) or
((pt in [ptVisitDate, ptVisitLocation]) and (Value = '0')))) then
begin
WordWrap('Element: ' + FText, List, 68, 6);
txt := Prompt.ForcedCaption;
if(pt = ptVisitDate) and Prompt.FMonthReq then
txt := txt + ' (Month Required)';
WordWrap('Item: ' + txt, List, 65, 6);
end;
if (Prompt.PromptOK and (not Prompt.Forced) and Prompt.Required and
((WHResultChk='') and (Value='')) and ((pt=ptWHPapResult) and (FData<>nil))) then
begin
WordWrap('Prompt: ' + Prompt.ForcedCaption, List, 65,6);
end;
if (Prompt.PromptOK and (not Prompt.Forced) and Prompt.Required
and (pt=ptWHNotPurp)) and ((WHResultNot = '') and (Value = '')) then
begin
WordWrap('Element: ' + FText, List, 68, 6);
WordWrap('Prompt: ' + Prompt.ForcedCaption, List, 65,6);
end;
//(AGP Change 24.9 add check to see if MH tests are required)
if ((Pt = ptMHTest) or (Pt = ptGAF)) and (StrtoInt(Piece(Prompt.FData.FRec3,U,13)) > 0) and
(not Prompt.Forced) then
begin
if (Piece(Prompt.FData.FRec3,U,13) = '2') and (Prompt.FMHTestComplete = 0) then break;
if (Pt = ptMHTest) and (Prompt.FMHTestComplete = 2) then
begin
if ((Prompt.FValue = '') or (pos('X',Prompt.FValue)>0)) then
begin
if Prompt.FValue = '' then
WordWrap('MH test '+ Piece(Prompt.FData.FRec3,U,8) + ' not done',List,65,6);
if pos('X',Prompt.FValue)>0 then
WordWrap('You are missing one or more responses in the MH test '+
Piece(Prompt.FData.FRec3,U,8),List,65,6);
WordWrap(' ',List,65,6);
end;
end;
if (Pt = ptMHTest) and (Prompt.FMHTestComplete = 0) or ((Prompt.FValue = '') and (Pos('New MH dll',Prompt.FValue) = 0)) then
begin
if Prompt.FValue = '' then
WordWrap('MH test '+ Piece(Prompt.FData.FRec3,U,8) + ' not done',List,65,6);
if pos('X',Prompt.FValue)>0 then
WordWrap('You are missing one or more responses in the MH test '+
Piece(Prompt.FData.FRec3,U,8),List,65,6);
WordWrap(' ',List,65,6);
end;
if (Pt = ptMHTest) and (Prompt.FMHTestComplete = 0) and (Pos('New MH dll',Prompt.FValue) > 0) then
begin
WordWrap('MH test ' + Piece(Prompt.FData.FRec3, U, 8) + ' is not complete', List, 65, 6);
WordWrap(' ',List,65,6);
end;
if (Pt = ptGAF) and ((Prompt.FValue = '0') or (Prompt.FValue = '')) then
begin
WordWrap('GAF test must have a score greater then zero',List,65,6);
WordWrap(' ',List,65,6);
end;
end;
end;
end;
if (assigned(FChildren)) and (FChecked or (ElemType = etDisplayOnly)) then
begin
cReq := ChildrenRequired;
if(cReq in [crOne, crAtLeastOne, crAll]) then
begin
cnt := 0;
for i := 0 to FChildren.Count-1 do
begin
Kid := TRemDlgElement(FChildren[i]);
// if(Kid.FChecked and (Kid.ElemType <> etDisplayOnly)) then
if(Kid.FChecked) then
inc(cnt);
end;
if(cReq = crOne) and (cnt <> 1) then
msg := 'One selection required'
else
if(cReq = crAtLeastOne) and (cnt < 1) then
msg := 'One or more selections required'
else
if (cReq = crAll) and (cnt < FChildren.Count) then
msg := 'All selections are required'
else
msg := '';
if(msg <> '') then
begin
txt := BoxCaption;
if(txt = '') then
txt := FText;
WordWrap('Group: ' + txt, List, 68, 6);
WordWrap(Msg, List, 65, 0);
WordWrap(' ',List,68,6); // (AGP change 24.9 added blank line for display spacing)
end;
end;
for i := 0 to FChildren.Count-1 do
TRemDlgElement(FChildren[i]).FinishProblems(List);
end;
end;
function TRemDlgElement.IsChecked: boolean;
var
Prnt: TRemDlgElement;
begin
Result := TRUE;
Prnt := Self;
while Result and assigned(Prnt) do
begin
Result := ((Prnt.ElemType = etDisplayOnly) or Prnt.FChecked);
Prnt := Prnt.FParent;
end;
end;
function TRemDlgElement.IndentChildrenInPN: boolean;
begin
//if(Box) then
Result := (Piece(FRec1, U, 21) = '1');
//else
// Result := FALSE;
end;
function TRemDlgElement.IndentPNLevel: integer;
begin
if(assigned(FParent)) then
begin
Result := FParent.IndentPNLevel;
if(FParent.IndentChildrenInPN) then
dec(Result,2);
end
else
Result := 70;
end;
function TRemDlgElement.IncludeMHTestInPN: boolean;
begin
Result := (Piece(FRec1, U, 9) = '0');
end;
function TRemDlgElement.ResultDlgID: string;
begin
Result := Piece(FRec1, U, 10);
end;
procedure TRemDlgElement.SubCommentChange(Sender: TObject);
var
i: integer;
txt: string;
ok: boolean;
begin
if(FHasSubComments and FHasComment and assigned(FCommentPrompt)) then
begin
ok := FALSE;
if(assigned(Sender)) then
begin
with (Sender as TORCheckBox) do
TRemPrompt(Tag).FValue := BOOLCHAR[Checked];
ok := TRUE;
end;
if(not ok) then
ok := (FCommentPrompt.GetValue = '');
if(ok) then
begin
txt := '';
for i := 0 to FPrompts.Count-1 do
begin
with TRemPrompt(FPrompts[i]) do
begin
if(PromptType = ptSubComment) and (FValue = BOOLCHAR[TRUE]) then
begin
if(txt <> '') then
txt := txt + ', ';
txt := txt + Caption;
end;
end;
end;
if(txt <> '') then
txt[1] := UpCase(txt[1]);
FCommentPrompt.SetValue(txt);
end;
end;
end;
constructor TRemDlgElement.Create;
begin
FFieldValues := TORStringList.Create;
end;
function TRemDlgElement.EntryID: string;
begin
Result := REMEntryCode + FReminder.GetIEN + '/' + IntToStr(integer(Self));
end;
procedure TRemDlgElement.FieldPanelChange(Sender: TObject);
var
idx: integer;
Entry: TTemplateDialogEntry;
fval: string;
begin
FReminder.BeginTextChanged;
try
Entry := TTemplateDialogEntry(Sender);
idx := FFieldValues.IndexOfPiece(Entry.InternalID);
fval := Entry.InternalID + U + Entry.FieldValues;
if(idx < 0) then
FFieldValues.Add(fval)
else
FFieldValues[idx] := fval;
finally
FReminder.EndTextChanged(Sender);
end;
end;
procedure TRemDlgElement.GetFieldValues(FldData: TStrings);
var
i, p: integer;
TmpSL: TStringList;
begin
TmpSL := TStringList.Create;
try
for i := 0 to FFieldValues.Count-1 do
begin
p := pos(U, FFieldValues[i]); // Can't use Piece because 2nd piece may contain ^ characters
if(p > 0) then
begin
TmpSL.CommaText := copy(FFieldValues[i],p+1,MaxInt);
FastAddStrings(TmpSL, FldData);
TmpSL.Clear;
end;
end;
finally
TmpSL.Free;
end;
if (assigned(FChildren)) and (FChecked or (ElemType = etDisplayOnly)) then
for i := 0 to FChildren.Count-1 do
TRemDlgElement(FChildren[i]).GetFieldValues(FldData);
end;
{cause the paint event to be called and draw a focus rectangle on the TFieldPanel}
procedure TRemDlgElement.FieldPanelEntered(Sender: TObject);
begin
with TDlgFieldPanel(Sender) do
begin
Focus := TRUE;
Invalidate;
if Parent is TDlgFieldPanel then
begin
TDlgFieldPanel(Parent).Focus := FALSE;
TDlgFieldPanel(Parent).Invalidate;
end;
end;
end;
{cause the paint event to be called and draw the TFieldPanel without the focus rect.}
procedure TRemDlgElement.FieldPanelExited(Sender: TObject);
begin
with TDlgFieldPanel(Sender) do
begin
Focus := FALSE;
Invalidate;
if Parent is TDlgFieldPanel then
begin
TDlgFieldPanel(Parent).Focus := TRUE;
TDlgFieldPanel(Parent).Invalidate;
end;
end;
end;
{Check the associated checkbox when spacebar is pressed}
procedure TRemDlgElement.FieldPanelKeyPress(Sender: TObject; var Key: Char);
begin
if Key = ' ' then
begin
FieldPanelOnClick(Sender);
Key := #0;
end;
end;
{So the FieldPanel will check the associated checkbox}
procedure TRemDlgElement.FieldPanelOnClick(Sender: TObject);
begin
// if TFieldPanel(Sender).Focus then
TORCheckBox(TDlgFieldPanel(Sender).Tag).Checked := not FChecked;
end;
{call the FieldPanelOnClick so labels on the panels will also click the checkbox}
procedure TRemDlgElement.FieldPanelLabelOnClick(Sender: TObject);
begin
FieldPanelOnClick(TLabel(Sender).Parent); {use the parent/fieldpanel as the Sender}
end;
{ TRemData }
function TRemData.Add2PN: boolean;
begin
Result := (Piece(FRec3, U, 5) <> '1');
end;
function TRemData.AddData(List: TStrings; Finishing: boolean): integer;
var
i, j, k: integer;
PCECat: TPCEDataCat;
Primary: boolean;
ActDt, InActDt: Double;
EncDt: TFMDateTime;
procedure AddPrompt(Prompt: TRemPrompt; dt: TRemDataType; var x: string);
var
pt: TRemPromptType;
pnum: integer;
Pdt: TRemDataType;
v: TVitalType;
rte, unt, txt: string;
UIEN: Int64;
begin
pnum := -1;
pt := Prompt.PromptType;
if(pt = ptSubComment) or (pt = ptUnknown) then exit;
if(pt = ptMST) then
begin
if (PCECat in MSTDataTypes) then
begin
UIEN := FParent.FReminder.PCEDataObj.Providers.PCEProvider;
if UIEN <= 0 then
UIEN := User.DUZ;
SetPiece(x, U, pnumMST, Prompt.GetValue + ';' + // MST Code
FloatToStr(RemForm.PCEObj.VisitDateTime) + ';' +
IntToStr(UIEN) + ';' + //
Prompt.FMiscText); // IEN of Exam, if any
end;
end
else
if(PCECat = pdcVital) then
begin
if(pt = ptVitalEntry) then
begin
rte := Prompt.VitalValue;
if(rte <> '') then
begin
v := Prompt.VitalType;
unt := Prompt.VitalUnitValue;
ConvertVital(v, rte, unt);
//txt := U + VitalCodes[v] + U + rte + U + FloatToStr(RemForm.PCEObj.VisitDateTime); AGP Change 26.1 commented out
txt := U + VitalCodes[v] + U + rte + U + '0'; //AGP Change 26.1 Use for Vital date/time
if(not Finishing) then
txt := Char(ord('A')+ord(v)) + FormatVitalForNote(txt); // Add vital sort char
List.AddObject(Char(ord('A')+ord(PCECat)) + txt, Self);
end;
end
else
exit;
end
else
if(PCECat = pdcMH) then
begin
if(pt = ptMHTest) or (pt = ptGAF) then
x := x + U + Prompt.GetValue
else
exit;
end
else
if(pt <> ptDataList) and (ord(pt) >= ord(low(TRemPromptType))) then
begin
Pdt := RemPromptTypes[pt];
if (Pdt = dt) or (Pdt = dtAll) or
((Pdt = dtHistorical) and assigned(Prompt.FParent) and
Prompt.FParent.Historical) then
pnum := FinishPromptPieceNum[pt];
if(pnum > 0) then
begin
if(pt = ptPrimaryDiag) then
SetPiece(x, U, pnum, BoolChar[Primary])
else
SetPiece(x, U, pnum, Prompt.GetValue);
end;
end;
end;
procedure Add(Str: string; Root: TRemPCERoot);
var
i, Qty: integer;
Value, IsGAF, txt, x, Code, Nar, Cat: string;
Skip: boolean;
Prompt: TRemPrompt;
dt: TRemDataType;
TestDate: TFMDateTime;
i1,i2: integer;
begin
x := '';
dt := Code2DataType(Piece(Str, U, r3Type));
PCECat := RemData2PCECat[dt];
Code := Piece(Str, U, r3Code);
if(Code = '') then
Code := Piece(Str, U, r3Code2);
Nar := Piece(Str, U, r3Nar);
Cat := Piece(Str, U, r3Cat);
Primary := FALSE;
if(assigned(FParent) and assigned(FParent.FPrompts) and (PCECat = pdcDiag)) then
begin
if(FParent.Historical) then
begin
for i := 0 to FParent.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FParent.FPrompts[i]);
if(Prompt.PromptType = ptPrimaryDiag) then
begin
Primary := (Prompt.GetValue = BOOLCHAR[TRUE]);
break;
end;
end;
end
else
Primary := (Root = PrimaryDiagRoot);
end;
Skip := FALSE;
if (PCECat = pdcMH) then
begin
IsGAF := Piece(FRec3, U, r3GAF);
Value := FChoicePrompt.GetValue;
if(Value = '') or ((IsGAF = '1') and (Value = '0')) then
Skip := TRUE;
end;
if Finishing or (PCECat = pdcVital) then
begin
if(dt = dtOrder) then
x := U + Piece(Str,U,6) + U + Piece(Str,U,11) + U + Nar
else
begin
if (PCECat = pdcMH) then
begin
if(Skip) then
x := ''
else
begin
TestDate := Trunc(FParent.FReminder.PCEDataObj.VisitDateTime);
if(IsGAF = '1') then
ValidateGAFDate(TestDate);
x := U + Nar + U + IsGAF + U + FloatToStr(TestDate) + U +
IntToSTr(FParent.FReminder.PCEDataObj.Providers.PCEProvider);
end;
end
else
if (PCECat <> pdcVital) then
begin
x := Piece(Str, U, 6);
SetPiece(x, U, pnumCode, Code);
SetPiece(x, U, pnumCategory, Cat);
SetPiece(x, U, pnumNarrative, Nar);
end;
if(assigned(FParent)) then
begin
if(assigned(FParent.FPrompts)) then
begin
for i := 0 to FParent.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FParent.FPrompts[i]);
if(not Prompt.FIsShared) then
AddPrompt(Prompt, dt, x);
end;
end;
if(assigned(FParent.FParent) and FParent.FParent.FHasSharedPrompts) then
begin
for i := 0 to FParent.FParent.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FParent.FParent.FPrompts[i]);
if(Prompt.FIsShared) and (Prompt.FSharedChildren.IndexOf(FParent) >= 0) then
AddPrompt(Prompt, dt, x);
end;
end;
end;
end;
if(x <> '') then
List.AddObject(Char(ord('A')+ord(PCECat)) + x, Self);
end
else
begin
Qty := 1;
if(assigned(FParent) and assigned(FParent.FPrompts)) then
begin
if(PCECat = pdcProc) then
begin
for i := 0 to FParent.FPrompts.Count-1 do
begin
Prompt := TRemPrompt(FParent.FPrompts[i]);
if(Prompt.PromptType = ptQuantity) then
begin
Qty := StrToIntDef(Prompt.GetValue, 1);
if(Qty < 1) then Qty := 1;
break;
end;
end;
end;
end;
if (not Skip) then
begin
txt := Char(ord('A')+ord(PCECat)) +
GetPCEDataText(PCECat, Code, Cat, Nar, Primary, Qty);
if(assigned(FParent) and FParent.Historical) then
txt := txt + ' (Historical)';
List.AddObject(txt, Self);
inc(Result);
end;
if assigned(FParent) and assigned(FParent.FMSTPrompt) then
begin
txt := FParent.FMSTPrompt.Value;
if txt <> '' then
begin
if FParent.FMSTPrompt.FMiscText = '' then
begin
i1 := 0;
i2 := 2;
end
else
begin
i1 := 3;
i2 := 4;
end;
for i := i1 to i2 do
if txt = MSTDescTxt[i,1] then
begin
List.AddObject(Char( ord('A') + ord(pdcMST)) + MSTDescTxt[i,0], Self);
break;
end;
end;
end;
end;
end;
begin
Result := 0;
if(assigned(FChoicePrompt)) and (assigned(FChoices)) then
begin
If not assigned(FChoicesActiveDates) then
begin
for i := 0 to FChoices.Count - 1 do
begin
if (copy(FChoicePrompt.GetValue, i+1, 1) = '1') then
Add(FChoices[i], TRemPCERoot(FChoices.Objects[i]))
end
end
else {if there are active dates for each choice then check them}
begin
If Self.FParent.Historical then
EncDt := DateTimeToFMDateTime(Date)
else
EncDt := RemForm.PCEObj.VisitDateTime;
k := 0;
for i := 0 to FChoices.Count - 1 do
begin
for j := 0 to (TStringList(Self.FChoicesActiveDates[i]).Count - 1) do
begin
ActDt := StrToIntDef((Piece(TStringList(Self.FChoicesActiveDates[i]).Strings[j], ':', 1)),0);
InActDt := StrToIntDef((Piece(TStringList(Self.FChoicesActiveDates[i]).Strings[j], ':', 2)),9999999);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
begin
if(copy(FChoicePrompt.GetValue, k+1,1) = '1') then
Add(FChoices[i], TRemPCERoot(FChoices.Objects[i]));
inc(k);
end; {Active date check}
end; {FChoicesActiveDates.Items[i] loop}
end; {FChoices loop}
end {FChoicesActiveDates check}
end {FChoicePrompt and FChoices check}
else
Add(FRec3, FPCERoot); {Active dates for this are checked in TRemDlgElement.AddData}
end;
function TRemData.Category: string;
begin
Result := Piece(FRec3, U, r3Cat);
end;
function TRemData.DataType: TRemDataType;
begin
Result := Code2DataType(Piece(FRec3, U, r3Type));
end;
destructor TRemData.Destroy;
var
i: integer;
begin
if(assigned(FPCERoot)) then
FPCERoot.Done(Self);
if(assigned(FChoices)) then
begin
for i := 0 to FChoices.Count-1 do
begin
if(assigned(FChoices.Objects[i])) then
TRemPCERoot(FChoices.Objects[i]).Done(Self);
end;
end;
KillObj(@FChoices);
inherited;
end;
function TRemData.DisplayWHResults: boolean;
begin
Result :=False;
if FRec3<>'' then
Result := (Piece(FRec3, U, 6) <> '0');
end;
function TRemData.ExternalValue: string;
begin
Result := Piece(FRec3, U, r3Code);
end;
function TRemData.InternalValue: string;
begin
Result := Piece(FRec3, U, 6);
end;
function TRemData.Narrative: string;
begin
Result := Piece(FRec3, U, r3Nar);
end;
{ TRemPrompt }
function TRemPrompt.Add2PN: boolean;
begin
Result := FALSE;
if (not Forced) and (PromptOK) then
//if PromptOK then
Result := (Piece(FRec4, U, 5) <> '1');
if (Result=false) and (Piece(FRec4,U,4)='WH_NOT_PURP') then
Result := True;
end;
function TRemPrompt.Caption: string;
begin
Result := Piece(FRec4, U, 8);
if(not FCaptionAssigned) then
begin
AssignFieldIDs(Result);
SetPiece(FRec4, U, 8, Result);
FCaptionAssigned := TRUE;
end;
end;
constructor TRemPrompt.Create;
begin
FOverrideType := ptUnknown;
end;
function TRemPrompt.Forced: boolean;
begin
Result := (Piece(FRec4, U, 7) = 'F');
end;
function TRemPrompt.InternalValue: string;
var
m, d, y: word;
Code: string;
begin
Result := Piece(FRec4, U, 6);
Code := Piece(FRec4, U, 4);
if(Code = RemPromptCodes[ptVisitDate]) then
begin
if(copy(Result,1,1) = MonthReqCode) then
begin
FMonthReq := TRUE;
delete(Result,1,1);
end;
if(Result = '') then
begin
DecodeDate(Now, y, m, d);
Result := inttostr(y-1700)+'0000';
SetPiece(FRec4, U, 6, Result);
end;
end;
end;
procedure TRemPrompt.PromptChange(Sender: TObject);
var
cbo: TORComboBox;
pt: TRemPromptType;
TmpValue, OrgValue: string;
idx, i: integer;
NeedRedraw: boolean;
dte: TFMDateTime;
whCKB: TWHCheckBox;
//printoption: TORCheckBox;
WHValue, WHValue1: String;
begin
FParent.FReminder.BeginTextChanged;
try
FFromControl := TRUE;
try
TmpValue := GetValue;
OrgValue := TmpValue;
pt := PromptType;
NeedRedraw := FALSE;
case pt of
ptComment, ptQuantity:
TmpValue := (Sender as TEdit).Text;
ptVisitDate:
begin
dte := (Sender as TORDateCombo).FMDate;
while (dte > 2000000) and (dte > FMToday) do
begin
dte := dte - 10000;
NeedRedraw := TRUE;
end;
TmpValue := FloatToStr(dte);
if(TmpValue = '1000000') then
TmpValue := '0';
end;
ptPrimaryDiag, ptAdd2PL, ptContraindicated:
begin
TmpValue := BOOLCHAR[(Sender as TORCheckBox).Checked];
NeedRedraw := (pt = ptPrimaryDiag);
end;
ptVisitLocation:
begin
cbo := (Sender as TORComboBox);
if(cbo.ItemIEN < 0) then
NeedRedraw := (not cbo.DroppedDown)
else
begin
if(cbo.ItemIndex <= 0) then
cbo.Items[0] := '0' + U + cbo.text;
TmpValue := cbo.ItemID;
if(StrToIntDef(TmpValue,0) = 0) then
TmpValue := cbo.Text;
end;
end;
ptWHPapResult:
begin
if (Sender is TWHCheckBox) then
begin
whCKB := (Sender as TWHCheckBox);
if whCKB.Checked = true then
begin
if whCKB.Caption ='NEM (No Evidence of Malignancy)' then FParent.WHResultChk := 'N';
if whCKB.Caption ='Abnormal' then FParent.WHResultChk := 'A';
if whCKB.Caption ='Unsatisfactory for Diagnosis' then FParent.WHResultChk := 'U';
//AGP Change 23.13 WH multiple processing
for i := 0 to FParent.FData.Count-1 do
begin
if Piece(TRemData(FParent.FData[i]).FRec3,U,4)='WHR' then
begin
FParent.FReminder.WHReviewIEN := Piece(TRemData(FParent.FData[i]).FRec3,U,6)
end;
end;
end
else
begin
FParent.WHResultChk := '';
FParent.FReminder.WHReviewIEN := ''; //AGP CHANGE 23.13
end;
end;
end;
ptWHNotPurp:
begin
if (Sender is TWHCheckBox) then
begin
whCKB := (Sender as TWHCheckBox);
if whCKB.Checked = true then
begin
if whCKB.Caption ='Letter' then
begin
if FParent.WHResultNot='' then FParent.WHResultNot := 'L'
else
if Pos('L',FParent.WHResultNot)=0 then FParent.WHResultNot := FParent.WHResultNot +':L';
if whCKB.FButton <> nil then whCKB.FButton.Enabled := true;
if whCKB.FPrintNow <> nil then
begin
whCKB.FPrintVis :='1';
whCKB.FPrintNow.Enabled := true;
end;
end;
if whCKB.Caption ='In-Person' then
begin
if FParent.WHResultNot='' then FParent.WHResultNot := 'I'
else
if Pos('I',FParent.WHResultNot)=0 then FParent.WHResultNot := FParent.WHResultNot+':I';
end;
if whCKB.Caption ='Phone Call' then
begin
if FParent.WHResultNot='' then FParent.WHResultNot := 'P'
else
if Pos('P',FParent.WHResultNot)=0 then FParent.WHResultNot := FParent.WHResultNot+':P';
end;
end
else
begin
// this section is to handle unchecking of boxes and disabling print now and view button
WHValue := FParent.WHResultNot;
if whCKB.Caption ='Letter' then
begin
for i:=1 to Length(WHValue) do
begin
if WHValue1='' then
begin
if (WHValue[i]<>'L') and (WHValue[i]<>':') then WHValue1 := WHValue[i];
end
else
if (WHValue[i]<>'L') and (WHValue[i]<>':') then WHValue1 := WHValue1+':'+WHValue[i];
end;
if (whCKB.FButton <> nil) and (whCKB.FButton.Enabled = true) then whCKB.FButton.Enabled := false;
if (whCKB.FPrintNow <> nil) and (whCKB.FPrintNow.Enabled = true) then
begin
whCKB.FPrintVis := '0';
if whCKB.FPrintNow.Checked = true then whCKB.FPrintNow.Checked := false;
whCKB.FPrintNow.Enabled := false;
FParent.WHPrintDevice := '';
end;
end;
if whCKB.Caption ='In-Person' then
begin
for i:=1 to Length(WHValue) do
begin
if WHValue1='' then
begin
if (WHValue[i]<>'I') and (WHValue[i]<>':') then WHValue1 := WHValue[i];
end
else
if (WHValue[i]<>'I') and (WHValue[i]<>':') then WHValue1 := WHValue1+':'+WHValue[i];
end;
end;
if whCKB.Caption ='Phone Call' then
begin
for i:=1 to Length(WHValue) do
begin
if WHValue1='' then
begin
if (WHValue[i]<>'P') and (WHValue[i]<>':') then WHValue1 := WHValue[i];
end
else
if (WHValue[i]<>'P') and (WHValue[i]<>':') then WHValue1 := WHValue1+':'+WHValue[i];
end;
end;
FParent.WHResultNot := WHValue1;
end;
end
else
if ((Sender as TORCheckBox)<>nil) and (Piece(FRec4,U,12)='1') then
begin
if (((Sender as TORCheckBox).Caption = 'Print Now') and
((Sender as TORCheckBox).Enabled =true)) and ((Sender as TORCheckBox).Checked = true) and
(FParent.WHPrintDevice ='') then
begin
FParent.WHPrintDevice := SelectDevice(Self, Encounter.Location, false, 'Women Health Print Device Selection');
FPrintNow :='1';
if FParent.WHPrintDevice ='' then
begin
FPrintNow :='0';
(Sender as TORCheckBox).Checked := false;
end;
end;
if (((Sender as TORCheckBox).Caption = 'Print Now') and
((Sender as TORCheckBox).Enabled =true)) and ((Sender as TORCheckBox).Checked = false) then
begin
FParent.WHPrintDevice := '';
FPrintNow :='0';
end;
end;
end;
ptExamResults, ptSkinResults, ptLevelSeverity,
ptSeries, ptReaction, ptLevelUnderstanding, ptSkinReading: //(AGP Change 26.1)
TmpValue := (Sender as TORComboBox).ItemID;
else
if pt = ptVitalEntry then
begin
case (Sender as TControl).Tag of
TAG_VITTEMPUNIT, TAG_VITHTUNIT, TAG_VITWTUNIT: idx := 2;
TAG_VITPAIN: begin
idx := -1;
TmpValue := (Sender as TORComboBox).ItemID;
if FParent.VitalDateTime = 0 then
FParent.VitalDateTime := FMNow;
end;
else
idx := 1;
end;
if(idx > 0) then
begin
//AGP Change 26.1 change Vital time/date to Now instead of encounter date/time
SetPiece(TmpValue, ';', idx, TORExposedControl(Sender).Text);
if (FParent.VitalDateTime > 0) and (TORExposedControl(Sender).Text = '') then
FParent.VitalDateTime := 0;
if (FParent.VitalDateTime = 0) and (TORExposedControl(Sender).Text <> '') then
FParent.VitalDateTime := FMNow;
end;
end
else
if pt = ptDataList then
begin
TmpValue := (Sender as TORComboBox).CheckedString;
NeedRedraw := TRUE;
end
else
if (pt = ptGAF) and (MHDLLFound = false) then
TmpValue := (Sender as TEdit).Text;
end;
if(TmpValue <> OrgValue) then
begin
if NeedRedraw then
FParent.FReminder.BeginNeedRedraw;
try
SetValue(TmpValue);
finally
if NeedRedraw then
FParent.FReminder.EndNeedRedraw(Self);
end;
end
else
if NeedRedraw then
begin
FParent.FReminder.BeginNeedRedraw;
FParent.FReminder.EndNeedRedraw(Self);
end;
finally
FFromControl := FALSE;
end;
finally
FParent.FReminder.EndTextChanged(Sender);
end;
if(FParent.ElemType = etDisplayOnly) and (not assigned(FParent.FParent)) then
RemindersInProcess.Notifier.Notify;
end;
procedure TRemPrompt.ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if(Key = VK_RETURN) and (Sender is TORComboBox) and
((Sender as TORComboBox).DroppedDown) then
(Sender as TORComboBox).DroppedDown := FALSE;
end;
function TRemPrompt.PromptOK: boolean;
var
pt: TRemPromptType;
dt: TRemDataType;
i: integer;
begin
pt := PromptType;
if(pt = ptUnknown) or (pt = ptMST) then
Result := FALSE
else
if(pt = ptDataList) or (pt = ptVitalEntry) or (pt = ptMHTest) or (pt = ptGAF) or
(pt = ptWHPapResult) then
Result := TRUE
else
if(pt = ptSubComment) then
Result := FParent.FHasComment
else
begin
dt := RemPromptTypes[PromptType];
if(dt = dtAll) then Result := TRUE
else if(dt = dtUnknown) then Result := FALSE
else if(dt = dtHistorical) then Result := FParent.Historical
else
begin
Result := FALSE;
if(assigned(FParent.FData)) then
begin
for i := 0 to FParent.FData.Count-1 do
begin
if(TRemData(FParent.FData[i]).DataType = dt) then
begin
Result := TRUE;
break;
end;
end;
end;
end;
end;
end;
function TRemPrompt.PromptType: TRemPromptType;
begin
if(assigned(FData)) then
Result := FOverrideType
else
Result := Code2PromptType(Piece(FRec4, U, 4));
end;
function TRemPrompt.Required: boolean;
var
pt: TRemPromptType;
begin
pt := PromptType;
if(pt = ptVisitDate) then
Result := TRUE
else
if(pt = ptSubComment) then
Result := FALSE
else
Result := (Piece(FRec4, U, 10) = '1');
end;
function TRemPrompt.SameLine: boolean;
begin
Result := (Piece(FRec4, U, 9) <> '1');
end;
function TRemPrompt.NoteText: string;
var
pt: TRemPromptType;
dateStr, fmt, tmp, WHValue: string;
cnt, i, j, k: integer;
ActDt, InActDt: Double;
EncDt: TFMDateTime;
begin
Result := '';
if Add2PN then
begin
pt := PromptType;
tmp := GetValue;
case pt of
ptComment: Result := tmp;
ptQuantity: if(StrToIntDef(tmp,1) <> 1) then
Result := tmp;
(* ptSkinReading: if(StrToIntDef(tmp,0) <> 0) then
Result := tmp; *)
ptSkinReading: // (AGP Change 26.1)
begin
Result := tmp;
end;
ptVisitDate:
begin
try
if(tmp <> '') and (tmp <> '0') and (length(Tmp) = 7) then
begin
dateStr := '';
if FMonthReq and (copy(tmp,4,2) = '00') then
Result := ''
else
begin
if(copy(tmp,4,4) = '0000') then
begin
fmt := 'YYYY';
dateStr := ' <20> Exact date is unknown';
end
else
if(copy(tmp,6,2) = '00') then
begin
fmt := 'MMMM, YYYY';
dateStr := ' <20> Exact date is unknown';
end
else
fmt := 'MMMM D, YYYY';
if dateStr = '' then Result := FormatFMDateTimeStr(fmt, tmp)
else Result := FormatFMDateTimeStr(fmt, tmp) + ' ' + dateStr;
end;
end;
except
on EConvertError do
Result := tmp
else
raise;
end;
end;
ptPrimaryDiag, ptAdd2PL, ptContraindicated:
if(tmp = '1') then
Result := ' ';
ptVisitLocation:
if(StrToIntDef(tmp, 0) = 0) then
begin
if(tmp <> '0') then
Result := tmp;
end
else
begin
Result := GetPCEDisplayText(tmp, ComboPromptTags[pt]);
end;
ptWHPapResult:
begin
if Fparent.WHResultChk='N' then Result := 'NEM (No Evidence of Malignancy)';
if Fparent.WHResultChk='A' then Result := 'Abnormal';
if Fparent.WHResultChk='U' then Result := 'Unsatisfactory for Diagnosis';
if FParent.WHResultChk='' then Result := '';
end;
ptWHNotPurp:
begin
if FParent.WHResultNot <> '' then
begin
WHValue := FParent.WHResultNot;
//IF Forced = false then
//begin
if WHValue <> 'CPRS' then
begin
for cnt := 1 to Length(WHValue) do
begin
if Result ='' then
begin
if WHValue[cnt]='L' then Result := 'Letter';
if WHValue[cnt]='I' then Result := 'In-Person';
if WHValue[cnt]='P' then Result := 'Phone Call';
end
else
begin
if (WHValue[cnt]='L')and(Pos('Letter',Result)=0) then Result := Result+'; Letter';
if (WHValue[cnt]='I')and(Pos('In-Person',Result)=0) then Result := Result+'; In-Person';
if (WHValue[cnt]='P')and(Pos('Phone Call',Result)=0) then Result := Result+'; Phone Call';
end;
end;
end;
end
else
if Forced = true then
begin
if pos(':',Piece(FRec4,U,6))=0 then
begin
if Piece(FRec4,U,6)='L' then
begin
Result := 'Letter';
FParent.WHResultNot :='L';
end;
if Piece(FRec4,U,6)='I' then
begin
Result := 'In-Person';
FParent.WHResultNot := 'I';
end;
if Piece(FRec4,U,6)='P' then
begin
Result := 'Phone Call';
FParent.WHResultNot := 'P';
end;
if Piece(FRec4,U,6)='CPRS' then
begin
Result := '';
FParent.WHResultNot := 'CPRS';
end;
end
else
begin
WHValue := Piece(FRec4,U,6);
for cnt := 0 to Length(WHValue) do
begin
if Result ='' then
begin
if WHValue[cnt]='L' then
begin
Result := 'Letter';
FParent.WHResultNot := WHValue[cnt];
end;
if WHValue[cnt]='I' then
begin
Result := 'In-Person';
FParent.WHResultNot := WHValue[cnt];
end;
if WHValue[cnt]='P' then
begin
Result := 'Phone Call';
FParent.WHResultNot := WHValue[cnt];
end;
end
else
begin
if (WHValue[cnt]='L')and(Pos('Letter',Result)=0) then
begin
Result := Result +'; Letter';
FParent.WHResultNot := FParent.WHResultNot + ':' + WHValue[cnt];
end;
if (WHValue[cnt]='I')and(Pos('In-Person',Result)=0) then
begin
Result := Result +'; In-Person';
FParent.WHResultNot := FParent.WHResultNot + ':' + WHValue[cnt];
end;
if (WHValue[cnt]='P')and(Pos('Phone Call',Result)=0) then
begin
Result := Result +'; Phone Call';
FParent.WHResultNot := FParent.WHResultNot + ':' + WHValue[cnt];
end;
end;
end;
end;
end
else
Result := '';
end;
ptExamResults, ptSkinResults, ptLevelSeverity,
ptSeries, ptReaction, ptLevelUnderstanding:
begin
Result := tmp;
if(Piece(Result,U,1) = '@') then
Result := ''
else
Result := GetPCEDisplayText(tmp, ComboPromptTags[pt]);
end;
else
begin
if pt = ptDataList then
begin
if(assigned(FData) and assigned(FData.FChoices)) then
begin
if not(assigned(FData.FChoicesActiveDates)) then
for i := 0 to FData.FChoices.Count - 1 do
begin
if(copy(tmp,i+1,1) = '1') then
begin
if (Result <> '') then
Result := Result + ', ';
Result := Result + Piece(FData.FChoices[i],U,12);
end;
end
else {if there are active dates for each choice then check them}
begin
if Self.FParent.Historical then
EncDt := DateTimeToFMDateTime(Date)
else
EncDt := RemForm.PCEObj.VisitDateTime;
k := 0;
for i := 0 to FData.FChoices.Count - 1 do
begin
for j := 0 to (TStringList(FData.FChoicesActiveDates[i]).Count - 1) do
begin
ActDt := StrToIntDef((Piece(TStringList(FData.FChoicesActiveDates[i]).Strings[j], ':', 1)),0);
InActDt := StrToIntDef((Piece(TStringList(FData.FChoicesActiveDates[i]).Strings[j], ':', 2)),9999999);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
begin
if(copy(tmp,k+1,1) = '1') then
begin
if(Result <> '') then
Result := Result + ', ';
Result := Result + Piece(FData.FChoices[i],U,12);
end;
inc(k);
end; {ActiveDate check}
end; {FChoicesActiveDates.Items[i] loop}
end; {FChoices loop}
end;
end;
end
else
if pt = ptVitalEntry then
begin
Result := VitalValue;
if(Result <> '') then
Result := ConvertVitalData(Result, VitalType, VitalUnitValue);
end
else
if pt = ptMHTest then
Result := FMiscText
else
if (pt = ptGAF) and (MHDLLFound = false) then
begin
if(StrToIntDef(Piece(tmp, U, 1),0) <> 0) then
begin
Result := tmp;
end
end
else
if pt = ptMHTest then
Result := FMiscText;
(*
GafDate := Trunc(FParent.FReminder.PCEDataObj.VisitDateTime);
ValidateGAFDate(GafDate);
Result := tmp + CRCode + 'Date Determined: ' + FormatFMDateTime('mm/dd/yyyy', GafDate) +
CRCode + 'Determined By: ' + FParent.FReminder.PCEDataObj.Providers.PCEProviderName;
*)
//end;
end;
end;
end;
if(Result <> '') and (Caption <> '') then
Result := Trim(Caption + ' ' + Trim(Result));
//end;
end;
function TRemPrompt.CanShare(Prompt: TRemPrompt): boolean;
var
pt: TRemPromptType;
begin
if(Forced or Prompt.Forced or Prompt.FIsShared or Required or Prompt.Required) then
Result := FALSE
else
begin
pt := PromptType;
Result := (pt = Prompt.PromptType);
if(Result) then
begin
if(pt in [ptAdd2PL, ptLevelUnderstanding]) or
((pt = ptComment) and (not FParent.FHasSubComments)) then
Result := ((Add2PN = Prompt.Add2PN) and
(Caption = Prompt.Caption))
else
Result := FALSE;
end;
end;
end;
destructor TRemPrompt.Destroy;
begin
KillObj(@FSharedChildren);
inherited;
end;
function TRemPrompt.RemDataActive(RData: TRemData; EncDt: TFMDateTime):Boolean;
var
ActDt, InActDt: Double;
j: integer;
begin
Result := FALSE;
if assigned(RData.FActiveDates) then
for j := 0 to (RData.FActiveDates.Count - 1) do
begin
ActDt := StrToIntDef(Piece(RData.FActiveDates[j],':',1), 0);
InActDt := StrToIntDef(Piece(RData.FActiveDates[j], ':', 2), 9999999);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
begin
Result := TRUE;
Break;
end;
end
else
Result := TRUE;
end;
function TRemPrompt.RemDataChoiceActive(RData: TRemData; j: integer; EncDt: TFMDateTime):Boolean;
var
ActDt, InActDt: Double;
i: integer;
begin
Result := FALSE;
If not assigned(RData.FChoicesActiveDates) then //if no active dates were sent
Result := TRUE //from the server then don't check dates
else {if there are active dates for each choice then check them}
begin
for i := 0 to (TStringList(RData.FChoicesActiveDates[j]).Count - 1) do
begin
ActDt := StrToIntDef((Piece(TStringList(RData.FChoicesActiveDates[j]).Strings[i], ':', 1)),0);
InActDt := StrToIntDef((Piece(TStringList(RData.FChoicesActiveDates[j]).Strings[i], ':', 2)),9999999);
if (EncDt >= ActDt) and (EncDt <= InActDt) then
begin
Result := True;
end; {Active date check}
end; {FChoicesActiveDates.Items[i] loop}
end {FChoicesActiveDates check}
end;
function TRemPrompt.GetValue: string;
//Returns TRemPrompt.FValue if this TRemPrompt is not a ptPrimaryDiag
//Returns 0-False or 1-True if this TRemPrompt is a ptPrimaryDiag
var
i, j, k: integer;
RData: TRemData;
Ok: boolean;
EncDt: TFMDateTime;
begin
OK := (Piece(FRec4, U, 4) = RemPromptCodes[ptPrimaryDiag]);
if(OK) and (assigned(FParent)) then
OK := (not FParent.Historical);
if OK then
begin
Ok := FALSE;
if(assigned(FParent) and assigned(FParent.FData)) then {If there's FData, see if}
begin {there's a primary diagnosis}
for i := 0 to FParent.FData.Count-1 do {if there is return True}
begin
EncDt := RemForm.PCEObj.VisitDateTime;
RData := TRemData(FParent.FData[i]);
if(RData.DataType = dtDiagnosis) then
begin
if(assigned(RData.FPCERoot)) and (RemDataActive(RData, EncDt)) then
Ok := (RData.FPCERoot = PrimaryDiagRoot)
else
if(assigned(RData.FChoices)) and (assigned(RData.FChoicePrompt)) then
begin
k := 0;
for j := 0 to RData.FChoices.Count-1 do
begin
if RemDataChoiceActive(RData, j, EncDt) then
begin
if(assigned(RData.FChoices.Objects[j])) and
(copy(RData.FChoicePrompt.FValue,k+1,1)='1') then
begin
if(TRemPCERoot(RData.FChoices.Objects[j]) = PrimaryDiagRoot) then
begin
Ok := TRUE;
break;
end;
end; //if FChoices.Objects (which is the RemPCERoot object) is assigned
inc(k);
end; //if FChoices[j] is active
end; //loop through FChoices
end; //If there are FChoices and an FChoicePrompt (i.e.: is this a ptDataList}
end;
if Ok then break;
end;
end;
Result := BOOLCHAR[Ok];
end
else
Result := FValue;
end;
procedure TRemPrompt.SetValue(Value: string);
var
pt: TRemPromptType;
i, j, k : integer;
RData: TRemData;
Primary, Done: boolean;
Tmp: string;
OK, NeedRefresh: boolean;
EncDt: TFMDateTime;
begin
NeedRefresh := (not FFromControl);
if(Forced and (not FFromParent)) then exit;
pt := PromptType;
if(pt = ptVisitDate) then
begin
if(Value = '') then
Value := '0'
else
begin
try
if(StrToFloat(Value) > FMToday) then
begin
Value := '0';
InfoBox('Can not enter a future date for a historical event.',
'Invalid Future Date', MB_OK + MB_ICONERROR);
end;
except
on EConvertError do
Value := '0'
else
raise;
end;
if(Value = '0') then
NeedRefresh := TRUE;
end;
end;
if(GetValue <> Value) or (FFromParent) then
begin
FValue := Value;
EncDt := RemForm.PCEObj.VisitDateTime;
if((pt = ptExamResults) and assigned(FParent) and assigned(FParent.FData) and
(FParent.FData.Count > 0) and assigned(FParent.FMSTPrompt)) then
begin
FParent.FMSTPrompt.SetValueFromParent(Value);
if (FParent.FMSTPrompt.FMiscText = '') then
// Assumes first finding item is MST finding
FParent.FMSTPrompt.FMiscText := TRemData(FParent.FData[0]).InternalValue;
end;
OK := (assigned(FParent) and assigned(FParent.FData) and
(Piece(FRec4, U, 4) = RemPromptCodes[ptPrimaryDiag]));
if (OK = false) and (Value = 'New MH dll') then OK := true;
if OK then
OK := (not FParent.Historical);
if OK then
begin
Done := FALSE;
Primary := (Value = BOOLCHAR[TRUE]);
for i := 0 to FParent.FData.Count-1 do
begin
RData := TRemData(FParent.FData[i]);
if(RData.DataType = dtDiagnosis) then
begin
if(assigned(RData.FPCERoot)) and (RemDataActive(RData, EncDt)) then
begin
if(Primary) then
begin
PrimaryDiagRoot := RData.FPCERoot;
Done := TRUE;
end
else
begin
if(PrimaryDiagRoot = RData.FPCERoot) then
begin
PrimaryDiagRoot := nil;
Done := TRUE;
end;
end;
end
else
if(assigned(RData.FChoices)) and (assigned(RData.FChoicePrompt)) then
begin
k := 0;
for j := 0 to RData.FChoices.Count-1 do
begin
if RemDataChoiceActive(RData, j, EncDt) then
begin
if(Primary) then
begin
if(assigned(RData.FChoices.Objects[j])) and
(copy(RData.FChoicePrompt.FValue,k+1,1)='1') then
begin
PrimaryDiagRoot := TRemPCERoot(RData.FChoices.Objects[j]);
Done := TRUE;
break;
end;
end
else
begin
if(assigned(RData.FChoices.Objects[j])) and
(PrimaryDiagRoot = TRemPCERoot(RData.FChoices.Objects[j])) then
begin
PrimaryDiagRoot := nil;
Done := TRUE;
break;
end;
end;
inc(k);
end;
end;
end;
end;
if Done then break;
end;
end;
if(assigned(FParent) and assigned(FParent.FData) and IsSyncPrompt(pt)) then
begin
for i := 0 to FParent.FData.Count-1 do
begin
RData := TRemData(FParent.FData[i]);
if(assigned(RData.FPCERoot)) and (RemDataActive(RData, EncDt)) then
RData.FPCERoot.Sync(Self);
if(assigned(RData.FChoices)) then
begin
for j := 0 to RData.FChoices.Count-1 do
begin
if(assigned(RData.FChoices.Objects[j])) and
RemDataChoiceActive(RData, j, EncDt) then
TRemPCERoot(RData.FChoices.Objects[j]).Sync(Self);
end;
end;
end;
end;
end;
if(not NeedRefresh) then
NeedRefresh := (GetValue <> Value);
if(NeedRefresh and assigned(FCurrentControl) and FParent.FReminder.Visible) then
begin
case pt of
ptComment:
(FCurrentControl as TEdit).Text := GetValue;
ptQuantity:
(FCurrentControl as TUpDown).Position := StrToIntDef(GetValue,1);
(* ptSkinReading:
(FCurrentControl as TUpDown).Position := StrToIntDef(GetValue,0); *)
ptVisitDate:
begin
try
(FCurrentControl as TORDateCombo).FMDate := StrToFloat(GetValue);
except
on EConvertError do
(FCurrentControl as TORDateCombo).FMDate := 0;
else
raise;
end;
end;
ptPrimaryDiag, ptAdd2PL, ptContraindicated:
(FCurrentControl as TORCheckBox).Checked := (GetValue = BOOLCHAR[TRUE]);
ptVisitLocation:
begin
Tmp := GetValue;
with (FCurrentControl as TORComboBox) do
begin
if(piece(Tmp,U,1)= '0') then
begin
Items[0] := Tmp;
SelectByID('0');
end
else
SelectByID(Tmp);
end;
end;
ptWHPapResult:
(FCurrentControl as TORCheckBox).Checked := (GetValue = BOOLCHAR[TRUE]);
ptWHNotPurp:
(FCurrentControl as TORCheckBox).Checked := (GetValue = BOOLCHAR[TRUE]);
ptExamResults, ptSkinResults, ptLevelSeverity,
ptSeries, ptReaction, ptLevelUnderstanding, ptSkinReading: //(AGP Change 26.1)
(FCurrentControl as TORComboBox).SelectByID(GetValue);
else
if(pt = ptVitalEntry) then
begin
if(FCurrentControl is TORComboBox) then
(FCurrentControl as TORComboBox).SelectByID(VitalValue)
else
if(FCurrentControl is TVitalEdit) then
begin
with (FCurrentControl as TVitalEdit) do
begin
Text := VitalValue;
if(assigned(LinkedCombo)) then
begin
Tmp := VitalUnitValue;
if(Tmp <> '') then
LinkedCombo.Text := VitalUnitValue
else
LinkedCombo.ItemIndex := 0;
end;
end;
end;
end;
end;
end;
end;
procedure TRemPrompt.SetValueFromParent(Value: string);
begin
FFromParent := TRUE;
try
SetValue(Value);
finally
FFromParent := FALSE;
end;
end;
procedure TRemPrompt.InitValue;
var
Value: string;
pt: TRemPromptType;
idx, i, j: integer;
TempSL: TORStringList;
Found: boolean;
RData: TRemData;
begin
Value := InternalValue;
pt := PromptType;
if(ord(pt) >= ord(low(TRemPromptType))) and (ComboPromptTags[pt] <> 0) then
begin
TempSL := TORStringList.Create;
try
GetPCECodes(TempSL, ComboPromptTags[pt]);
idx := TempSL.CaseInsensitiveIndexOfPiece(Value, U, 1);
if(idx < 0) then
idx := TempSL.CaseInsensitiveIndexOfPiece(Value, U, 2);
if(idx >= 0) then
Value := Piece(TempSL[idx],U,1);
finally
TempSL.Free;
end;
end;
if((not Forced) and assigned(FParent) and assigned(FParent.FData) and IsSyncPrompt(pt)) then
begin
Found := FALSE;
for i := 0 to FParent.FData.Count-1 do
begin
RData := TRemData(FParent.FData[i]);
if(assigned(RData.FPCERoot)) then
Found := RData.FPCERoot.GetValue(pt, Value);
if(not Found) and (assigned(RData.FChoices)) then
begin
for j := 0 to RData.FChoices.Count-1 do
begin
if(assigned(RData.FChoices.Objects[j])) then
begin
Found := TRemPCERoot(RData.FChoices.Objects[j]).GetValue(pt, Value);
if(Found) then break;
end;
end;
end;
if(Found) then break;
end;
end;
FInitializing := TRUE;
try
SetValueFromParent(Value);
finally
FInitializing := FALSE;
end;
end;
function TRemPrompt.ForcedCaption: string;
var
pt: TRemPromptType;
begin
Result := Caption;
if(Result = '') then
begin
pt := PromptType;
if(pt = ptDataList) then
begin
if(assigned(FData)) then
begin
if(FData.DataType = dtDiagnosis) then
Result := 'Diagnosis'
else
if(FData.DataType = dtProcedure) then
Result := 'Procedure';
end;
end
else
if(pt = ptVitalEntry) then
Result := VitalDesc[VitalType] + ':'
else
if(pt = ptMHTest) then
Result := 'Perform ' + FData.Narrative
else
if(pt = ptGAF) then
Result := 'GAF Score'
else
Result := PromptDescriptions[pt];
if(Result = '') then Result := 'Prompt';
end;
if(copy(Result,length(Result),1) = ':') then
delete(Result,length(Result),1);
end;
function TRemPrompt.VitalType: TVitalType;
begin
Result := vtUnknown;
if(assigned(FData)) then
Result := Code2VitalType(FData.InternalValue);
end;
procedure TRemPrompt.VitalVerify(Sender: TObject);
var
vEdt: TVitalEdit;
vCbo: TVitalComboBox;
AObj: TWinControl;
begin
if(Sender is TVitalEdit) then
begin
vEdt := TVitalEdit(Sender);
vCbo := vEdt.LinkedCombo;
end
else
if(Sender is TVitalComboBox) then
begin
vCbo := TVitalComboBox(Sender);
vEdt := vCbo.LinkedEdit;
end
else
begin
vCbo := nil;
vEdt := nil;
end;
AObj := Screen.ActiveControl;
if((not assigned(AObj)) or ((AObj <> vEdt) and (AObj <> vCbo))) then
begin
if(vEdt.Tag = TAG_VITHEIGHT) then
vEdt.Text := ConvertHeight2Inches(vEdt.Text);
if VitalInvalid(vEdt, vCbo) then
vEdt.SetFocus;
end;
end;
function TRemPrompt.VitalUnitValue: string;
var
vt: TVitalType;
begin
vt := VitalType;
if (vt in [vtTemp, vtHeight, vtWeight]) then
begin
Result := Piece(GetValue,';',2);
if(Result = '') then
begin
case vt of
vtTemp: Result := 'F';
vtHeight: Result := 'IN';
vtWeight: Result := 'LB';
end;
SetPiece(FValue, ';', 2, Result);
end;
end
else
Result := '';
end;
function TRemPrompt.VitalValue: string;
begin
Result := Piece(GetValue,';',1);
end;
procedure TRemPrompt.DoWHReport(Sender: TObject);
Var
comp, ien: string;
i: integer;
begin
for i := 0 to FParent.FData.Count-1 do
begin
comp:= Piece(TRemData(FParent.FData[i]).FRec3,U,4);
ien:= Piece(TRemData(FParent.FData[i]).FRec3,U,6);
end;
CallV('ORQQPXRM GET WH REPORT TEXT', [ien]);
ReportBox(RPCBrokerV.Results,'Procedure Report Results',True);
end;
procedure TRemPrompt.ViewWHText(Sender: TObject);
var
WHRecNum, WHTitle: string;
i: integer;
begin
for i := 0 to FParent.FData.Count-1 do
begin
if Piece(TRemData(FParent.FData[i]).FRec3,U,4)='WH' then
begin
WHRecNum:=(Piece(TRemData(FParent.FData[i]).FRec3,U,6));
WHTitle :=(Piece(TRemData(FParent.FData[i]).FRec3,U,8));
end;
end;
CallV('ORQQPXRM GET WH LETTER TEXT', [WHRecNum]);
ReportBox(RPCBrokerV.Results,'Women Health Notification Purpose: '+WHTitle,false);
end;
procedure TRemPrompt.DoMHTest(Sender: TObject);
var
TmpSL, tmpScores, tmpResults: TStringList;
i, TestComp: integer;
Before, After, Score: string;
MHRequired: boolean;
begin
TestComp := 0;
try
if (Sender is TCPRSDialogButton) then
(Sender as TCPRSDialogButton).Enabled := false;
if FParent.FReminder.MHTestArray = nil then FParent.FReminder.MHTestArray := TORStringList.Create;
if(MHTestAuthorized(FData.Narrative)) then
begin
FParent.FReminder.BeginTextChanged;
try
if(FParent.IncludeMHTestInPN) then
TmpSL := TStringList.Create
else
TmpSL := nil;
if Piece(self.FData.FRec3,U,13) = '1' then MHRequired := True
else MHRequired := false;
Before := GetValue;
After := PerformMHTest(Before, FData.Narrative, TmpSL, MHRequired);
if uinit.TimedOut then After := '';
if Piece(After, U, 1) = 'New MH dll' then
begin
if Piece(After,U,2)='COMPLETE' then
begin
FParent.FReminder.MHTestArray.Add(FData.Narrative + U + FParent.FReminder.IEN);
self.FMHTestComplete := 1;
Score := Piece(After,U,3);
if FParent.ResultDlgID <> '' then
begin
tmpScores := TStringList.Create;
tmpResults := TStringList.Create;
PiecestoList(copy(score,2,Length(score)),'*',tmpScores);
PiecestoList(FParent.ResultDlgID,'~',tmpResults);
GetMHResultText(FMiscText, tmpResults, tmpScores);
if tmpScores <> nil then tmpScores.Free;
if tmpResults <> nil then tmpResults.Free;
end;
if (FMiscText <> '') then FMiscText := FMiscText + '~<br>';
if tmpSL <> nil then
begin
for i := 0 to TmpSL.Count-1 do
begin
if(i > 0) then FMiscText := FMiscText + CRCode;
FMiscText := FMiscText + TmpSL[i];
end;
end;
//end;
//ExpandTIUObjects(FMiscText);
end
else if Piece(After,U,2)='INCOMPLETE' then
begin
FParent.FReminder.MHTestArray.Add(FData.Narrative + U + FParent.FReminder.IEN);
self.FMHTestComplete := 2;
FMiscText := '';
After := 'X';
end
else if Piece(After,U,2)='CANCELLED' then
begin
self.FMHTestComplete := 0;
FMiscText := '';
After := '';
end;
SetValue(After);
exit;
end;
if pos(U,After)>0 then
begin
TestComp := StrtoInt(Piece(After,U,2));
self.FMHTestComplete := TestComp;
After := Piece(After,U,1);
end;
if(Before <> After) and (not uInit.TimedOut) then
begin
if(After = '') or (FParent.ResultDlgID = '') then
FMiscText := ''
else
if TestComp > 0 then
begin
MentalHealthTestResults(FMiscText, FParent.ResultDlgID, FData.Narrative,
FParent.FReminder.FPCEDataObj.Providers.PCEProvider, After);
if(assigned(TmpSL) and (TmpSL.Count > 0)) then
begin
if(FMiscText <> '') then
FMiscText := FMiscText + CRCode + CRCode;
for i := 0 to TmpSL.Count-1 do
begin
if(i > 0) then
FMiscText := FMiscText + CRCode + CRCode;
FMiscText := FMiscText + TmpSL[i];
end;
end;
ExpandTIUObjects(FMiscText);
end;
SetValue(After);
end;
finally
if not uInit.TimedOut then
FParent.FReminder.EndTextChanged(Sender);
end;
if not uInit.TimedOut then
if(FParent.ElemType = etDisplayOnly) and (not assigned(FParent.FParent)) then
RemindersInProcess.Notifier.Notify;
end
else
InfoBox('Not Authorized to score the ' + FData.Narrative + ' test.',
'Insufficient Authorization', MB_OK + MB_ICONERROR);
finally
if (Sender is TCPRSDialogButton) then
begin
(Sender as TCPRSDialogButton).Enabled := true;
(Sender as TCPRSDialogButton).SetFocus;
end;
end;
end;
procedure TRemPrompt.GAFHelp(Sender: TObject);
begin
inherited;
GotoWebPage(GAFURL);
end;
function TRemPrompt.EntryID: string;
begin
Result := FParent.EntryID + '/' + IntToStr(integer(Self));
end;
procedure TRemPrompt.EditKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = '?') and (Sender is TCustomEdit) and
((TCustomEdit(Sender).Text = '') or (TCustomEdit(Sender).SelStart = 0)) then
Key := #0;
end;
{ TRemPCERoot }
destructor TRemPCERoot.Destroy;
begin
KillObj(@FData);
KillObj(@FForcedPrompts);
inherited;
end;
procedure TRemPCERoot.Done(Data: TRemData);
var
i, idx: integer;
begin
if(assigned(FForcedPrompts) and assigned(Data.FParent) and
assigned(Data.FParent.FPrompts)) then
begin
for i := 0 to Data.FParent.FPrompts.Count-1 do
UnSync(TRemPrompt(Data.FParent.FPrompts[i]));
end;
FData.Remove(Data);
if(FData.Count <= 0) then
begin
idx := PCERootList.IndexOfObject(Self);
// if(idx < 0) then
// idx := PCERootList.IndexOf(FID);
if(idx >= 0) then
PCERootList.Delete(idx);
if PrimaryDiagRoot = Self then
PrimaryDiagRoot := nil;
Free;
end;
end;
class function TRemPCERoot.GetRoot(Data: TRemData; Rec3: string;
Historical: boolean): TRemPCERoot;
var
DID: string;
Idx: integer;
obj: TRemPCERoot;
begin
if(Data.DataType = dtVitals) then
DID := 'V' + Piece(Rec3, U, 6)
else
begin
if(Historical) then
begin
inc(HistRootCount);
DID := IntToStr(HistRootCount);
end
else
DID := '0';
DID := DID + U +
Piece(Rec3, U, r3Type) + U +
Piece(Rec3, U, r3Code) + U +
Piece(Rec3, U, r3Cat) + U +
Piece(Rec3, U, r3Nar);
end;
idx := -1;
if(not assigned(PCERootList)) then
PCERootList := TStringList.Create
else
if(PCERootList.Count > 0) then
idx := PCERootList.IndexOf(DID);
if(idx < 0) then
begin
obj := TRemPCERoot.Create;
try
obj.FData := TList.Create;
obj.FID := DID;
idx := PCERootList.AddObject(DID, obj);
except
obj.Free;
raise;
end;
end;
Result := TRemPCERoot(PCERootList.Objects[idx]);
Result.FData.Add(Data);
end;
function TRemPCERoot.GetValue(PromptType: TRemPromptType; var NewValue: string): boolean;
var
ptS: string;
i: integer;
begin
ptS := char(ord('D') + ord(PromptType));
i := pos(ptS, FValueSet);
if(i = 0) then
Result := FALSE
else
begin
NewValue := Piece(FValue, U, i);
Result := TRUE;
end;
end;
procedure TRemPCERoot.Sync(Prompt: TRemPrompt);
var
i, j: integer;
RData: TRemData;
Prm: TRemPrompt;
pt: TRemPromptType;
ptS, Value: string;
begin
// if(assigned(Prompt.FParent) and ((not Prompt.FParent.FChecked) or
// (Prompt.FParent.ElemType = etDisplayOnly))) then exit;
if(assigned(Prompt.FParent) and (not Prompt.FParent.FChecked)) then exit;
pt := Prompt.PromptType;
Value := Prompt.GetValue;
if(Prompt.Forced) then
begin
if(not Prompt.FInitializing) then
begin
if(not assigned(FForcedPrompts)) then
FForcedPrompts := TStringList.Create;
if(FForcedPrompts.IndexOfObject(Prompt) < 0) then
begin
for i := 0 to FForcedPrompts.Count-1 do
begin
Prm := TRemPrompt(FForcedPrompts.Objects[i]);
if(pt = Prm.PromptType) and (FForcedPrompts[i] <> Value) and (Prm.FParent.IsChecked) then
raise EForcedPromptConflict.Create('Forced Value Error:' + CRLF + CRLF +
Prompt.ForcedCaption + ' is already being forced to another value.');
end;
FForcedPrompts.AddObject(Value, Prompt);
end;
end;
end
else
begin
if(assigned(FForcedPrompts)) then
begin
for i := 0 to FForcedPrompts.Count-1 do
begin
Prm := TRemPrompt(FForcedPrompts.Objects[i]);
if(pt = Prm.PromptType) and (FForcedPrompts[i] <> Value) and (Prm.FParent.IsChecked) then
begin
Prompt.SetValue(FForcedPrompts[i]);
if(assigned(Prompt.FParent)) then
Prompt.FParent.cbClicked(nil); // Forces redraw
exit;
end;
end;
end;
end;
if(Prompt.FInitializing) then exit;
for i := 0 to FData.Count-1 do
inc(TRemData(FData[i]).FSyncCount);
ptS := char(ord('D') + ord(pt));
i := pos(ptS, FValueSet);
if(i = 0) then
begin
FValueSet := FValueSet + ptS;
i := length(FValueSet);
end;
SetPiece(FValue, U, i, Value);
for i := 0 to FData.Count-1 do
begin
RData := TRemData(FData[i]);
if(RData.FSyncCount = 1) and (assigned(RData.FParent)) and
(assigned(RData.FParent.FPrompts)) then
begin
for j := 0 to RData.FParent.FPrompts.Count-1 do
begin
Prm := TRemPrompt(RData.FParent.FPrompts[j]);
if(Prm <> Prompt) and (pt = Prm.PromptType) and (not Prm.Forced) then
Prm.SetValue(Prompt.GetValue);
end;
end;
end;
for i := 0 to FData.Count-1 do
begin
RData := TRemData(FData[i]);
if(RData.FSyncCount > 0) then
dec(RData.FSyncCount);
end;
end;
procedure TRemPCERoot.UnSync(Prompt: TRemPrompt);
var
idx: integer;
begin
if(assigned(FForcedPrompts) and Prompt.Forced) then
begin
idx := FForcedPrompts.IndexOfObject(Prompt);
if(idx >= 0) then
FForcedPrompts.Delete(Idx);
end;
end;
initialization
InitReminderObjects;
finalization
FreeReminderObjects;
end.