diff --git a/applications/lazstats/LazStats.chm b/applications/lazstats/LazStats.chm index 94684710e..584efa9ba 100644 Binary files a/applications/lazstats/LazStats.chm and b/applications/lazstats/LazStats.chm differ diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd index 8c8554358..e025326d4 100644 Binary files a/applications/lazstats/docs/HelpNDoc/LazStats.hnd and b/applications/lazstats/docs/HelpNDoc/LazStats.hnd differ diff --git a/applications/lazstats/source/LazStats.lpi b/applications/lazstats/source/LazStats.lpi index a28f1c3d9..c5e6015c7 100644 --- a/applications/lazstats/source/LazStats.lpi +++ b/applications/lazstats/source/LazStats.lpi @@ -1424,11 +1424,6 @@ - - - - - diff --git a/applications/lazstats/source/LazStats.lpr b/applications/lazstats/source/LazStats.lpr index e0f496add..20ca88a54 100644 --- a/applications/lazstats/source/LazStats.lpr +++ b/applications/lazstats/source/LazStats.lpr @@ -8,7 +8,7 @@ uses {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, tachartlazaruspkg, tachartprint, lhelpcontrolpkg, - Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit, utils, chartunit; + Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit; //, utils, chartunit; {$R LazStats.res} @@ -26,8 +26,9 @@ begin else Application.Terminate; end; -Application.CreateForm(TMainDataModule, MainDataModule); -Application.CreateForm(TOS3MainFrm, OS3MainFrm); + + Application.CreateForm(TMainDataModule, MainDataModule); + Application.CreateForm(TOS3MainFrm, OS3MainFrm); Application.Run; end. diff --git a/applications/lazstats/source/forms/analysis/descriptive/multxvsyunit.pas b/applications/lazstats/source/forms/analysis/descriptive/multxvsyunit.pas index 3397fb8cc..44e7c1e6a 100644 --- a/applications/lazstats/source/forms/analysis/descriptive/multxvsyunit.pas +++ b/applications/lazstats/source/forms/analysis/descriptive/multxvsyunit.pas @@ -3,11 +3,12 @@ unit MultXvsYUnit; {$mode objfpc}{$H+} +{$i ../../../LazStats.inc} interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Buttons, Clipbrd, MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit; @@ -52,7 +53,7 @@ type procedure GroupOutBtnClick(Sender: TObject); procedure HelpBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject); - procedure VarListSelectionChange(Sender: TObject; User: boolean); + procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean); procedure XInBtnClick(Sender: TObject); procedure XOutBtnClick(Sender: TObject); procedure YInBtnClick(Sender: TObject); @@ -60,8 +61,12 @@ type private { private declarations } FAutoSized: Boolean; - procedure PlotXY(var XValues: DblDyneMat; YValues: DblDyneMat; + {$IFDEF USE_TACHART} + procedure PlotXY(const XValues, YValues: DblDyneMat; MinGrp: Integer); + {$ELSE} + procedure PlotXY(const XValues, YValues: DblDyneMat; MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer); + {$ENDIF} procedure UpdateBtnStates; public @@ -73,36 +78,42 @@ var implementation +{$R *.lfm} + uses - Math, - BlankFrmUnit; + {$IFDEF USE_TACHART} + TATypes, + ChartUnit, + {$ELSE} + BlankFrmUnit, + {$ENDIF} + Math, Utils; + { TMultXvsYFrm } procedure TMultXvsYFrm.ResetBtnClick(Sender: TObject); -VAR i : integer; +var + i : integer; begin - VarList.Clear; - for i := 1 to NoVariables do - VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); - XEdit.Text := ''; - YEdit.Text := ''; - GroupEdit.Text := ''; - DescChk.Checked := false; - LinesChk.Checked := false; - XInBtn.Enabled := true; - YInBtn.Enabled := true; - GroupInBtn.Enabled := true; - XOutBtn.Enabled := false; - YOutBtn.Enabled := false; - GroupOutBtn.Enabled := false; + VarList.Clear; + for i := 1 to NoVariables do + VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); + XEdit.Text := ''; + YEdit.Text := ''; + GroupEdit.Text := ''; + DescChk.Checked := false; + LinesChk.Checked := false; + UpdateBtnStates; end; + procedure TMultXvsYFrm.VarListSelectionChange(Sender: TObject; User: boolean); begin UpdateBtnStates; end; + procedure TMultXvsYFrm.GroupInBtnClick(Sender: TObject); var i: integer; @@ -116,31 +127,32 @@ begin UpdateBtnStates; end; + procedure TMultXvsYFrm.ComputeBtnClick(Sender: TObject); var - i, j, k, N, NoGrps, XCol, YCol, GrpCol, Grp, MinGrp, MaxGrp: integer; - NoSelected, MaxGrpSize: integer; - selected, NoInGrp: IntDyneVec; - YValues, XValues: DblDyneMat; - Means, StdDevs: DblDyneVec; - MinX, MaxX, MinY, MaxY, X, Y, temp: double; - cellstring: string; lReport: TStrings; + i, N, NoGrps, XCol, YCol, GrpCol, Grp, MinGrp, MaxGrp: integer; + MinX, MaxX, MinY, MaxY, X, Y: double; + cellstring: string; + MaxGrpSize: integer; + NoInGrp: IntDyneVec = nil; + XValues: DblDyneMat = nil; + YValues: DblDyneMat = nil; + Means: array[0..1] of Double = (0.0, 0.0); + StdDevs: array[0..1] of Double = (0.0, 0.0); + selected: array[0..2] of Integer = (0, 0, 0); + NoSelected: Integer = 3; begin MaxGrpSize := 0; - SetLength(selected, 3); - MaxX := -1.0e308; - MinX := 1.0e308; - MaxY := -1.0e308; - MinY := 1.0e308; - MinGrp := MaxInt; - MaxGrp := -MaxInt; + MaxX := -Infinity; + MinX := Infinity; + MaxY := -Infinity; + MinY := Infinity; + + // Get selected variables XCol := 0; YCol := 0; GrpCol := 0; - N := 0; - - // Get selected variables for i := 1 to NoVariables do begin cellstring := OS3MainFrm.DataGrid.Cells[i,0]; @@ -148,86 +160,90 @@ begin if (cellstring = YEdit.Text) then selected[1] := i; if (cellstring = GroupEdit.Text) then selected[2] := i; end; - XCol := selected[0]; YCol := selected[1]; GrpCol := selected[2]; - NoSelected := 3; if (XCol = 0) or (YCol = 0) or (GrpCol = 0) then begin - MessageDlg('No variable selected.', mtError, [mbOK], 0); + ErrorMsg('No variable selected.'); exit; end; // Get number of groups + MinGrp := MaxInt; + MaxGrp := -MaxInt; for i := 1 to NoCases do begin - Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]); - if (Grp > MaxGrp) then MaxGrp := Grp; - if (Grp < MinGrp) then MinGrp := Grp; + Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]); + MaxGrp := Max(MaxGrp, Grp); + MinGrp := Min(MinGrp, Grp); end; NoGrps := (MaxGrp - MinGrp) + 1; - lReport := TStringList.Create; - try - lReport.Add('X VERSUS Y FOR GROUPS PLOT'); - lReport.Add(''); + SetLength(XValues, NoGrps, NoCases); // NoCases is over-dimensioned and will be trimmed later. + SetLength(YValues, NoGrps, NoCases); // dto. + SetLength(NoInGrp, NoGrps); + for i := 0 to NoGrps - 1 do NoInGrp[i] := 0; - SetLength(YValues, NoCases+1, NoGrps+1); - SetLength(XValues, NoCases+1, NoGrps+1); - SetLength(Means, 2); - SetLength(StdDevs, 2); - SetLength(NoInGrp, NoGrps); + N := 0; + for i := 1 to NoCases do + begin + if (not GoodRecord(i, NoSelected, selected))then continue; + inc(N); + + X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]); + MaxX := Max(MaxX, X); + MinX := Min(MinX, X); + + Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol, i]); + MaxY := Max(MaxY, Y); + MinY := Min(MinY, Y); + + Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]) - MinGrp; + XValues[Grp, NoInGrp[Grp]] := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]); + YValues[Grp, NoInGrp[Grp]] := Y; + inc(NoInGrp[Grp]); + MaxGrpSize := Max(MaxGrpsize, NoInGrp[Grp]); + end; + + // Trim XValues and YValues to correct dimension. + SetLength(XValues, NoGrps); + SetLength(YValues, NoGrps); + for grp := 0 to NoGrps-1 do + begin + SetLength(XValues[grp], NoInGrp[grp]); + SetLength(YValues[grp], NoInGrp[grp]); + end; + + // get descriptive data + if DescChk.Checked then + begin + for i := 1 to NoCases do + begin + if (not GoodRecord(i,NoSelected,selected)) then continue; + Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]); + X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); + Means[0] := Means[0] + X; + StdDevs[0] := StdDevs[0] + sqr(X); + Means[1] := Means[1] + Y; + StdDevs[1] := StdDevs[1] + sqr(Y); + end; for i := 0 to 1 do begin - Means[i] := 0.0; - StdDevs[i] := 0.0; - end; - for i := 0 to NoGrps - 1 do - NoInGrp[i] := 0; - - for i := 1 to NoCases do - begin - if (not GoodRecord(i,NoSelected,selected))then continue; - inc(N); - X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); - if (X > MaxX) then MaxX := X; - if (X < MinX) then MinX := X; - - Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]); - if (Y > MaxY) then MaxY := Y; - if (Y < MinY) then MinY := Y; - - Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]); - Grp := Grp - MinGrp; - NoInGrp[Grp] := NoInGrp[Grp] + 1; - if (NoInGrp[Grp] > MaxGrpSize) then MaxGrpSize := NoInGrp[Grp]; - YValues[NoInGrp[Grp]-1,Grp] := Y; - XValues[NoInGrp[Grp]-1,Grp] := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); + StdDevs[i] := StdDevs[i] - sqr(Means[i]) / N; + StdDevs[i] := sqrt(StdDevs[i] / (N - 1)); + Means[i] := Means[i] / N; end; - // get descriptive data - if (DescChk.Checked) then - begin - for i := 1 to NoCases do - begin - if (not GoodRecord(i,NoSelected,selected)) then continue; - Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]); - X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); - Means[0] := Means[0] + X; - StdDevs[0] := StdDevs[0] + X * X; - Means[1] := Means[1] + Y; - StdDevs[1] := StdDevs[1] + Y * Y; - end; - - for i := 0 to 1 do - begin - StdDevs[i] := StdDevs[i] - (Means[i] * Means[i]) / N; - StdDevs[i] := sqrt(StdDevs[i] / (N - 1)); - Means[i] := Means[i] / N; - end; + lReport := TStringList.Create; + try + lReport.Add('X VERSUS Y FOR GROUPS PLOT'); + lReport.Add(''); + lReport.Add('X variable: ' + XEdit.Text); + lReport.Add('Y variable: ' + YEdit.Text); + lReport.Add(''); lReport.Add('VARIABLE MEAN STANDARD DEVIATION'); lReport.Add(' X %9.3f %14.3f', [Means[0], StdDevs[0]]); @@ -235,42 +251,24 @@ begin lReport.Add(''); DisplayReport(lReport); + finally + lReport.Free; end; - - // sort on X - for i := 0 to NoGrps - 1 do - begin - for j := 0 to MaxGrpSize-2 do - begin - for k := j+1 to MaxGrpSize - 1 do - begin - if (XValues[j,i] > XValues[k,i]) then // swap - begin - temp := XValues[j,i]; - XValues[j,i] := XValues[k,i]; - XValues[k,i] := temp; - temp := YValues[j,i]; - YValues[j,i] := YValues[k,i]; - YValues[k,i] := temp; - end; - end; - end; - end; - - BlankFrm.Image1.Canvas.Clear; - BlankFrm.Show; - PlotXY(XValues, YValues, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps, MinGrp); - - finally - lReport.Free; - NoInGrp := nil; - StdDevs := nil; - Means := nil; - XValues := nil; - YValues := nil; end; + + // sort on X + for i := 0 to NoGrps - 1 do + SortOnX(XValues[i], YValues[i]); + + // Plot data + PlotXY(XValues, YValues{$IFNDEF USE_TACHART}, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps{$ENDIF}, MinGrp); + + NoInGrp := nil; + XValues := nil; + YValues := nil; end; + procedure TMultXvsYFrm.FormActivate(Sender: TObject); var w: Integer; @@ -290,18 +288,20 @@ begin FAutoSized := true; end; + procedure TMultXvsYFrm.FormCreate(Sender: TObject); begin Assert(OS3MainFrm <> nil); if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm); - if BlankFrm = nil then Application.CreateForm(TBlankFrm, BlankFrm); end; + procedure TMultXvsYFrm.FormShow(Sender: TObject); begin ResetBtnClick(self); end; + procedure TMultXvsYFrm.GroupOutBtnClick(Sender: TObject); begin if GroupEdit.Text <> '' then @@ -312,6 +312,7 @@ begin UpdateBtnStates; end; + procedure TMultXvsYFrm.HelpBtnClick(Sender: TObject); begin if ContextHelpForm = nil then @@ -319,6 +320,7 @@ begin ContextHelpForm.HelpMessage((Sender as TButton).Tag); end; + procedure TMultXvsYFrm.XInBtnClick(Sender: TObject); var i: integer; @@ -332,6 +334,7 @@ begin UpdateBtnStates; end; + procedure TMultXvsYFrm.XOutBtnClick(Sender: TObject); begin if XEdit.Text <> '' then @@ -342,6 +345,7 @@ begin UpdateBtnStates; end; + procedure TMultXvsYFrm.YInBtnClick(Sender: TObject); var i: integer; @@ -355,6 +359,7 @@ begin UpdateBtnStates; end; + procedure TMultXvsYFrm.YOutBtnClick(Sender: TObject); begin if YEdit.Text <> '' then @@ -365,8 +370,48 @@ begin UpdateBtnStates; end; -// routine to plot X versus multiple Y values -procedure TMultXvsYFrm.plotxy(var XValues: DblDyneMat; YValues: DblDyneMat; + +// Routine to plot X versus multiple Y values for several groups +// 1st index: group index, 2nd index: point index within group +{$IFDEF USE_TACHART} +procedure TMultXvsYFrm.PlotXY(const XValues, YValues: DblDyneMat; MinGrp: Integer); +var + pt: TPlotType; + grp: Integer; + clr: TColor; + grpName: String; + sym: TSeriesPointerStyle; +begin + if Length(XValues) <> Length(YValues) then + begin + ErrorMsg('Incorrect dimension of XValues and YValues'); + exit; + end; + + if ChartForm = nil then + ChartForm := TChartForm.Create(Application) + else + ChartForm.Clear; + + // Titles + ChartForm.SetTitle(LabelEdit.Text); + ChartForm.SetXTitle(XEdit.Text); + chartForm.SetYTitle(YEdit.Text); + + if LinesChk.Checked then pt := ptLinesAndSymbols else pt := ptSymbols; + + for grp := 0 to Length(XValues)-1 do + begin + clr := DATA_COLORS[grp mod Length(DATA_COLORS)]; + sym := DATA_SYMBOLS[grp mod Length(DATA_SYMBOLS)]; + grpName := Format('%s = %d', [GroupEdit.Text, grp + MinGrp]); + ChartForm.PlotXY(pt, XValues[grp], YValues[grp], grpName, clr, sym); + end; + + ChartForm.Show; +end; +{$ELSE} +procedure TMultXvsYFrm.PlotXY(const XValues, YValues: DblDyneMat; MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer); var xpos, ypos, hleft, hright, vtop, vbottom, imagewide : integer; @@ -374,6 +419,12 @@ var valincr, Yvalue, Xvalue, value : double; Title: string; begin + if BlankFrm = nil then + Application.CreateForm(TBlankFrm, BlankFrm) + else + BlankFrm.Image1.Canvas.Clear; + BlankFrm.Show; + Title := LabelEdit.Text; BlankFrm.Caption := Title; BlankFrm.Show; @@ -460,6 +511,17 @@ begin BlankFrm.Image1.Canvas.Font.Color := DATA_COLORS[j mod Length(DATA_COLORS)]; Grp := MinGrp + j; Title := 'GROUP ' + IntToStr(Grp); + for i := 0 to N - 1 do + begin + xpos := hleft + ceil(hwide * ( (XValues[j, i] - MinX) / (MaxX - MinX))); + ypos := vtop + ceil(vhi * ( (MaxY - YValues[j, i]) / (MaxY - MinY))); + if (i = 0) then + BlankFrm.Image1.Canvas.MoveTo(xpos, ypos); + if LinesChk.Checked then + BlankFrm.Image1.Canvas.LineTo(xpos, ypos); + BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5); + end; + (* for i := 1 to N do begin ypos := vtop + ceil(vhi * ( (MaxY - YValues[i-1,j]) / (MaxY - MinY))); @@ -470,6 +532,7 @@ begin BlankFrm.Image1.Canvas.LineTo(xpos, ypos); BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5); end; + *) strhi := BlankFrm.Image1.Canvas.TextHeight(Title); BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Pen.Color := clBlack; @@ -480,6 +543,8 @@ begin BlankFrm.Image1.Canvas.Font.Color := clBlack; end; +{$ENDIF} + procedure TMultXvsYFrm.UpdateBtnStates; var @@ -502,8 +567,6 @@ begin GroupOutBtn.Enabled := (GroupEdit.Text <> ''); end; -initialization - {$I multxvsyunit.lrs} end. diff --git a/applications/lazstats/source/forms/misc/chartunit.lfm b/applications/lazstats/source/forms/misc/chartunit.lfm index 8a69ed433..5a7a19556 100644 --- a/applications/lazstats/source/forms/misc/chartunit.lfm +++ b/applications/lazstats/source/forms/misc/chartunit.lfm @@ -75,6 +75,7 @@ object ChartForm: TChartForm Caption = 'Close' Default = True ModalResult = 11 + OnClick = CloseBtnClick TabOrder = 2 end end diff --git a/applications/lazstats/source/forms/misc/chartunit.pas b/applications/lazstats/source/forms/misc/chartunit.pas index c013a4078..ad84ff35c 100644 --- a/applications/lazstats/source/forms/misc/chartunit.pas +++ b/applications/lazstats/source/forms/misc/chartunit.pas @@ -6,7 +6,8 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, - StdCtrls, ExtDlgs, TAGraph, TACustomSeries, TASeries, PrintersDlgs, + StdCtrls, ExtDlgs, PrintersDlgs, + TAGraph, TACustomSeries, TASeries, TATypes, Globals; type @@ -26,6 +27,7 @@ type PrintDialog: TPrintDialog; SaveBtn: TButton; SavePictureDialog: TSavePictureDialog; + procedure CloseBtnClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure PrintBtnClick(Sender: TObject); @@ -42,7 +44,7 @@ type procedure HorLine(y: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String); function PlotXY(AType: TPlotType; x, y: DblDyneVec; LegendTitle: string; - AColor: TColor; xTitles: StrDynevec = nil): TChartSeries; + AColor: TColor; ASymbol: TSeriesPointerStyle = psCircle): TChartSeries; procedure Vertline(x: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String); procedure SetFooter(const ATitle: String); @@ -61,7 +63,7 @@ implementation uses Math, Printers, OSPrinters, - TAChartUtils, TATypes, TADrawerSVG, TAPrint; + TAChartUtils, TADrawerSVG, TAPrint; { TChartForm } @@ -84,6 +86,11 @@ begin CloseBtn.Constraints.MinWidth := w; end; +procedure TChartForm.CloseBtnClick(Sender: TObject); +begin + Close; +end; + procedure TChartForm.FormCreate(Sender: TObject); begin Clear; @@ -169,10 +176,9 @@ begin end; function TChartForm.PlotXY(AType: TPlotType; x, y: DblDyneVec; - LegendTitle: string; AColor: TColor; xTitles: StrDynevec = nil): TChartSeries; + LegendTitle: string; AColor: TColor; ASymbol: TSeriesPointerStyle = psCircle): TChartSeries; var i, n: Integer; - s: String; begin case AType of ptLines, ptSymbols, ptLinesAndSymbols: @@ -184,7 +190,7 @@ begin if AType in [ptSymbols, ptLinesAndSymbols] then begin TLineSeries(Result).Pointer.Brush.Color := AColor; - TLineSeries(Result).Pointer.Style := psCircle; + TLineSeries(Result).Pointer.Style := ASymbol; end; end; ptHorBars, ptVertBars: @@ -197,18 +203,11 @@ begin n := Min(Length(x), Length(y)); for i := 0 to n-1 do - begin - if (xTitles <> nil) and (i <= Length(xTitles)) then - s := xTitles[i] - else - s := ''; - Result.AddXY(x[i], y[i], s); - end; + Result.AddXY(x[i], y[i]); Result.Title := LegendTitle; Chart.AddSeries(Result); Chart.Legend.Visible := Chart.SeriesCount > 0; - Chart.Prepare; end; procedure TChartForm.SaveBtnClick(Sender: TObject); diff --git a/applications/lazstats/source/units/globals.pas b/applications/lazstats/source/units/globals.pas index eaceb3d1d..e42162ac1 100644 --- a/applications/lazstats/source/units/globals.pas +++ b/applications/lazstats/source/units/globals.pas @@ -5,43 +5,30 @@ unit Globals; interface uses - Classes, SysUtils, Graphics; - -const TOL = 0.0005; - -Type IntDyneVec = array of integer; - -Type DblDyneVec = array of double; - -Type BoolDyneVec = array of boolean; - -Type DblDyneMat = array of array of double; - -Type IntDyneMat = array of array of integer; - -Type DblDyneCube = array of array of array of double; - -Type IntDyneCube = array of array of array of integer; - -Type DblDyneQuad = array of array of array of array of double; - -Type IntDyneQuad = array of array of array of array of integer; - -Type StrDyneVec = array of string; - -Type StrDyneMat = array of array of string; - -Type CharDyneVec = array of char; - -type POINT3D = record - x, y, z : double; -end; - -Type POINTint = record - x, y : integer; -end; + Classes, SysUtils, Graphics, TATypes; type + IntDyneVec = array of integer; + DblDyneVec = array of double; + BoolDyneVec = array of boolean; + DblDyneMat = array of array of double; + IntDyneMat = array of array of integer; + DblDyneCube = array of array of array of double; + IntDyneCube = array of array of array of integer; + DblDyneQuad = array of array of array of array of double; + IntDyneQuad = array of array of array of array of integer; + StrDyneVec = array of string; + StrDyneMat = array of array of string; + CharDyneVec = array of char; + + Point3D = record + x, y, z: double; + end; + + PointInt = record + x, y: Integer; + end; + TFractionType = (ftPoint, ftComma); TMissingValueCode = (mvcSpace, mvcPeriod, mvcZero, mvcNines); TJustification = (jLeft, jCenter, jRight); @@ -75,12 +62,13 @@ var LHelpPath: ''; ); - const FractionTypeChars: array[TFractionType] of char = ('.', ','); MissingValueCodes: array[TMissingValueCode] of string = (' ', '.', '0', '99999'); JustificationCodes: array[TJustification] of string[1] = ('L', 'C', 'R'); + TOL = 0.0005; + DEFAULT_CONFIDENCE_LEVEL_PERCENT = 95.0; DEFAULT_ALPHA_LEVEL = 0.05; DEFAULT_BETA_LEVEL = 0.20; @@ -89,6 +77,9 @@ const clMaroon, clRed, clBlue, clGreen, clNavy, clTeal, clAqua, clLime, clFuchsia, clGray, clSilver, clOlive ); + DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond, + psDownTriangle, psHexagon, psFullStar); + DIVIDER = '==========================================================================='; DIVIDER_SMALL = '---------------------------------------------------------------------------';