unit Step4;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Spin, MathDef, Step1, Step3, MiscRoutines, BadAddens,
  SharedData;

type
  TStepFourForm = class(TForm)
    BackwardButton: TButton;
    ForwardButton: TButton;
    CancelButton: TButton;
    Panel: TPanel;
    ImgPanel: TPanel;
    Image: TImage;
    TextPanel: TPanel;
    InfoLabel: TLabel;
    LnAddens: TLabel;
    SEnAddens: TSpinEdit;
    LIndex: TLabel;
    Bevel1: TBevel;
    SEIndex: TSpinEdit;
    LBFunctions: TListBox;
    LFunction: TLabel;
    EAdden: TEdit;
    Label1: TLabel;
    procedure SEnAddensChange(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SEIndexChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure LBFunctionsClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BackwardButtonClick(Sender: TObject);
    procedure ForwardButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
    procedure SEnAddensExit(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
  public
    Result   : TDirResult;
    Addens   : TList;
  end;

var
  StepFourForm: TStepFourForm;

implementation

{$R *.DFM}

procedure TStepFourForm.SEnAddensChange(Sender: TObject);
begin
  if(Length(SEnAddens.Text)>6) then SEnAddens.Value:=SEnAddens.MaxValue;
  if(not (Length(SEnAddens.Text) in [1..6])) then exit;
  if(not (Length(SEIndex.Text) in [1..6])) then
  begin
    SEIndex.Value:=1;
  end
  else
  begin
    if(SEIndex.Value>SEnAddens.Value) then
      SEIndex.Value:=SEnAddens.Value;
  end;
  SEIndex.MaxValue:=SEnAddens.Value;
  Addens.Count:=SEnAddens.Value;
end;

procedure TStepFourForm.FormShow(Sender: TObject);
var
  i : integer;
  count : integer;
  k,n : integer;
begin
  Result:=wCancel;
  LBFunctions.Items.Clear;
  count:=0;
  SmartGetKN(k,n);
  // Максимальное количество слагаемых равно числу опытов, но не более 256
  if(n>MaximumAddens) then
    SEnAddens.MaxValue:=MaximumAddens
  else
    SEnAddens.MaxValue:=n;
  if SEnAddens.Value > SEnAddens.MaxValue then
    SEnAddens.Value:=SEnAddens.MaxValue;
  SEnAddensChange(nil);
  // Допустимы только слагаемые пространств размерности не выше факторного
  for i:=0 to ExternalModules.AddenCount-1 do
  begin
    if(ExternalModules.Addens[i]^.RequiredDimension<=k) then
    begin
      LBFunctions.Items.Add(ExternalModules.Addens[i]^.Description);
      SendMessage(LBFunctions.Handle,LB_SETITEMDATA,count,integer(ExternalModules.Addens[i]));
      Inc(count);
    end;
  end;
  LBFunctions.ItemIndex:=-1;
  if(count=0) then
    ForwardButton.Enabled:=False
  else
    ForwardButton.Enabled:=True;
end;

procedure TStepFourForm.SEIndexChange(Sender: TObject);
var
  a,al : PAdden;
  i : integer;
begin
  LBFunctions.ItemIndex:=-1;
  if(Length(SEIndex.Text)>6) then SEIndex.Value:=SEIndex.MaxValue;
  if(not (Length(SEIndex.Text) in [1..6])) then exit;
  if(SEIndex.Value>SEIndex.MaxValue) then
    SEIndex.Value:=SEIndex.MaxValue;
  a:=PAdden(Addens[SEIndex.Value-1]);
  // Если слагаемое этому номеру еще на назначено - скрываем указатель
  if(a=nil) then exit;
  // Слагаемое уже назначено. Ищем в списке его описание, ставим туда
  // указатель.
  for i:=0 to LBFunctions.Items.Count-1 do
  begin
    al:=PAdden(SendMessage(LBFunctions.Handle,LB_GETITEMDATA,i,0));
    if(al=a) then
    begin
      LBFunctions.ItemIndex:=i;
      exit;
    end;
  end;
end;

procedure TStepFourForm.FormCreate(Sender: TObject);
begin
  Addens:=TList.Create;
  Addens.Clear;
end;

procedure TStepFourForm.LBFunctionsClick(Sender: TObject);
var
 a:PAdden;
begin
  if(not (Length(SEIndex.Text) in [1..6])) then exit;
  a:=PAdden(SendMessage(LBFunctions.Handle,LB_GETITEMDATA,
    LBFunctions.ItemIndex,0));
  EAdden.Text:=a^.StdName;
  Addens[SEIndex.Value-1]:=a;
end;

procedure TStepFourForm.FormDestroy(Sender: TObject);
begin
  Addens.Destroy;
end;

procedure TStepFourForm.BackwardButtonClick(Sender: TObject);
begin
  SEIndex.Value:=ValidInteger(SEIndex);
  SEnAddens.Value:=ValidInteger(SEnAddens);
  Result:=wBack;
  Close;
end;

procedure TStepFourForm.ForwardButtonClick(Sender: TObject);
var
  i : integer;
  found_bad : integer;
begin
  found_bad:=0;
  BadAddensForm.LBBadAddens.Clear;
  for i:=0 to Addens.Count-1 do
  begin
    if(Addens[i]=nil) then
    begin
      found_bad:=found_bad+1;
      BadAddensForm.LBBadAddens.Items.Add('Слагаемое № '+IntToStr(i+1));
    end;
  end;
  if(found_bad>0) then
  begin
    BadAddensForm.ShowModal;
    ActiveControl:=LBFunctions;
    exit;
  end;
  Result:=wForward;
  Close;
end;

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

procedure TStepFourForm.SEnAddensExit(Sender: TObject);
begin
  try
    if((SEnAddens.Text<>'')and(SEnAddens.Value=SEnAddens.MaxValue)) then
      SEnAddens.Value:=SEnAddens.MaxValue;
  except
    on EConvertError do
    begin
      SEnAddens.Text:='';
    end;
  end;
end;

procedure TStepFourForm.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
      BackwardButtonClick(Self);
      Result:=wCancel;
      Close;
    end;
  end;
end;

end.

