unit UTArrI;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin, Grids, ExtCtrls;

type
  TForm1 = class(TForm)
    GBVector: TGroupBox;
    GBData: TGroupBox;
    SEDim1: TSpinEdit;
    SEDim2: TSpinEdit;
    BDim: TButton;
    GBRun: TGroupBox;
    BRun: TButton;
    CBMethod: TComboBox;
    GBResult: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label3: TLabel;
    GroupBox5: TGroupBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    SGA: TStringGrid;
    SGC: TStringGrid;
    Label5: TLabel;
    STTime: TStaticText;
    procedure BDimClick(Sender: TObject);
    procedure BRunClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Arrays, // Модуль методов сортировки
     Math;   // Для функции Min

{$R *.DFM}

var A: TArrayI2;
    N, M: integer;
    CBArray: array[0..5] of TCheckBox;

function CompareInt(X1, X2: array of integer): boolean;
// Функция сравнения
// Индексы элементов строки, по которым идет сортировка
// определяются состоянием индикаторов CheckBox1 - CheckBox4
// Первый из доступных и включенных индикаторов
// определяет основной критерий,
// следующие - вспомогательные критерии
var i: integer;

function SearchCB:boolean;
// Поиск следующего включенного индикатора
begin
 repeat
  Inc(i);
 until (CBArray[i].Checked or (i = 5) or (i = M-1));
 Result := CBArray[i].Checked;
end;

function Res:boolean;
// Рекурсивно вызываемая функция сравнения двух элементов
begin
 Result := X1[i] >= X2[i];
 if(X1[i] = X2[i])
  then
   if SearchCB
     then Result := Res
     else Result := false;
end;

begin
// Основная функция
 i := -1;
 if SearchCB
   then Result := Res
   else Result := false;
end;

procedure TForm1.BDimClick(Sender: TObject);
var i, j: integer;
begin
 N := SEDim1.Value;
 M := SEDim2.Value;
 STTime.Caption := '';
 // Настройка группы индикаторов
 for i:=1 to 5 do
   CBArray[i].Enabled := M > i;
 // Настройка размеров таблиц массивов
 SGA.Height := Min((N +1)* SGA.DefaultRowHeight + N, 280);
 SGA.RowCount := N;
 SGA.ColCount := M+1;
 SGC.RowCount := N;
 SGC.ColCount := M+1;
 SGC.Height := SGA.Height;

 // Заполнение таблиц
 for i:= 0 to N - 1 do begin
  // Заполнение первого столбца таблиц номерами строк
  SGC.Cells[0, i] := IntToStr(i+1);
  SGA.Cells[0, i] := IntToStr(i+1);
  // Заполнение таблицы SGA случайными числами от 0 до 100
  for j:=0 to M-1 do begin
    SGA.Cells[j+1, i] := IntToStr(Random(100));
    SGC.Cells[j+1, i] := '';
  end;
 end;
// Задание размеров массива
 SetLength(A,N,M);
end;

procedure TForm1.BRunClick(Sender: TObject);
var i, j:integer;
    Index: TArrayI1;
    l: boolean;
    // Переменные для измерения времени расчета
    tbeg, tend: TDateTime;
    Hour, Min, Sec, MSec: word;

begin
// Проверка, включен ли хотя бы 1 индикатор
 l := true;
 for i:=0 to 5 do
   if(CBArray[i].Enabled and CBArray[i].Checked)
     then l := false;
 if l
  then begin
    Application.MessageBox('Не заданы критерии сортировки',
             'Включите индикаторы', MB_OK+MB_ICONSTOP);
    exit;
  end;
 STTime.Caption := '';
// Перенос данных из таблицы в массив
 for i:=0 to N-1 do
  for j:=0 to M-1 do
   A[i,j] := StrToInt(SGA.Cells[j+1, i]);

 tbeg := Time;
 
 // Сортировка 
 case CBMethod.ItemIndex of
  0: Bubble2(A);
  1: MinSort2(A);
  2: Index := Index2(A);
 end;
 tend := Time;
// Пересылка результатов сортировки в таблицу
 if(CBMethod.ItemIndex <> 2)
 then
    for i:=0 to N-1 do
      for j:=0 to M-1 do
        SGC.Cells[j+1, i] := IntToStr(A[i,j])
 else
    for i:=0 to N-1 do
      for j:=0 to M-1 do
        SGC.Cells[j+1, i] := IntToStr(A[Index[i],j]);
 DecodeTime(tend-tbeg, Hour, Min, Sec, MSec);
 STTime.Caption := IntToStr(
      Msec + Sec * 1000 + Min * 60000 + Hour * 3600000);
end;

procedure TForm1.FormCreate(Sender: TObject);
// Обработчик события OnCreate формы
begin
// Включение индикаторов в массив CBArray
 CBArray[0] := CheckBox1;
 CBArray[1] := CheckBox2;
 CBArray[2] := CheckBox3;
 CBArray[3] := CheckBox4;
 CBArray[4] := CheckBox5;
 CBArray[5] := CheckBox6;
// Вызов обработчика щелчка на кнопке BDim,
// чтобы установить размеры и значения массивов по умолчанию
 BDimClick(Sender);
// Задание метода по умолчанию: пузырьковой сортировки
 CBMethod.ItemIndex := 0;
// Задание выдачи сообщений об ошибках
 ShowErrorArray := true;
// Задание CompareInt в качестве функции сравнения
 CompareIArray := CompareInt;
end;

end.
