LazStats: Use TAChart in MultXvsYUnit. Some cosmetics.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7630 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-08-23 14:31:05 +00:00
parent f380f1d6f3
commit db4a9f929b
8 changed files with 241 additions and 191 deletions

Binary file not shown.

View File

@@ -1424,11 +1424,6 @@
<DebugInfoType Value="dsDwarf2"/> <DebugInfoType Value="dsDwarf2"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking> </Linking>
</CompilerOptions> </CompilerOptions>
<Debugging> <Debugging>

View File

@@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF} {$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset Interfaces, // this includes the LCL widgetset
Forms, tachartlazaruspkg, tachartprint, lhelpcontrolpkg, Forms, tachartlazaruspkg, tachartprint, lhelpcontrolpkg,
Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit, utils, chartunit; Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit; //, utils, chartunit;
{$R LazStats.res} {$R LazStats.res}
@@ -26,8 +26,9 @@ begin
else else
Application.Terminate; Application.Terminate;
end; end;
Application.CreateForm(TMainDataModule, MainDataModule);
Application.CreateForm(TOS3MainFrm, OS3MainFrm); Application.CreateForm(TMainDataModule, MainDataModule);
Application.CreateForm(TOS3MainFrm, OS3MainFrm);
Application.Run; Application.Run;
end. end.

View File

@@ -3,11 +3,12 @@
unit MultXvsYUnit; unit MultXvsYUnit;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
{$i ../../../LazStats.inc}
interface interface
uses uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, Buttons, Clipbrd, StdCtrls, ExtCtrls, Buttons, Clipbrd,
MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit; MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit, ContextHelpUnit;
@@ -52,7 +53,7 @@ type
procedure GroupOutBtnClick(Sender: TObject); procedure GroupOutBtnClick(Sender: TObject);
procedure HelpBtnClick(Sender: TObject); procedure HelpBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject);
procedure VarListSelectionChange(Sender: TObject; User: boolean); procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean);
procedure XInBtnClick(Sender: TObject); procedure XInBtnClick(Sender: TObject);
procedure XOutBtnClick(Sender: TObject); procedure XOutBtnClick(Sender: TObject);
procedure YInBtnClick(Sender: TObject); procedure YInBtnClick(Sender: TObject);
@@ -60,8 +61,12 @@ type
private private
{ private declarations } { private declarations }
FAutoSized: Boolean; 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); MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
{$ENDIF}
procedure UpdateBtnStates; procedure UpdateBtnStates;
public public
@@ -73,14 +78,23 @@ var
implementation implementation
{$R *.lfm}
uses uses
Math, {$IFDEF USE_TACHART}
BlankFrmUnit; TATypes,
ChartUnit,
{$ELSE}
BlankFrmUnit,
{$ENDIF}
Math, Utils;
{ TMultXvsYFrm } { TMultXvsYFrm }
procedure TMultXvsYFrm.ResetBtnClick(Sender: TObject); procedure TMultXvsYFrm.ResetBtnClick(Sender: TObject);
VAR i : integer; var
i : integer;
begin begin
VarList.Clear; VarList.Clear;
for i := 1 to NoVariables do for i := 1 to NoVariables do
@@ -90,19 +104,16 @@ begin
GroupEdit.Text := ''; GroupEdit.Text := '';
DescChk.Checked := false; DescChk.Checked := false;
LinesChk.Checked := false; LinesChk.Checked := false;
XInBtn.Enabled := true; UpdateBtnStates;
YInBtn.Enabled := true;
GroupInBtn.Enabled := true;
XOutBtn.Enabled := false;
YOutBtn.Enabled := false;
GroupOutBtn.Enabled := false;
end; end;
procedure TMultXvsYFrm.VarListSelectionChange(Sender: TObject; User: boolean); procedure TMultXvsYFrm.VarListSelectionChange(Sender: TObject; User: boolean);
begin begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.GroupInBtnClick(Sender: TObject); procedure TMultXvsYFrm.GroupInBtnClick(Sender: TObject);
var var
i: integer; i: integer;
@@ -116,31 +127,32 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.ComputeBtnClick(Sender: TObject); procedure TMultXvsYFrm.ComputeBtnClick(Sender: TObject);
var 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; 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 begin
MaxGrpSize := 0; MaxGrpSize := 0;
SetLength(selected, 3); MaxX := -Infinity;
MaxX := -1.0e308; MinX := Infinity;
MinX := 1.0e308; MaxY := -Infinity;
MaxY := -1.0e308; MinY := Infinity;
MinY := 1.0e308;
MinGrp := MaxInt; // Get selected variables
MaxGrp := -MaxInt;
XCol := 0; XCol := 0;
YCol := 0; YCol := 0;
GrpCol := 0; GrpCol := 0;
N := 0;
// Get selected variables
for i := 1 to NoVariables do for i := 1 to NoVariables do
begin begin
cellstring := OS3MainFrm.DataGrid.Cells[i,0]; cellstring := OS3MainFrm.DataGrid.Cells[i,0];
@@ -148,68 +160,64 @@ begin
if (cellstring = YEdit.Text) then selected[1] := i; if (cellstring = YEdit.Text) then selected[1] := i;
if (cellstring = GroupEdit.Text) then selected[2] := i; if (cellstring = GroupEdit.Text) then selected[2] := i;
end; end;
XCol := selected[0]; XCol := selected[0];
YCol := selected[1]; YCol := selected[1];
GrpCol := selected[2]; GrpCol := selected[2];
NoSelected := 3;
if (XCol = 0) or (YCol = 0) or (GrpCol = 0) then if (XCol = 0) or (YCol = 0) or (GrpCol = 0) then
begin begin
MessageDlg('No variable selected.', mtError, [mbOK], 0); ErrorMsg('No variable selected.');
exit; exit;
end; end;
// Get number of groups // Get number of groups
MinGrp := MaxInt;
MaxGrp := -MaxInt;
for i := 1 to NoCases do for i := 1 to NoCases do
begin begin
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]); Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]);
if (Grp > MaxGrp) then MaxGrp := Grp; MaxGrp := Max(MaxGrp, Grp);
if (Grp < MinGrp) then MinGrp := Grp; MinGrp := Min(MinGrp, Grp);
end; end;
NoGrps := (MaxGrp - MinGrp) + 1; NoGrps := (MaxGrp - MinGrp) + 1;
lReport := TStringList.Create; SetLength(XValues, NoGrps, NoCases); // NoCases is over-dimensioned and will be trimmed later.
try SetLength(YValues, NoGrps, NoCases); // dto.
lReport.Add('X VERSUS Y FOR GROUPS PLOT');
lReport.Add('');
SetLength(YValues, NoCases+1, NoGrps+1);
SetLength(XValues, NoCases+1, NoGrps+1);
SetLength(Means, 2);
SetLength(StdDevs, 2);
SetLength(NoInGrp, NoGrps); SetLength(NoInGrp, NoGrps);
for i := 0 to NoGrps - 1 do NoInGrp[i] := 0;
for i := 0 to 1 do N := 0;
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 for i := 1 to NoCases do
begin begin
if (not GoodRecord(i,NoSelected,selected))then continue; if (not GoodRecord(i, NoSelected, selected))then continue;
inc(N); 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]); X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol, i]);
if (Y > MaxY) then MaxY := Y; MaxX := Max(MaxX, X);
if (Y < MinY) then MinY := Y; MinX := Min(MinX, X);
Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol,i]); Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol, i]);
Grp := Grp - MinGrp; MaxY := Max(MaxY, Y);
NoInGrp[Grp] := NoInGrp[Grp] + 1; MinY := Min(MinY, Y);
if (NoInGrp[Grp] > MaxGrpSize) then MaxGrpSize := NoInGrp[Grp];
YValues[NoInGrp[Grp]-1,Grp] := Y; Grp := StrToInt(OS3MainFrm.DataGrid.Cells[GrpCol, i]) - MinGrp;
XValues[NoInGrp[Grp]-1,Grp] := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); 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; end;
// get descriptive data // get descriptive data
if (DescChk.Checked) then if DescChk.Checked then
begin begin
for i := 1 to NoCases do for i := 1 to NoCases do
begin begin
@@ -217,60 +225,50 @@ begin
Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]); Y := StrToFloat(OS3MainFrm.DataGrid.Cells[YCol,i]);
X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]); X := StrToFloat(OS3MainFrm.DataGrid.Cells[XCol,i]);
Means[0] := Means[0] + X; Means[0] := Means[0] + X;
StdDevs[0] := StdDevs[0] + X * X; StdDevs[0] := StdDevs[0] + sqr(X);
Means[1] := Means[1] + Y; Means[1] := Means[1] + Y;
StdDevs[1] := StdDevs[1] + Y * Y; StdDevs[1] := StdDevs[1] + sqr(Y);
end; end;
for i := 0 to 1 do for i := 0 to 1 do
begin begin
StdDevs[i] := StdDevs[i] - (Means[i] * Means[i]) / N; StdDevs[i] := StdDevs[i] - sqr(Means[i]) / N;
StdDevs[i] := sqrt(StdDevs[i] / (N - 1)); StdDevs[i] := sqrt(StdDevs[i] / (N - 1));
Means[i] := Means[i] / N; Means[i] := Means[i] / N;
end; 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('VARIABLE MEAN STANDARD DEVIATION');
lReport.Add(' X %9.3f %14.3f', [Means[0], StdDevs[0]]); lReport.Add(' X %9.3f %14.3f', [Means[0], StdDevs[0]]);
lReport.Add(' Y %9.3f %14.3f', [Means[1], StdDevs[1]]); lReport.Add(' Y %9.3f %14.3f', [Means[1], StdDevs[1]]);
lReport.Add(''); lReport.Add('');
DisplayReport(lReport); DisplayReport(lReport);
finally
lReport.Free;
end;
end; end;
// sort on X // sort on X
for i := 0 to NoGrps - 1 do for i := 0 to NoGrps - 1 do
begin SortOnX(XValues[i], YValues[i]);
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; // Plot data
BlankFrm.Show; PlotXY(XValues, YValues{$IFNDEF USE_TACHART}, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps{$ENDIF}, MinGrp);
PlotXY(XValues, YValues, MaxX, MinX, MaxY, MinY, MaxGrpSize, NoGrps, MinGrp);
finally
lReport.Free;
NoInGrp := nil; NoInGrp := nil;
StdDevs := nil;
Means := nil;
XValues := nil; XValues := nil;
YValues := nil; YValues := nil;
end;
end; end;
procedure TMultXvsYFrm.FormActivate(Sender: TObject); procedure TMultXvsYFrm.FormActivate(Sender: TObject);
var var
w: Integer; w: Integer;
@@ -290,18 +288,20 @@ begin
FAutoSized := true; FAutoSized := true;
end; end;
procedure TMultXvsYFrm.FormCreate(Sender: TObject); procedure TMultXvsYFrm.FormCreate(Sender: TObject);
begin begin
Assert(OS3MainFrm <> nil); Assert(OS3MainFrm <> nil);
if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm); if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm);
if BlankFrm = nil then Application.CreateForm(TBlankFrm, BlankFrm);
end; end;
procedure TMultXvsYFrm.FormShow(Sender: TObject); procedure TMultXvsYFrm.FormShow(Sender: TObject);
begin begin
ResetBtnClick(self); ResetBtnClick(self);
end; end;
procedure TMultXvsYFrm.GroupOutBtnClick(Sender: TObject); procedure TMultXvsYFrm.GroupOutBtnClick(Sender: TObject);
begin begin
if GroupEdit.Text <> '' then if GroupEdit.Text <> '' then
@@ -312,6 +312,7 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.HelpBtnClick(Sender: TObject); procedure TMultXvsYFrm.HelpBtnClick(Sender: TObject);
begin begin
if ContextHelpForm = nil then if ContextHelpForm = nil then
@@ -319,6 +320,7 @@ begin
ContextHelpForm.HelpMessage((Sender as TButton).Tag); ContextHelpForm.HelpMessage((Sender as TButton).Tag);
end; end;
procedure TMultXvsYFrm.XInBtnClick(Sender: TObject); procedure TMultXvsYFrm.XInBtnClick(Sender: TObject);
var var
i: integer; i: integer;
@@ -332,6 +334,7 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.XOutBtnClick(Sender: TObject); procedure TMultXvsYFrm.XOutBtnClick(Sender: TObject);
begin begin
if XEdit.Text <> '' then if XEdit.Text <> '' then
@@ -342,6 +345,7 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.YInBtnClick(Sender: TObject); procedure TMultXvsYFrm.YInBtnClick(Sender: TObject);
var var
i: integer; i: integer;
@@ -355,6 +359,7 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TMultXvsYFrm.YOutBtnClick(Sender: TObject); procedure TMultXvsYFrm.YOutBtnClick(Sender: TObject);
begin begin
if YEdit.Text <> '' then if YEdit.Text <> '' then
@@ -365,8 +370,48 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; 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); MaxX, MinX, MaxY, MinY: double; N, NoY, MinGrp: integer);
var var
xpos, ypos, hleft, hright, vtop, vbottom, imagewide : integer; xpos, ypos, hleft, hright, vtop, vbottom, imagewide : integer;
@@ -374,6 +419,12 @@ var
valincr, Yvalue, Xvalue, value : double; valincr, Yvalue, Xvalue, value : double;
Title: string; Title: string;
begin begin
if BlankFrm = nil then
Application.CreateForm(TBlankFrm, BlankFrm)
else
BlankFrm.Image1.Canvas.Clear;
BlankFrm.Show;
Title := LabelEdit.Text; Title := LabelEdit.Text;
BlankFrm.Caption := Title; BlankFrm.Caption := Title;
BlankFrm.Show; BlankFrm.Show;
@@ -460,6 +511,17 @@ begin
BlankFrm.Image1.Canvas.Font.Color := DATA_COLORS[j mod Length(DATA_COLORS)]; BlankFrm.Image1.Canvas.Font.Color := DATA_COLORS[j mod Length(DATA_COLORS)];
Grp := MinGrp + j; Grp := MinGrp + j;
Title := 'GROUP ' + IntToStr(Grp); 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 for i := 1 to N do
begin begin
ypos := vtop + ceil(vhi * ( (MaxY - YValues[i-1,j]) / (MaxY - MinY))); 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.LineTo(xpos, ypos);
BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5); BlankFrm.Image1.Canvas.Ellipse(xpos, ypos, xpos+5, ypos+5);
end; end;
*)
strhi := BlankFrm.Image1.Canvas.TextHeight(Title); strhi := BlankFrm.Image1.Canvas.TextHeight(Title);
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
BlankFrm.Image1.Canvas.Pen.Color := clBlack; BlankFrm.Image1.Canvas.Pen.Color := clBlack;
@@ -480,6 +543,8 @@ begin
BlankFrm.Image1.Canvas.Font.Color := clBlack; BlankFrm.Image1.Canvas.Font.Color := clBlack;
end; end;
{$ENDIF}
procedure TMultXvsYFrm.UpdateBtnStates; procedure TMultXvsYFrm.UpdateBtnStates;
var var
@@ -502,8 +567,6 @@ begin
GroupOutBtn.Enabled := (GroupEdit.Text <> ''); GroupOutBtn.Enabled := (GroupEdit.Text <> '');
end; end;
initialization
{$I multxvsyunit.lrs}
end. end.

View File

@@ -75,6 +75,7 @@ object ChartForm: TChartForm
Caption = 'Close' Caption = 'Close'
Default = True Default = True
ModalResult = 11 ModalResult = 11
OnClick = CloseBtnClick
TabOrder = 2 TabOrder = 2
end end
end end

View File

@@ -6,7 +6,8 @@ interface
uses uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ExtDlgs, TAGraph, TACustomSeries, TASeries, PrintersDlgs, StdCtrls, ExtDlgs, PrintersDlgs,
TAGraph, TACustomSeries, TASeries, TATypes,
Globals; Globals;
type type
@@ -26,6 +27,7 @@ type
PrintDialog: TPrintDialog; PrintDialog: TPrintDialog;
SaveBtn: TButton; SaveBtn: TButton;
SavePictureDialog: TSavePictureDialog; SavePictureDialog: TSavePictureDialog;
procedure CloseBtnClick(Sender: TObject);
procedure FormActivate(Sender: TObject); procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure PrintBtnClick(Sender: TObject); procedure PrintBtnClick(Sender: TObject);
@@ -42,7 +44,7 @@ type
procedure HorLine(y: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String); procedure HorLine(y: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
function PlotXY(AType: TPlotType; x, y: DblDyneVec; LegendTitle: 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 Vertline(x: Double; AColor: TColor; ALineStyle: TPenStyle; ALegendTitle: String);
procedure SetFooter(const ATitle: String); procedure SetFooter(const ATitle: String);
@@ -61,7 +63,7 @@ implementation
uses uses
Math, Printers, OSPrinters, Math, Printers, OSPrinters,
TAChartUtils, TATypes, TADrawerSVG, TAPrint; TAChartUtils, TADrawerSVG, TAPrint;
{ TChartForm } { TChartForm }
@@ -84,6 +86,11 @@ begin
CloseBtn.Constraints.MinWidth := w; CloseBtn.Constraints.MinWidth := w;
end; end;
procedure TChartForm.CloseBtnClick(Sender: TObject);
begin
Close;
end;
procedure TChartForm.FormCreate(Sender: TObject); procedure TChartForm.FormCreate(Sender: TObject);
begin begin
Clear; Clear;
@@ -169,10 +176,9 @@ begin
end; end;
function TChartForm.PlotXY(AType: TPlotType; x, y: DblDyneVec; 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 var
i, n: Integer; i, n: Integer;
s: String;
begin begin
case AType of case AType of
ptLines, ptSymbols, ptLinesAndSymbols: ptLines, ptSymbols, ptLinesAndSymbols:
@@ -184,7 +190,7 @@ begin
if AType in [ptSymbols, ptLinesAndSymbols] then if AType in [ptSymbols, ptLinesAndSymbols] then
begin begin
TLineSeries(Result).Pointer.Brush.Color := AColor; TLineSeries(Result).Pointer.Brush.Color := AColor;
TLineSeries(Result).Pointer.Style := psCircle; TLineSeries(Result).Pointer.Style := ASymbol;
end; end;
end; end;
ptHorBars, ptVertBars: ptHorBars, ptVertBars:
@@ -197,18 +203,11 @@ begin
n := Min(Length(x), Length(y)); n := Min(Length(x), Length(y));
for i := 0 to n-1 do for i := 0 to n-1 do
begin Result.AddXY(x[i], y[i]);
if (xTitles <> nil) and (i <= Length(xTitles)) then
s := xTitles[i]
else
s := '';
Result.AddXY(x[i], y[i], s);
end;
Result.Title := LegendTitle; Result.Title := LegendTitle;
Chart.AddSeries(Result); Chart.AddSeries(Result);
Chart.Legend.Visible := Chart.SeriesCount > 0; Chart.Legend.Visible := Chart.SeriesCount > 0;
Chart.Prepare;
end; end;
procedure TChartForm.SaveBtnClick(Sender: TObject); procedure TChartForm.SaveBtnClick(Sender: TObject);

View File

@@ -5,43 +5,30 @@ unit Globals;
interface interface
uses uses
Classes, SysUtils, Graphics; Classes, SysUtils, Graphics, TATypes;
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;
type 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); TFractionType = (ftPoint, ftComma);
TMissingValueCode = (mvcSpace, mvcPeriod, mvcZero, mvcNines); TMissingValueCode = (mvcSpace, mvcPeriod, mvcZero, mvcNines);
TJustification = (jLeft, jCenter, jRight); TJustification = (jLeft, jCenter, jRight);
@@ -75,12 +62,13 @@ var
LHelpPath: '<default>'; LHelpPath: '<default>';
); );
const const
FractionTypeChars: array[TFractionType] of char = ('.', ','); FractionTypeChars: array[TFractionType] of char = ('.', ',');
MissingValueCodes: array[TMissingValueCode] of string = (' ', '.', '0', '99999'); MissingValueCodes: array[TMissingValueCode] of string = (' ', '.', '0', '99999');
JustificationCodes: array[TJustification] of string[1] = ('L', 'C', 'R'); JustificationCodes: array[TJustification] of string[1] = ('L', 'C', 'R');
TOL = 0.0005;
DEFAULT_CONFIDENCE_LEVEL_PERCENT = 95.0; DEFAULT_CONFIDENCE_LEVEL_PERCENT = 95.0;
DEFAULT_ALPHA_LEVEL = 0.05; DEFAULT_ALPHA_LEVEL = 0.05;
DEFAULT_BETA_LEVEL = 0.20; DEFAULT_BETA_LEVEL = 0.20;
@@ -89,6 +77,9 @@ const
clMaroon, clRed, clBlue, clGreen, clNavy, clTeal, clMaroon, clRed, clBlue, clGreen, clNavy, clTeal,
clAqua, clLime, clFuchsia, clGray, clSilver, clOlive clAqua, clLime, clFuchsia, clGray, clSilver, clOlive
); );
DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond,
psDownTriangle, psHexagon, psFullStar);
DIVIDER = '==========================================================================='; DIVIDER = '===========================================================================';
DIVIDER_SMALL = '---------------------------------------------------------------------------'; DIVIDER_SMALL = '---------------------------------------------------------------------------';