unit Step3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, MathDef, Step1;

type
  TStepThreeForm = class(TForm)
    BackwardButton: TButton;
    ForwardButton: TButton;
    CancelButton: TButton;
    Panel: TPanel;
    ImgPanel: TPanel;
    Image: TImage;
    TextPanel: TPanel;
    InfoLabel: TLabel;
    Image1: TImage;
    Label1: TLabel;
    Label3: TLabel;
    LBModels: TListBox;
    CBUseDefaultModel: TCheckBox;
    procedure CBUseDefaultModelClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure BackwardButtonClick(Sender: TObject);
    procedure ForwardButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  public
    Result : TDirResult;
  end;

var
  StepThreeForm: TStepThreeForm;

procedure SmartGetKN(var nk,nn:integer);

implementation

uses Step2a, Step2, MiscRoutines;

{$R *.DFM}

procedure TStepThreeForm.CBUseDefaultModelClick(Sender: TObject);
begin
  if(CBUseDefaultModel.Checked) then
  begin
    ForwardButton.Caption:='Готово';
    LBModels.Enabled:=True;
  end
  else
  begin
    LBModels.Enabled:=False;
    ForwardButton.Caption:='Далее >>';
  end;
end;

procedure TStepThreeForm.FormCreate(Sender: TObject);
begin
  LBModels.ItemIndex:=-1;
end;

procedure SmartGetKN(var nk,nn:integer);
var
  ng : integer;
begin
  // Размерность факторного пространства и число опытов: если по гене-
  // ратору - узнаем у генератора, если произвольный план - уже задано.
  // То же - для числа опытов.
  if(StepOneForm.RBCustom.Checked) then
  begin
    nk:=StepTwoForm_A.KEdit.Value;
    nn:=StepTwoForm_A.NEdit.Value;
    exit;
  end;
  if(StepOneForm.RBFromGen.Checked) then
  begin
    ng:=ExternalModules.GenByName(
      StepTwoForm.LBPlans.Items[StepTwoForm.LBPlans.ItemIndex]);
    if(ng=-1) then
    begin
      Warning('Внутренняя ошибка: SGetKN->ExternalModules->GenByName()');
    end;
    ExternalModules.Gens[ng]^.RequiredDimensions(nn,nk);
  end;
end;

procedure TStepThreeForm.FormShow(Sender: TObject);
var
  i : integer;
  m : PModel;
  k,n : integer;
begin
  Result:=wCancel;
  LBModels.Items.Clear;
  if(ExternalModules.ModelCount>0) then
  begin
    SmartGetKN(k,n);
    for i:=0 to ExternalModules.ModelCount-1 do
    begin
      // Допустимы только модели размерности той же, что и факторное
      // пространство
      m:=ExternalModules.Models[i];
      if(m^.RequiredDimension=k) then
        // Число слагаемых в модели не должно превышать числа опытов
        if(m^.AddenCount<=n) then
          LBModels.Items.Add(m^.Description);
    end;
  end;
  if(LBModels.Items.Count>0) then
  begin
    CBUseDefaultModel.Enabled:=True;
    CBUseDefaultModel.Checked:=True;
    CBUseDefaultModelClick(nil);
  end
  else
  begin
    CBUseDefaultModel.Checked:=False;
    CBUseDefaultModel.Enabled:=False;
    CBUseDefaultModelClick(nil);
  end;
end;

procedure TStepThreeForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if((Result=wForward) and (CBUseDefaultModel.Checked)) then
  begin
    if(LBModels.ItemIndex<0) then
    begin
      Warning('Пожалуйста, выберите нужную модель.');
      ActiveControl:=LBModels;
      LBModels.ItemIndex:=0;
      CanClose:=False;
    end;
  end;
end;

procedure TStepThreeForm.BackwardButtonClick(Sender: TObject);
begin
  Result:=wBack;
  Close;
end;

procedure TStepThreeForm.ForwardButtonClick(Sender: TObject);
begin
  Result:=wForward;
  Close;
end;

procedure TStepThreeForm.CancelButtonClick(Sender: TObject);
begin
  Result:=wCancel;
  Close;
end;

procedure TStepThreeForm.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
  188: // '<'
    if(ssCtrl in Shift) then
      BackwardButtonClick(Self);
  190: // '>'
    if(ssCtrl in Shift) then
      ForwardButtonClick(Self);
  VK_ESCAPE:
    begin
      Result:=wCancel;
      Close;
    end;
  end;
end;

end.

