Files
lazarus-ccr/applications/lazstats/source/forms/analysis/comparisons/latinspecsunit.pas
2020-05-11 16:21:39 +00:00

416 lines
9.6 KiB
ObjectPascal

unit LatinSpecsUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, Buttons,
MainUnit, Globals;
type
{ TLatinSpecsFrm }
TLatinSpecsFrm = class(TForm)
AInBtn: TBitBtn;
nPerCellEdit: TEdit;
GrpOutBtn: TBitBtn;
DataInBtn: TBitBtn;
DataOutBtn: TBitBtn;
AOutBtn: TBitBtn;
BInBtn: TBitBtn;
BOutBtn: TBitBtn;
CInBtn: TBitBtn;
COutBtn: TBitBtn;
DInBtn: TBitBtn;
DOutBtn: TBitBtn;
GrpInBtn: TBitBtn;
Label8: TLabel;
PanelA: TPanel;
PanelB: TPanel;
PanelC: TPanel;
PanelD: TPanel;
PanelGrp: TPanel;
PanelDep: TPanel;
Panel7: TPanel;
ResetBtn: TButton;
CancelBtn: TButton;
OKBtn: TButton;
ACodeEdit: TEdit;
BCodeEdit: TEdit;
CCodeEdit: TEdit;
DCodeEdit: TEdit;
GrpCodeEdit: TEdit;
DepVarEdit: TEdit;
Label1: TLabel;
ACodeLabel: TLabel;
BCodeLabel: TLabel;
CCodeLabel: TLabel;
DCodeLabel: TLabel;
GrpCodeLabel: TLabel;
DepVarLabel: TLabel;
VarList: TListBox;
Bevel1: TBevel;
procedure AInBtnClick(Sender: TObject);
procedure AOutBtnClick(Sender: TObject);
procedure BInBtnClick(Sender: TObject);
procedure BOutBtnClick(Sender: TObject);
procedure CInBtnClick(Sender: TObject);
procedure COutBtnClick(Sender: TObject);
procedure DataInBtnClick(Sender: TObject);
procedure DataOutBtnClick(Sender: TObject);
procedure DInBtnClick(Sender: TObject);
procedure DOutBtnClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure GrpInBtnClick(Sender: TObject);
procedure GrpOutBtnClick(Sender: TObject);
procedure OKBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
procedure VarListSelectionChange(Sender: TObject; User: boolean);
private
{ private declarations }
FAutoSized: Boolean;
procedure UpdateBtnStates;
function Validate(out AMsg: String; out AControl: TWinControl): Boolean;
public
{ public declarations }
procedure PrepareForPlan(APlan: integer);
end;
var
LatinSpecsFrm: TLatinSpecsFrm;
implementation
uses
Math,
Utils, LatinSqrsUnit;
{ TLatinSpecsFrm }
procedure TLatinSpecsFrm.PrepareForPlan(APlan: Integer);
begin
ResetBtnClick(nil);
case APlan of
1: begin
PanelD.Visible := false;
PanelGrp.Visible := false;
end;
2: begin
PanelD.Visible := true;
PanelGrp.Visible := false;
end;
3: begin
PanelD.Visible := true;
PanelGrp.Visible := false;
end;
4: begin
PanelD.Visible := true;
PanelGrp.Visible := false;
end;
5: begin
PanelD.Visible := false;
PanelGrp.Visible := true;
end;
6: begin
PanelD.Visible := false;
PanelGrp.Visible := true;
end;
7: begin
PanelD.Visible := true;
PanelGrp.Visible := true;
end;
9: begin
PanelD.Visible := true;
PanelGrp.Visible := true;
end;
end;
end;
procedure TLatinSpecsFrm.ResetBtnClick(Sender: TObject);
var
i: integer;
begin
VarList.Clear;
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
ACodeEdit.Text := '';
BCodeEdit.Text := '';
CCodeEdit.Text := '';
DCodeEdit.Text := '';
GrpCodeEdit.Text := '';
DepVarEdit.Text := '';
nPerCellEdit.Text := '';
UpdatebtnStates;
end;
procedure TLatinSpecsFrm.FormActivate(Sender: TObject);
var
w: Integer;
begin
if FAutoSized then
exit;
w := MaxValue([ResetBtn.Width, CancelBtn.Width, OKBtn.Width]);
ResetBtn.Constraints.MinWidth := w;
CancelBtn.Constraints.MinWidth := w;
OKBtn.Constraints.MinWidth := w;
VarList.Constraints.MinHeight := Panel7.Height;
Constraints.MinWidth := nPerCellEdit.Left + nPerCellEdit.Width + Width - ResetBtn.Left + ResetBtn.BorderSpacing.Left;
Constraints.MinHeight := Height;
FAutoSized := true;
end;
procedure TLatinSpecsFrm.FormCreate(Sender: TObject);
begin
Assert(OS3MainFrm <> nil);
end;
procedure TLatinSpecsFrm.FormShow(Sender: TObject);
begin
ResetBtnClick(Self);
end;
procedure TLatinSpecsFrm.AInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (ACodeEdit.Text = '') then
begin
ACodeEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.AOutBtnClick(Sender: TObject);
begin
if ACodeEdit.Text <> '' then
begin
VarList.Items.Add(ACodeEdit.Text);
ACodeEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.BInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (BCodeEdit.Text = '') then
begin
BCodeEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.BOutBtnClick(Sender: TObject);
begin
if BCodeEdit.Text <> '' then
begin
VarList.Items.Add(BCodeEdit.Text);
BCodeEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.CInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (CCodeEdit.Text = '') then
begin
CCodeEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.COutBtnClick(Sender: TObject);
begin
if CCodeEdit.Text <> '' then
begin
VarList.Items.Add(CCodeEdit.Text);
CCodeEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.DataInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (DepVarEdit.Text = '') then
begin
DepVarEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.DataOutBtnClick(Sender: TObject);
begin
if DepVarEdit.Text <> '' then
begin
VarList.Items.Add(DepVarEdit.Text);
DepVarEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.DInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (DCodeEdit.Text = '') then
begin
DCodeEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.DOutBtnClick(Sender: TObject);
begin
if DCodeEdit.Text <> '' then
begin
VarList.Items.Add(DCodeEdit.Text);
DCodeEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.GrpInBtnClick(Sender: TObject);
var
index: integer;
begin
index := VarList.ItemIndex;
if (index > -1) and (GrpCodeEdit.Text = '') then
begin
GrpCodeEdit.Text := VarList.Items[index];
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.GrpOutBtnClick(Sender: TObject);
begin
if GrpCodeEdit.Text <> '' then
begin
VarList.Items.Add(GrpCodeEdit.Text);
GrpCodeEdit.Text := '';
UpdateBtnStates;
end;
end;
procedure TLatinSpecsFrm.OKBtnClick(Sender: TObject);
var
C: TWinControl;
msg: String;
begin
if not Validate(msg, C) then begin
C.SetFocus;
ErrorMsg(msg);
ModalResult := mrNone;
end;
end;
procedure TLatinSpecsFrm.UpdateBtnStates;
begin
AInBtn.Enabled := (VarList.ItemIndex > -1) and (ACodeEdit.Text = '');
BInBtn.Enabled := (VarList.ItemIndex > -1) and (BCodeEdit.Text = '');
CInBtn.Enabled := (VarList.ItemIndex > -1) and (CCodeEdit.Text = '');
DInBtn.Enabled := (VarList.ItemIndex > -1) and (DCodeEdit.Text = '');
GrpInBtn.Enabled := (VarList.ItemIndex > -1) and (GrpCodeEdit.Text = '');
DataInBtn.Enabled := (VarList.ItemIndex > -1) and (DepVarEdit.Text = '');
AOutBtn.Enabled := (ACodeEdit.Text <> '');
BOutBtn.Enabled := (BCodeEdit.Text <> '');
COutBtn.Enabled := (CCodeEdit.Text <> '');
DOutBtn.Enabled := (DCodeEdit.Text <> '');
GrpOutBtn.Enabled := (GrpCodeEdit.Text <> '');
DataOutBtn.Enabled := (DepVarEdit.Text <> '');
end;
function TLatinSpecsFrm.Validate(out AMsg: String; out AControl: TWinControl): Boolean;
var
n: Integer;
begin
Result := false;
if (nPerCellEdit.Text = '') then begin
AMsg := 'Please specify the number of cases per cell.';
AControl := nPercellEdit;
exit;
end;
if not TryStrToInt(nPerCellEdit.Text, n) or (n <= 0) then begin
AMsg := 'Please specify a valid (positive) number for the cases per cell.';
AControl := nPercellEdit;
exit;
end;
if PanelA.Visible and (ACodeEdit.Text = '') then
begin
AMsg := 'Factor A code variable is not specified.';
AControl := ACodeEdit;
exit;
end;
if PanelB.Visible and (BCodeEdit.Text = '') then
begin
AMsg := 'Factor B code variable is not specified.';
Acontrol := BCodeEdit;
exit;
end;
if PanelC.Visible and (CCodeEdit.Text = '') then
begin
AMsg := 'Factor C code variable is not specified.';
Acontrol := CCodeEdit;
exit;
end;
if PanelD.Visible and (DCodeEdit.Text = '') then
begin
AMsg := 'Factor D code variable is not specified.';
Acontrol := DCodeEdit;
exit;
end;
if PanelGrp.Visible and (GrpCodeEdit.Text = '') then
begin
AMsg := 'Group code variable is not specified.';
Acontrol := GrpCodeEdit;
exit;
end;
if PanelDep.Visible and (DepVarEdit.Text = '') then
begin
AMsg := 'Dependent variable is not specified.';
Acontrol := DepVarEdit;
exit;
end;
Result := true;
end;
procedure TLatinSpecsFrm.VarListSelectionChange(Sender: TObject; User: boolean);
begin
UpdateBtnStates;
end;
initialization
{$I latinspecsunit.lrs}
end.