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 = '---------------------------------------------------------------------------';