Further refactoring of the item_banking units. Remove the overloads from matrixlib writing reports to OutputFrm.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7456 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-05-14 19:56:00 +00:00
parent 52f150f6a9
commit fac710ba0c
7 changed files with 256 additions and 414 deletions

View File

@ -73,7 +73,6 @@ procedure TCodesForm.DisplayBtnClick(Sender: TObject);
var var
currentno: integer; currentno: integer;
i: integer; i: integer;
outline: string;
lReport: TStrings; lReport: TStrings;
begin begin
lReport := TStringList.Create; lReport := TStringList.Create;

View File

@ -246,7 +246,6 @@ end;
procedure TMCItemForm.CodeBrowseBtnClick(Sender: TObject); procedure TMCItemForm.CodeBrowseBtnClick(Sender: TObject);
var var
i: integer; i: integer;
outline: string;
nochoices: integer; nochoices: integer;
lReport: TStrings; lReport: TStrings;
begin begin

View File

@ -186,7 +186,24 @@ object TestSpecsForm: TTestSpecsForm
BorderSpacing.Right = 8 BorderSpacing.Right = 8
BevelOuter = bvNone BevelOuter = bvNone
BorderStyle = bsSingle BorderStyle = bsSingle
ClientHeight = 459
ClientWidth = 725
TabOrder = 6 TabOrder = 6
OnPaint = Panel1Paint
object Memo: TMemo
Left = 4
Height = 451
Top = 4
Width = 717
Align = alClient
BorderSpacing.Around = 4
Font.Height = -13
Font.Name = 'Courier New'
Font.Pitch = fpFixed
Font.Quality = fqDraft
ParentFont = False
TabOrder = 0
end
end end
object SelectItemBtn: TButton object SelectItemBtn: TButton
AnchorSideLeft.Control = Panel1 AnchorSideLeft.Control = Panel1

View File

@ -14,6 +14,7 @@ type
TTestSpecsForm = class(TForm) TTestSpecsForm = class(TForm)
GroupBox1: TGroupBox; GroupBox1: TGroupBox;
Memo: TMemo;
NoItemsEdit: TEdit; NoItemsEdit: TEdit;
Label8: TLabel; Label8: TLabel;
SelectedEdit: TEdit; SelectedEdit: TEdit;
@ -42,14 +43,15 @@ type
ReturnBtn: TButton; ReturnBtn: TButton;
SaveDialog1: TSaveDialog; SaveDialog1: TSaveDialog;
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure Panel1Paint(Sender: TObject);
procedure ReturnBtnClick(Sender: TObject); procedure ReturnBtnClick(Sender: TObject);
procedure SelectItemBtnClick(Sender: TObject); procedure SelectItemBtnClick(Sender: TObject);
procedure SelectChoiceBoxItemClick(Sender: TObject; Index: integer); procedure SelectChoiceBoxItemClick(Sender: TObject; Index: integer);
procedure SkipBtnClick(Sender: TObject); procedure SkipBtnClick(Sender: TObject);
procedure ShowMCItem(Sender: TObject; index : integer); procedure ShowMCItem(AIndex: integer);
procedure ShowTFItem(Sender: TObject; index : integer); procedure ShowTFItem(AIndex: integer);
procedure ShowEssayItem(Sender: TObject; index : integer); procedure ShowEssayItem(AIndex: integer);
procedure ShowMatchItem(Sender: TObject; index : integer); procedure ShowMatchItem(AIndex: integer);
private private
{ private declarations } { private declarations }
public public
@ -90,50 +92,70 @@ begin
NoItemsEdit.Text := '0'; NoItemsEdit.Text := '0';
end; end;
procedure TTestSpecsForm.Panel1Paint(Sender: TObject);
begin
//
end;
procedure TTestSpecsForm.SelectChoiceBoxItemClick(Sender: TObject; Index: integer); procedure TTestSpecsForm.SelectChoiceBoxItemClick(Sender: TObject; Index: integer);
var var
nomc, notf, nomatch, noessay, i : integer; //nomc, notf, nomatch, noessay, i : integer;
response : string; //response: string;
i, response: Integer;
begin begin
nomc := StrToInt(MCNoEdit.Text); //nomc := StrToInt(MCNoEdit.Text);
notf := StrToInt(TFNoEdit.Text); //notf := StrToInt(TFNoEdit.Text);
nomatch := StrToInt(MatchNoEdit.Text); //nomatch := StrToInt(MatchNoEdit.Text);
noessay := StrToInt(EssayNoEdit.Text); //noessay := StrToInt(EssayNoEdit.Text);
case Index of case Index of
0 : begin // Select multiple choice items 0 : begin // Select multiple choice items
SelectedEdit.Text := 'MC'; SelectedEdit.Text := 'MC';
for i := 1 to nomc do for i := 1 to StrToInt(MCNoEdit.Text) do
begin begin
ShowMCItem(self,i); ShowMCItem(i);
response := InputBox('Add item to test','Add?','Y'); response := MessageDlg('Add item to test?', mtConfirmation, [mbYes, mbNo], 0);
if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self); if response = mrYes then SelectItemBtnClick(self) else SkipBtnClick(self);
//response := InputBox('Add item to test','Add?','Y');
//if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self);
end; end;
end; end;
1 : begin // Select true or false items 1 : begin // Select true or false items
SelectedEdit.Text := 'TF'; SelectedEdit.Text := 'TF';
for i := 1 to notf do for i := 1 to StrToInt(TFNoEdit.Text) do
begin begin
ShowTFItem(self,i); ShowTFItem(i);
response := MessageDlg('Add item to test?', mtConfirmation, [mbYes, mbNo], 0);
if response = mrYes then SelectItemBtnclick(self) else SkipBtnClick(self);
{
response := InputBox('Add item to test','Add?','Y'); response := InputBox('Add item to test','Add?','Y');
if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self); if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self);
}
end; end;
end; end;
2 : begin // Select Essay items 2 : begin // Select Essay items
SelectedEdit.Text := 'Essay'; SelectedEdit.Text := 'Essay';
for i := 1 to noessay do for i := 1 to StrToInt(EssayNoEdit.Text) do
begin begin
ShowEssayItem(self,i); ShowEssayItem(i);
response := MessageDlg('Add item to test?', mtConfirmation, [mbYes, mbNo], 0);
if response = mrYes then selectItemBtnClick(self) else SkipBtnClick(self);
{
response := InputBox('Add item to test','Add?','Y'); response := InputBox('Add item to test','Add?','Y');
if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self); if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self);
}
end; end;
end; end;
3 : begin // Select matching items 3 : begin // Select matching items
SelectedEdit.Text := 'Matching'; SelectedEdit.Text := 'Matching';
for i := 1 to nomc do for i := 1 to StrToInt(MatchNoEdit.Text) do // was: "nomc", should probably be "nomatch"
begin begin
ShowMatchItem(self,i); ShowMatchItem(i);
response := MessageDlg('Add item to test?', mtConfirmation, [mbYes, mbNo], 0);
if response = mrYes then SelectItemBtnClick(self) else SkipBtnClick(self);
{
response := InputBox('Add item to test','Add?','Y'); response := InputBox('Add item to test','Add?','Y');
if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self); if response = 'Y' then SelectItemBtnClick(self) else SkipBtnClick(self);
}
end; end;
end; end;
end; end;
@ -144,159 +166,90 @@ begin
ShowMessage('Item skipped'); ShowMessage('Item skipped');
end; end;
// ToDoo: This must be moved to OnPaint handler. procedure TTestSpecsForm.ShowMCItem(AIndex : integer);
procedure TTestSpecsForm.ShowMCItem(Sender: TObject; index : integer);
var var
outline: string;
nochoices: integer; nochoices: integer;
space: integer;
begin begin
Panel1.Canvas.Clear; ItemNoEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[AIndex].itemnumber);
space := Panel1.Canvas.Height div 9; MajorCodeEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[AIndex].MajorCode);
ItemNoEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[index].itemnumber); MinorCodeEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[AIndex].MinorCode);
MajorCodeEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[index].MajorCode);
MinorCodeEdit.Text := IntToStr(ItemBankFrm.MCItemInfo[index].MinorCode);
outline := ItemBankFrm.MCItemInfo[index].ItemStem; Memo.Lines.Clear;
Panel1.Canvas.TextOut(1, space, outline); Memo.Lines.Add(ItemBankFrm.MCItemInfo[AIndex].ItemStem);
nochoices := ItemBankFrm.MCItemInfo[index].NoChoices ; nochoices := ItemBankFrm.MCItemInfo[AIndex].NoChoices ;
if nochoices > 0 then if nochoices > 0 then
begin Memo.Lines.Add(Format('Choice A %s', [ItemBankFrm.MCItemInfo[AIndex].ChoiceOne]));
outline := Format('Choice A %s', [ItemBankFrm.MCItemInfo[index].ChoiceOne]);
Panel1.Canvas.TextOut(1, space*2, outline);
end;
if nochoices > 1 then if nochoices > 1 then
begin Memo.Lines.Add(Format('Choice B %s', [ItemBankFrm.MCItemInfo[AIndex].ChoiceTwo]));
outline := Format('Choice B %s', [ItemBankFrm.MCItemInfo[index].ChoiceTwo]);
Panel1.Canvas.TextOut(1, space*3, outline);
end;
if nochoices > 2 then if nochoices > 2 then
begin Memo.Lines.Add(Format('Choice C %s', [ItemBankFrm.MCItemInfo[AIndex].ChoiceThree]));
outline := Format('Choice C %s', [ItemBankFrm.MCItemInfo[index].ChoiceThree]);
Panel1.Canvas.TextOut(1, space*4, outline);
end;
if nochoices > 3 then if nochoices > 3 then
begin Memo.Lines.Add(Format('Choice D %s', [ItemBankFrm.MCItemInfo[AIndex].ChoiceFour]));
outline := Format('Choice D %s', [ItemBankFrm.MCItemInfo[index].ChoiceFour]);
Panel1.Canvas.TextOut(1, space*5, outline);
end;
if nochoices > 4 then if nochoices > 4 then
begin Memo.Lines.Add(Format('Choice E %s', [ItemBankFrm.MCItemInfo[AIndex].ChoiceFive]));
outline := Format('Choice E %s', [ItemBankFrm.MCItemInfo[index].ChoiceFive]); Memo.Lines.Add(Format('Correct Choice %s', [ItemBankFrm.MCItemInfo[AIndex].CorrectChoice]));
Panel1.Canvas.TextOut(1, space*6, outline); Memo.Lines.Add(Format('Graphic Image %s', [ItemBankFrm.MCItemInfo[AIndex].PicName]));
end;
outline := Format('Correct Choice %s', [ItemBankFrm.MCItemInfo[index].CorrectChoice]);
Panel1.Canvas.TextOut(1, space*7, outline);
outline := Format('Graphic Image %s', [ItemBankFrm.MCItemInfo[index].PicName]);
Panel1.Canvas.TextOut(1, space*8, outline);
end; end;
// ToDoo: This must be moved to OnPaint handler. procedure TTestSpecsForm.ShowTFItem(AIndex : integer);
procedure TTestSpecsForm.ShowTFItem(Sender: TObject; index : integer);
var
outline: string;
space: integer;
begin begin
Panel1.Canvas.Clear; ItemNoEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[AIndex].itemnumber);
space := Panel1.Canvas.Height div 9; MajorCodeEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[AIndex].MajorCode);
ItemNoEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[index].itemnumber); MinorCodeEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[AIndex].MinorCode);
MajorCodeEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[index].MajorCode);
MinorCodeEdit.Text := IntToStr(ItemBankFrm.TFItemInfo[index].MinorCode); Memo.Lines.Clear;
Panel1.Canvas.TextOut(1,space,ItemBankFrm.TFItemInfo[index].ItemStem); Memo.Lines.Add(ItemBankFrm.TFItemInfo[AIndex].ItemStem);
Panel1.Canvas.TextOut(1,space*2,ItemBankFrm.TFItemInfo[index].CorrectChoice); Memo.Lines.Add(ItemBankFrm.TFItemInfo[AIndex].CorrectChoice);
Panel1.Canvas.TextOut(1,space*3,ItemBankFrm.TFItemInfo[index].PicName); Memo.Lines.Add(ItemBankFrm.TFItemInfo[AIndex].PicName);
end; end;
// ToDo: This must be moved to OnPaint handler procedure TTestSpecsForm.ShowEssayItem(AIndex : integer);
procedure TTestSpecsForm.ShowEssayItem(Sender: TObject; index : integer);
var
outline: string;
space: integer;
begin begin
Panel1.Canvas.Clear; ItemNoEdit.Text := IntToStr(ItemBankFrm.EssayInfo[AIndex].itemnumber);
space := Panel1.Canvas.Height div 9; MajorCodeEdit.Text := IntToStr(ItemBankFrm.EssayInfo[AIndex].MajorCode);
ItemNoEdit.Text := IntToStr(ItemBankFrm.EssayInfo[index].itemnumber); MinorCodeEdit.Text := IntToStr(ItemBankFrm.EssayInfo[AIndex].MinorCode);
MajorCodeEdit.Text := IntToStr(ItemBankFrm.EssayInfo[index].MajorCode);
MinorCodeEdit.Text := IntToStr(ItemBankFrm.EssayInfo[index].MinorCode); Memo.Lines.Clear;
Panel1.Canvas.TextOut(1, space, ItemBankFrm.EssayInfo[index].ItemStem); Memo.Lines.Add(ItemBankFrm.EssayInfo[Aindex].ItemStem);
Panel1.Canvas.TextOut(1, space*2, ItemBankFrm.EssayInfo[index].Answer); Memo.Lines.Add(ItemBankFrm.EssayInfo[AIndex].Answer);
Panel1.Canvas.TextOut(1, space*3, ItemBankFrm.EssayInfo[index].PicName); Memo.Lines.Add(ItemBankFrm.EssayInfo[AIndex].PicName);
end; end;
// ToDo: This must be moved to OnPaint handler procedure TTestSpecsForm.ShowMatchItem(AIndex : integer);
procedure TTestSpecsForm.ShowMatchItem(Sender: TObject; index : integer);
var var
outline: string;
space: integer;
noleft, noright: integer; noleft, noright: integer;
begin begin
Panel1.Canvas.Clear; noleft := ItemBankFrm.MatchInfo[AIndex].NLeft;
noleft := ItemBankFrm.MatchInfo[index].NLeft; noright := ItemBankFrm.MatchInfo[AIndex].NRight;
noright := ItemBankFrm.MatchInfo[index].NRight; ItemNoEdit.Text := IntToStr(ItemBankFrm.MatchInfo[AIndex].itemnumber);
space := Panel1.Canvas.Height div 13; MajorCodeEdit.Text := IntToStr(ItemBankFrm.MatchInfo[AIndex].MajorCode);
ItemNoEdit.Text := IntToStr(ItemBankFrm.MatchInfo[index].itemnumber); MinorCodeEdit.Text := IntToStr(ItemBankFrm.MatchInfo[AIndex].MinorCode);
MajorCodeEdit.Text := IntToStr(ItemBankFrm.MatchInfo[index].MajorCode);
MinorCodeEdit.Text := IntToStr(ItemBankFrm.MatchInfo[index].MinorCode);
// do left and right stems // do left and right stems
Memo.Lines.Clear;
if noleft > 0 then if noleft > 0 then
begin Memo.Lines.Add(Format('Left Item 1 %s', [ItemBankFrm.MatchInfo[AIndex].Left1]));
outline := Format('Left Item 1 %s', [ItemBankFrm.MatchInfo[index].Left1]);
Panel1.Canvas.TextOut(1, space, outline);
end;
if noright > 0 then if noright > 0 then
begin Memo.Lines.Add(Format(' Right Item 1 %s', [ItemBankFrm.MatchInfo[AIndex].Right1]));
outline := Format(' Right Item 1 %s', [ItemBankFrm.MatchInfo[index].Right1]);
Panel1.Canvas.TextOut(1, space*2, outline);
end;
if noleft > 1 then if noleft > 1 then
begin Memo.Lines.Add(Format('Left Item 2 %s', [ItemBankFrm.MatchInfo[AIndex].Left2]));
outline := Format('Left Item 2 %s', [ItemBankFrm.MatchInfo[index].Left2]);
Panel1.Canvas.TextOut(1, space*3, outline);
end;
if noright > 1 then if noright > 1 then
begin Memo.Lines.Add(Format(' Right Item 2 %s', [ItemBankFrm.MatchInfo[AIndex].Right2]));
outline := Format(' Right Item 2 %s', [ItemBankFrm.MatchInfo[index].Right2]);
Panel1.Canvas.TextOut(1, space*4, outline);
end;
if noleft > 2 then if noleft > 2 then
begin Memo.Lines.Add(Format('Left Item 3 %s', [ItemBankFrm.MatchInfo[AIndex].Left3]));
outline := Format('Left Item 3 %s', [ItemBankFrm.MatchInfo[index].Left3]);
Panel1.Canvas.TextOut(1, space*5, outline);
end;
if noright > 2 then if noright > 2 then
begin Memo.Lines.Add(Format(' Right Item 3 %s', [ItemBankFrm.MatchInfo[AIndex].Right3]));
outline := Format(' Right Item 3 %s', [ItemBankFrm.MatchInfo[index].Right3]);
Panel1.Canvas.TextOut(1, space*6, outline);
end;
if noleft > 3 then if noleft > 3 then
begin Memo.Lines.Add(Format('Left Item 4 %s', [ItemBankFrm.MatchInfo[AIndex].Left4]));
outline := Format('Left Item 4 %s', [ItemBankFrm.MatchInfo[index].Left4]);
Panel1.Canvas.TextOut(1, space*7, outline);
end;
if noright > 3 then if noright > 3 then
begin Memo.Lines.Add(Format(' Right Item 4 %s', [ItemBankFrm.MatchInfo[AIndex].Right4]));
outline := Format(' Right Item 4 %s', [ItemBankFrm.MatchInfo[index].Right4]);
Panel1.Canvas.TextOut(1, space*8, outline);
end;
if noleft > 4 then if noleft > 4 then
begin Memo.Lines.Add(Format('Left Item 5 %s', [ItemBankFrm.MatchInfo[AIndex].Left5]));
outline := Format('Left Item 5 %s', [ItemBankFrm.MatchInfo[index].Left5]);
Panel1.Canvas.TextOut(1, space*9, outline);
end;
if noright > 4 then if noright > 4 then
begin Memo.Lines.Add(Format(' Right Item 5 %s', [ItemBankFrm.MatchInfo[AIndex].Right5]));
outline := Format(' Right Item 5 %s', [ItemBankFrm.MatchInfo[index].Right5]); Memo.Lines.Add(ItemBankFrm.MatchInfo[AIndex].CorrectChoice);
Panel1.Canvas.TextOut(1, space*10, outline); Memo.Lines.Add(ItemBankFrm.MatchInfo[AIndex].PicName);
end;
Panel1.Canvas.TextOut(1, space*11, ItemBankFrm.MatchInfo[index].CorrectChoice);
Panel1.Canvas.TextOut(1, space*12, ItemBankFrm.MatchInfo[index].PicName);
end; end;
initialization initialization

View File

@ -143,7 +143,6 @@ end;
procedure TTFItemForm.CodeBrowseBtnClick(Sender: TObject); procedure TTFItemForm.CodeBrowseBtnClick(Sender: TObject);
var var
i: integer; i: integer;
outline: string;
lReport: TStrings; lReport: TStrings;
begin begin
lReport := TStringList.Create; lReport := TStringList.Create;

View File

@ -84,32 +84,33 @@ type
procedure ResetBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject);
procedure ResponseScrollChange(Sender: TObject); procedure ResponseScrollChange(Sender: TObject);
procedure VarListSelectionChange(Sender: TObject; User: boolean); procedure VarListSelectionChange(Sender: TObject; User: boolean);
private private
{ private declarations } { private declarations }
FAutoSized: Boolean; FAutoSized: Boolean;
NoItems : integer; NoItems : integer;
NoSelected : integer; NoSelected : integer;
NCases : integer; // count of good records (not counting key if included) NCases : integer; // count of good records (not counting key if included)
ColNoSelected : IntDyneVec; ColNoSelected : IntDyneVec;
ColLabels, RowLabels : StrDyneVec; ColLabels, RowLabels : StrDyneVec;
Responses: array[1..5] of StrDyneVec; Responses: array[1..5] of StrDyneVec;
RespWghts: array[1..5] of DblDyneVec; RespWghts: array[1..5] of DblDyneVec;
Means, Variances, StdDevs : DblDyneVec; Means, Variances, StdDevs : DblDyneVec;
CorMat : DblDyneMat; // correlations among items and total score CorMat : DblDyneMat; // correlations among items and total score
Data : DblDyneMat; //store item scores and total score Data : DblDyneMat; //store item scores and total score
IDCol, FNameCol, LNameCol : integer; IDCol, FNameCol, LNameCol : integer;
MaxRespNo: integer; MaxRespNo: integer;
procedure ItemScores; procedure ItemScores;
procedure ScoreReport(AReport: TStrings); procedure ScoreReport(AReport: TStrings);
procedure Alpha(AReport: TStrings); procedure Alpha(AReport: TStrings);
procedure Cors(AReport: TStrings); procedure Cors(AReport: TStrings);
procedure SimMR(AReport: TStrings); procedure SimMR(AReport: TStrings);
procedure Hoyt(AReport: TStrings); procedure Hoyt(AReport: TStrings);
procedure StepKR(AReport: TStrings); procedure StepKR(AReport: TStrings);
procedure PlotScores; procedure PlotScores;
procedure PlotMeans; procedure PlotMeans;
procedure UpdateBtnStates; procedure UpdateBtnStates;
public public
{ public declarations } { public declarations }
@ -194,21 +195,25 @@ end;
procedure TTestScoreFrm.ResponseScrollChange(Sender: TObject); procedure TTestScoreFrm.ResponseScrollChange(Sender: TObject);
var var
item, respno : integer; item, respno: integer;
begin begin
item := StrToInt(ItemNoEdit.Text); item := StrToInt(ItemNoEdit.Text);
if item <= 0 then exit; if item <= 0 then exit;
respno := StrToInt(RespNoEdit.Text);
if respno > 5 then exit; // already at max respno := StrToInt(RespNoEdit.Text);
if respno > MaxRespNo then MaxRespNo := respno; if respno > 5 then exit; // already at max
// save current response
Responses[respno][item-1] := ResponseEdit.Text; if respno > MaxRespNo then MaxRespNo := respno;
RespWghts[respno][item-1] := StrToFloat(ScoreEdit.Text);
// display new position response // save current response
respno := ResponseScroll.Position; Responses[respno][item-1] := ResponseEdit.Text;
RespNoEdit.Text := IntToStr(respno); RespWghts[respno][item-1] := StrToFloat(ScoreEdit.Text);
ResponseEdit.Text := Responses[respno][item-1];
ScoreEdit.Text := FloatToStr(RespWghts[respno][item-1]); // display new position response
respno := ResponseScroll.Position;
RespNoEdit.Text := IntToStr(respno);
ResponseEdit.Text := Responses[respno][item-1];
ScoreEdit.Text := FloatToStr(RespWghts[respno][item-1]);
end; end;
procedure TTestScoreFrm.FormActivate(Sender: TObject); procedure TTestScoreFrm.FormActivate(Sender: TObject);
@ -278,26 +283,28 @@ end;
procedure TTestScoreFrm.ItemScrollChange(Sender: TObject); procedure TTestScoreFrm.ItemScrollChange(Sender: TObject);
var var
item, respno : integer; item, respno: integer;
begin begin
item := StrToInt(ItemNoEdit.Text); item := StrToInt(ItemNoEdit.Text);
respno := StrToInt(RespNoEdit.Text); respno := StrToInt(RespNoEdit.Text);
if respno > MaxRespNo then MaxRespNo := respno; if respno > MaxRespNo then MaxRespNo := respno;
// save last one
if (item <> ItemScroll.Position) then // save last one
begin if (item <> ItemScroll.Position) then
Responses[respno][item-1] := ResponseEdit.Text; begin
RespWghts[respno][item-1] := StrToFloat(ScoreEdit.Text); Responses[respno][item-1] := ResponseEdit.Text;
end; RespWghts[respno][item-1] := StrToFloat(ScoreEdit.Text);
item := ItemScroll.Position; end;
ItemNoEdit.Text := IntToStr(item); item := ItemScroll.Position;
respno := 1; ItemNoEdit.Text := IntToStr(item);
ResponseScroll.Position := 1; // first response respno := 1;
RespNoEdit.Text := '1'; // default ResponseScroll.Position := 1; // first response
ScoreEdit.Text := '1'; // default RespNoEdit.Text := '1'; // default
// load previous one ScoreEdit.Text := '1'; // default
ResponseEdit.Text := Responses[respno][item-1];
ScoreEdit.Text := FloatToStr(RespWghts[respno][item-1]); // load previous one
ResponseEdit.Text := Responses[respno][item-1];
ScoreEdit.Text := FloatToStr(RespWghts[respno][item-1]);
end; end;
procedure TTestScoreFrm.LastInBtnClick(Sender: TObject); procedure TTestScoreFrm.LastInBtnClick(Sender: TObject);

View File

@ -5,8 +5,8 @@ unit MatrixLib;
interface interface
uses uses
Classes, SysUtils, Globals, DictionaryUnit, OutputUnit, Dialogs, Classes, SysUtils, Dialogs,
FunctionsLib, DataProcs, MainUnit; Globals, DictionaryUnit, FunctionsLib, DataProcs, MainUnit;
procedure GridDotProd(col1, col2: integer; out Product: double; var Ngood: integer); procedure GridDotProd(col1, col2: integer; out Product: double; var Ngood: integer);
@ -16,23 +16,13 @@ procedure GridXProd(NoSelected : integer;
Augment : boolean; Augment : boolean;
VAR Ngood : integer); VAR Ngood : integer);
procedure GridCovar(NoSelected : integer; procedure GridCovar(NoSelected: integer; const Selected: IntDyneVec;
{VAR} Selected : IntDyneVec; const Covar: DblDyneMat; const Means, Variances, StdDevs: DblDyneVec;
{VAR} Covar : DblDyneMat; var ErrorCode: boolean; var NGood: Integer);
{VAR} Means : DblDyneVec;
{VAR} Variances : DblDyneVec;
{VAR} StdDevs : DblDyneVec;
VAR errorcode : boolean;
VAR Ngood : integer);
procedure Correlations(NoSelected : integer; procedure Correlations(NoSelected: integer; const Selected: IntDyneVec;
{VAR} Selected : IntDyneVec; const Correlations: DblDyneMat; const Means, Variances, StdDevs: DblDyneVec;
{VAR} Correlations : DblDyneMat; var ErrorCode: boolean; var NGood: integer);
{VAR} Means : DblDyneVec;
{VAR} Variances : DblDyneVec;
{VAR} StdDevs : DblDyneVec;
VAR errorcode : boolean;
VAR Ngood : integer);
procedure MatAxB(const A, B, C: DblDyneMat; BRows, BCols, CRows, CCols: Integer; procedure MatAxB(const A, B, C: DblDyneMat; BRows, BCols, CRows, CCols: Integer;
out ErrorCode: boolean); out ErrorCode: boolean);
@ -56,25 +46,6 @@ procedure EffectCode(GridCol, min, max : integer;
VAR startcol : integer; VAR startcol : integer;
VAR endcol : integer; VAR endcol : integer;
VAR novectors : integer); VAR novectors : integer);
procedure MReg(NoIndep : integer;
{VAR} IndepCols : IntDyneVec;
DepCol : integer;
{VAR} RowLabels : StrDyneVec;
{VAR} Means : DblDyneVec;
{VAR} Variances : DblDyneVec;
{VAR} StdDevs : DblDyneVec;
{VAR} BWeights : DblDyneVec;
{VAR} BetaWeights : DblDyneVec;
{VAR} BStdErrs : DblDyneVec;
{VAR} Bttests : DblDyneVec;
{VAR} tProbs : DblDyneVec;
VAR R2 : double;
VAR stderrest : double;
VAR NCases : integer;
VAR errorcode : boolean;
PrintAll : boolean);
procedure MReg(NoIndep: integer; const IndepCols: IntDyneVec; DepCol: integer; procedure MReg(NoIndep: integer; const IndepCols: IntDyneVec; DepCol: integer;
const RowLabels: StrDyneVec; const RowLabels: StrDyneVec;
const Means, Variances, StdDevs, BWeights, BetaWeights, BStdErrs, Bttests, tProbs: DblDyneVec; const Means, Variances, StdDevs, BWeights, BetaWeights, BStdErrs, Bttests, tProbs: DblDyneVec;
@ -131,18 +102,9 @@ procedure MReg2(NCases : integer;
procedure MatSub(const a, b, c: DblDyneMat; procedure MatSub(const a, b, c: DblDyneMat;
brows, bcols, crows, ccols: integer; out errorcode: boolean); brows, bcols, crows, ccols: integer; out errorcode: boolean);
procedure IntArrayPrint(mat : IntDyneMat; procedure IntArrayPrint(const mat: IntDyneMat; rows, cols: integer;
rows, cols : integer; const YTitle: string; const RowLabels, ColLabels: StrDyneVec;
ytitle : string; const Title: string; AReport: TStrings);
RowLabels, ColLabels : StrDyneVec;
Title : string;
AReport: TStrings);
procedure IntArrayPrint(mat : IntDyneMat;
rows, cols : integer;
ytitle : string;
RowLabels, ColLabels : StrDyneVec;
Title : string);
procedure eigens(VAR a: DblDyneMat; Var d : DblDyneVec; n : integer); procedure eigens(VAR a: DblDyneMat; Var d : DblDyneVec; n : integer);
@ -160,24 +122,18 @@ function SEVS(nv,nf : integer;
function SCPF(VAR x,y : DblDyneMat; kx,ky,n,nd : integer) : double; function SCPF(VAR x,y : DblDyneMat; kx,ky,n,nd : integer) : double;
procedure Mat_Print(var xmat: DblDyneMat; Rows,Cols: Integer; var Title: String;
var RowLabels, ColLabels: StrDyneVec; NCases: Integer);
procedure MatPrint(const xmat: DblDyneMat; Rows,Cols: Integer; const Title: String; procedure MatPrint(const xmat: DblDyneMat; Rows,Cols: Integer; const Title: String;
const RowLabels, ColLabels: StrDyneVec; NCases: Integer; AReport: TStrings); const RowLabels, ColLabels: StrDyneVec; NCases: Integer; AReport: TStrings);
procedure DynVectorPrint(var AVector: DblDyneVec; NoVars: integer;
Title: string; var Labels: StrDyneVec; NCases: integer); overload;
procedure DynVectorPrint(const AVector: DblDyneVec; NoVars: integer; procedure DynVectorPrint(const AVector: DblDyneVec; NoVars: integer;
Title: string; const Labels: StrDyneVec; NCases: integer; AReport: TStrings); overload; Title: string; const Labels: StrDyneVec; NCases: integer; AReport: TStrings);
procedure scatplot(const x, y: DblDyneVec; NoCases: integer; procedure ScatPlot(const x, y: DblDyneVec; NoCases: integer;
const TitleStr, x_axis, y_axis: string; x_min, x_max, y_min, y_max: double; const TitleStr, x_axis, y_axis: string; x_min, x_max, y_min, y_max: double;
const VarLabels: StrDyneVec; AReport: TStrings); const VarLabels: StrDyneVec; AReport: TStrings);
procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string; procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string;
RowLabels, ColLabels: StrDyneVec; Title: string); overload; RowLabels, ColLabels: StrDyneVec; Title: string; AReport: TStrings);
procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string;
RowLabels, ColLabels: StrDyneVec; Title: string; AReport: TStrings); overload;
procedure SymMatRoots(A : DblDyneMat; M : integer; VAR E : DblDyneVec; VAR V : DblDyneMat); procedure SymMatRoots(A : DblDyneMat; M : integer; VAR E : DblDyneVec; VAR V : DblDyneMat);
procedure matinv(a, vtimesw, v, w: DblDyneMat; n: integer); procedure matinv(a, vtimesw, v, w: DblDyneMat; n: integer);
@ -292,35 +248,30 @@ begin
end; end;
//------------------------------------------------------------------- //-------------------------------------------------------------------
procedure GridCovar(NoSelected : integer; { Obtains the variance/covariance matrix of variables in the grid
{VAR} Selected : IntDyneVec; NoSelected is the number of variables selected from the grid
{VAR} Covar : DblDyneMat; Selected is a vector of integers for the grid columns of selected variables
{VAR} Means : DblDyneVec; Covar is the variance/covariance matrix returned
{VAR} Variances : DblDyneVec; Means, StdDevs, Variances are double vectors obtained from the augmented matrix
{VAR} StdDevs : DblDyneVec; errorcode is true if an error occurs due to 0 variance
VAR errorcode : boolean; Ngood is the number of records in the cross-product of vectors
VAR Ngood : integer); This procedure calls the GridXProd procedure with augmentation true
// Obtains the variance/covariance matrix of variables in the grid in order to obtain the means, variances and standard deviations }
// NoSelected is the number of variables selected from the grid procedure GridCovar(NoSelected: integer; const Selected: IntDyneVec;
// Selected is a vector of integers for the grid columns of selected variables const Covar: DblDyneMat; const Means, Variances, StdDevs: DblDyneVec;
// Covar is the variance/covariance matrix returned var errorcode: boolean; var NGood: integer);
// Means, StdDevs, Variances are double vectors obtained from the augmented matrix
// errorcode is true if an error occurs due to 0 variance
// Ngood is the number of records in the cross-product of vectors
// This procedure calls the GridXProd procedure with augmentation true
// in order to obtain the means, variances and standard deviations
var var
i, j: integer; i, j: integer;
N: double; N: double;
Augment: boolean; Augment: boolean;
begin begin
// initialize // initialize
errorcode := false; ErrorCode := false;
for i := 1 to NoSelected do for i := 0 to NoSelected-1 do
begin begin
Means[i-1] := 0.0; Means[i] := 0.0;
Variances[i-1] := 0.0; Variances[i] := 0.0;
StdDevs[i-1] := 0.0; StdDevs[i] := 0.0;
end; end;
Augment := true; // augment to get intercept, means, variances, std.devs. Augment := true; // augment to get intercept, means, variances, std.devs.
@ -333,68 +284,61 @@ begin
// Sums of squares are in diagonal, cross-products in off-diagonal cells // Sums of squares are in diagonal, cross-products in off-diagonal cells
// Sums of X's are in the augmented column // Sums of X's are in the augmented column
// Get means and standard deviations first // Get means and standard deviations first
for i := 1 to NoSelected do for i := 0 to NoSelected-1 do
begin begin
Means[i-1] := Covar[i-1,NoSelected] / N; Means[i] := Covar[i, NoSelected] / N;
Variances[i-1] := Covar[i-1,i-1] - (Sqr(Covar[i-1,NoSelected]) / N); Variances[i] := Covar[i, i] - (Sqr(Covar[i, NoSelected]) / N);
Variances[i-1] := Variances[i-1] / (N - 1.0); Variances[i] := Variances[i] / (N - 1.0);
if Variances[i-1] > 0.0 then if Variances[i] > 0.0 then
StdDevs[i-1] := sqrt(Variances[i-1]) StdDevs[i] := sqrt(Variances[i])
else else
begin begin
StdDevs[i-1] := 0.0; StdDevs[i] := 0.0;
errorcode := true; ErrorCode := true;
end; end;
end; end;
// Now get covariances // Now get covariances
for i := 1 to NoSelected do for i := 0 to NoSelected-1 do
begin begin
for j := 1 to NoSelected do for j := 0 to NoSelected-1 do
begin begin
Covar[i-1,j-1] := Covar[i-1,j-1] - ((Covar[i-1,NoSelected] * Covar[j-1,NoSelected]) / N); Covar[i, j] := Covar[i, j] - ((Covar[i, NoSelected] * Covar[j, NoSelected]) / N);
Covar[i-1,j-1] := Covar[i-1,j-1] / (N - 1); Covar[i, j] := Covar[i, j] / (N - 1);
end; end;
end; end;
end; end;
//------------------------------------------------------------------- //-------------------------------------------------------------------
procedure Correlations(NoSelected : integer; { Obtains the correlation matrix among grid variables
{VAR} Selected : IntDyneVec; NoSelected is the no. of grid variables selected for analysis
{VAR} Correlations : DblDyneMat; Selected is a vector of integers of the grid variable columns selected
{VAR} Means : DblDyneVec; Correlations are returned in the Correlations matrix
{VAR} Variances : DblDyneVec; Means, Variances, StdDevs are returned as double vectors
{VAR} StdDevs : DblDyneVec; errorcode is true if a 0 variance is detected
VAR errorcode : boolean; Ngood is the number cases that do not contain missing values or are filtered
VAR Ngood : integer); This procedure calls the GridCovar procedure }
// Obtains the correlation matrix among grid variables procedure Correlations(NoSelected: integer; const Selected: IntDyneVec;
// NoSelected is the no. of grid variables selected for analysis const Correlations: DblDyneMat; const Means, Variances, StdDevs: DblDyneVec;
// Selected is a vector of integers of the grid variable columns selected var ErrorCode: boolean; var NGood: integer);
// Correlations are returned in the Correlations matrix
// Means, Variances, StdDevs are returned as double vectors
// errorcode is true if a 0 variance is detected
// Ngood is the number cases that do not contain missing values or are filtered
// This procedure calls the GridCovar procedure
var var
i, j : integer; i, j: integer;
begin begin
// get covariance matrix, means and standard deviations // get covariance matrix, means and standard deviations
GridCovar(NoSelected,Selected,Correlations,Means,Variances,StdDevs,errorcode, Ngood); GridCovar(NoSelected, Selected, Correlations, Means, Variances, StdDevs, ErrorCode, Ngood);
for i := 1 to NoSelected do for i := 0 to NoSelected-1 do
begin begin
for j := 1 to NoSelected do for j := 0 to NoSelected-1 do
begin begin
if (StdDevs[i-1] > 0.0) and (StdDevs[j-1] > 0.0) then if (StdDevs[i] > 0.0) and (StdDevs[j] > 0.0) then
Correlations[i-1,j-1] := Correlations[i-1,j-1] / Correlations[i, j] := Correlations[i, j] / (StdDevs[i] * StdDevs[j])
(StdDevs[i-1] * StdDevs[j-1]) else
else begin
begin Correlations[i, j] := 0.0;
Correlations[i-1,j-1] := 0.0; ErrorCode := true;
errorcode := true; end;
end; end;
end; end;
end;
end; end;
//------------------------------------------------------------------- //-------------------------------------------------------------------
@ -595,21 +539,21 @@ BEGIN
end; end;
//------------------------------------------------------------------- //-------------------------------------------------------------------
procedure DETERM(const a: DblDyneMat; Rows, Cols: integer; out determ: double; procedure Determ(const a: DblDyneMat; Rows, Cols: integer; out determ: double;
out errorcode: boolean); out ErrorCode: boolean);
var var
indx: IntDyneVec; indx: IntDyneVec;
i: integer; i: integer;
begin begin
SetLength(indx,rows); SetLength(indx,rows);
errorcode := false; ErrorCode := false;
if (rows <> cols) then if (rows <> cols) then
errorcode := true ErrorCode := true
else else
begin begin
LUDCMP(a, rows, indx, determ); LUDCMP(a, rows, indx, determ);
for i := 1 to rows do for i := 0 to rows-1 do
determ := determ * a[i-1,i-1]; determ := determ * a[i, i];
end; end;
end; { of determ } end; { of determ }
//------------------------------------------------------------------- //-------------------------------------------------------------------
@ -671,30 +615,6 @@ begin
OS3MainFrm.NoVarsEdit.Text := IntToStr(NoVariables); OS3MainFrm.NoVarsEdit.Text := IntToStr(NoVariables);
coef := nil; coef := nil;
end; end;
//-------------------------------------------------------------------
procedure MReg(NoIndep : integer;
{VAR} IndepCols : IntDyneVec;
DepCol : integer;
{VAR} RowLabels : StrDyneVec;
{VAR} Means : DblDyneVec;
{VAR} Variances : DblDyneVec;
{VAR} StdDevs : DblDyneVec;
{VAR} BWeights : DblDyneVec;
{VAR} BetaWeights : DblDyneVec;
{VAR} BStdErrs : DblDyneVec;
{VAR} Bttests : DblDyneVec;
{VAR} tProbs : DblDyneVec;
VAR R2 : double;
VAR stderrest : double;
VAR NCases : integer;
VAR errorcode : boolean;
PrintAll : boolean);
begin
MReg(NoIndep, IndepCols, Depcol, RowLabels,means, Variances, StdDevs,
BWeights, BetaWeights, BStdErrs, BtTests, tProbs, R2, StdErrEst, NCases,
ErrorCode, PrintAll, OutputFrm.RichEdit.Lines);
end;
procedure MReg(NoIndep: integer; const IndepCols: IntDyneVec; DepCol: integer; procedure MReg(NoIndep: integer; const IndepCols: IntDyneVec; DepCol: integer;
const RowLabels: StrDyneVec; const RowLabels: StrDyneVec;
@ -788,7 +708,6 @@ begin
AReport.Add('Variance Y: %10.3f', [VarY]); AReport.Add('Variance Y: %10.3f', [VarY]);
AReport.Add('SSY: %10.3f', [SSY]); AReport.Add('SSY: %10.3f', [SSY]);
AReport.Add('SDY: %10.3f', [SDY]); AReport.Add('SDY: %10.3f', [SDY]);
// OutputFrm.ShowModal ;
// augment the matrix // augment the matrix
for i := 1 to NCases do for i := 1 to NCases do
@ -829,9 +748,6 @@ begin
DynVectorPrint(Means, NoIndep+1, 'MEANS', RowLabels, NCases, AReport); DynVectorPrint(Means, NoIndep+1, 'MEANS', RowLabels, NCases, AReport);
DynVectorPrint(Variances, NoIndep+1,'VARIANCES',RowLabels, NCases, AReport); DynVectorPrint(Variances, NoIndep+1,'VARIANCES',RowLabels, NCases, AReport);
DynVectorPrint(StdDevs, NoIndep+1, 'STD. DEV.S', RowLabels, NCases, AReport); DynVectorPrint(StdDevs, NoIndep+1, 'STD. DEV.S', RowLabels, NCases, AReport);
//OutputFrm.ShowModal;
//OutPutFrm.RichEdit.Clear;
end; end;
// get product of the augmented X transpose matrix times the Y vector // get product of the augmented X transpose matrix times the Y vector
@ -1302,7 +1218,6 @@ var
outcount : integer; outcount : integer;
varsout : IntDyneVec; varsout : IntDyneVec;
begin begin
Assert(OutputFrm <> nil);
Assert(AReport <> nil); Assert(AReport <> nil);
SetLength(IndRowLabels,NoVars); SetLength(IndRowLabels,NoVars);
@ -1484,24 +1399,10 @@ begin
a[i,j] := b[i,j] - c[i,j]; a[i,j] := b[i,j] - c[i,j];
end; end;
end; { of matsub } end; { of matsub }
//---------------------------------------------------------------------------
procedure IntArrayPrint(mat : IntDyneMat; procedure IntArrayPrint(const Mat: IntDyneMat; Rows, Cols: integer;
rows, cols : integer; const YTitle: string; const RowLabels, ColLabels: StrDyneVec;
ytitle : string; const Title: string; AReport: TStrings);
RowLabels, ColLabels : StrDyneVec;
Title : string);
begin
Assert(OutputFrm <> nil);
IntArrayPrint(mat, rows, cols, ytitle, RowLabels, ColLabels, Title, OutputFrm.RichEdit.Lines);
end;
procedure IntArrayPrint(Mat: IntDyneMat;
Rows, Cols: integer;
YTitle: string;
RowLabels, ColLabels: StrDyneVec;
Title: string;
AReport: TStrings);
var var
i, j, first, last, nflds: integer; i, j, first, last, nflds: integer;
done : boolean; done : boolean;
@ -1516,7 +1417,6 @@ begin
while not done do while not done do
begin begin
// AReport.Add('');
AReport.Add(' ' + ytitle);; AReport.Add(' ' + ytitle);;
AReport.Add('Variables'); AReport.Add('Variables');
@ -1542,7 +1442,6 @@ begin
first := last + 1; first := last + 1;
end; end;
AReport.Add(''); AReport.Add('');
// AReport.Add('');
end; end;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1810,13 +1709,6 @@ begin
end; end;
scpf := scp; scpf := scp;
end; { of SCPF } end; { of SCPF }
//-------------------------------------------------------------------
procedure Mat_Print(var xmat: DblDyneMat; Rows, Cols: Integer; var Title: String;
var RowLabels, ColLabels: StrDyneVec; NCases: integer);
begin
MatPrint(xmat, Rows, Cols, Title, RowLabels, ColLabels, NCases, OutputFrm.RichEdit.Lines);
end;
procedure MatPrint(const xmat: DblDyneMat; Rows, Cols: integer; const Title: string; procedure MatPrint(const xmat: DblDyneMat; Rows, Cols: integer; const Title: string;
const RowLabels, ColLabels: StrDyneVec; NCases: integer; AReport: TStrings); const RowLabels, ColLabels: StrDyneVec; NCases: integer; AReport: TStrings);
@ -1861,25 +1753,10 @@ begin
first := last + 1; first := last + 1;
end; end;
AReport.Add(''); AReport.Add('');
// AReport.Add('');
end;
//--------------------------------------------------------------------
procedure DynVectorPrint(var AVector: DblDyneVec;
NoVars: integer;
Title: string;
var Labels: StrDyneVec;
NCases: integer);
begin
DynVectorPrint(AVector, NoVars, Title, Labels, NCases, OutputFrm.RichEdit.Lines);
end; end;
procedure DynVectorPrint(const AVector: DblDyneVec; procedure DynVectorPrint(const AVector: DblDyneVec; NoVars: integer;
NoVars: integer; Title: string; const Labels: StrDyneVec; NCases: integer; AReport: TStrings);
Title: string;
const Labels: StrDyneVec;
NCases: integer;
AReport: TStrings);
var var
i, j, first, last, nflds: integer; i, j, first, last, nflds: integer;
done: boolean; done: boolean;
@ -1922,7 +1799,7 @@ begin
end; end;
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
procedure scatplot(const x, y: DblDyneVec; NoCases: integer; procedure ScatPlot(const x, y: DblDyneVec; NoCases: integer;
const TitleStr, x_axis, y_axis: string; x_min, x_max, y_min, y_max: double; const TitleStr, x_axis, y_axis: string; x_min, x_max, y_min, y_max: double;
const VarLabels: StrDyneVec; AReport: TStrings); const VarLabels: StrDyneVec; AReport: TStrings);
var var
@ -1937,8 +1814,6 @@ var
outline : string; outline : string;
Labels : StrDyneVec; Labels : StrDyneVec;
begin begin
Assert(OutputFrm <> nil);
SetLength(Labels,NoVariables); SetLength(Labels,NoVariables);
for i := 1 to nocases do Labels[i-1] := VarLabels[i-1]; for i := 1 to nocases do Labels[i-1] := VarLabels[i-1];
height := 40; height := 40;
@ -2049,13 +1924,6 @@ begin
Labels := nil; Labels := nil;
end; { of scatplot procedure } end; { of scatplot procedure }
//-------------------------------------------------------------------
procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string;
RowLabels, ColLabels: StrDyneVec; Title: string);
begin
DynIntMatPrint(Mat, Rows, Cols, YTitle, RowLabels, ColLabels, Title, OutputFrm.RichEdit.Lines);
end;
procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string; procedure DynIntMatPrint(Mat: IntDyneMat; Rows, Cols: integer; YTitle: string;
RowLabels, ColLabels: StrDyneVec; Title: string; AReport: TStrings); RowLabels, ColLabels: StrDyneVec; Title: string; AReport: TStrings);