unit UTArrS;

interface

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

type
  TForm1 = class(TForm)
    Label5: TLabel;
    GBVector: TGroupBox;
    SGA: TStringGrid;
    GBData: TGroupBox;
    Label1: TLabel;
    SEDim1: TSpinEdit;
    BDim: TButton;
    GBRun: TGroupBox;
    Label3: TLabel;
    BRun: TButton;
    CBMethod: TComboBox;
    GroupBox5: TGroupBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    GBResult: TGroupBox;
    STTime: TStaticText;
    SGC: TStringGrid;
    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: TArrayS2;
    N: integer;
const M = 2;
      MDep = 7;
      Dep: array[1..MDep] of string =
                ('Бухгалтерия',
                 'Управление',
                 'Цех 1',
                 'Цех 2',
                 'Цех 3',
                 'Цех 4',
                 'Цех 5');
      MFam = 10;
      Fam: array[1..MFam] of string =
                ('Иванов',
                 'Петров',
                 'Сидоров',
                 'Борисов',
                 'Антонов',
                 'Иванова',
                 'Петрова',
                 'Сидорова',
                 'Борисова',
                 'Антонова');

function CompareStr(X1, X2: array of string): boolean;
// Функция сравнения
// Индексы элементов, по которым идет сортировка
// определяются состоянием индикаторов CheckBox1 и CheckBox2
// Первый включенный индикатор
// определяет основной критерий,
// следующий - вспомогательный критерий
begin
 Result := false;
 if (Form1.CheckBox1.Checked)
  then begin
   if(AnsiCompareText(X1[0],X2[0]) >= 0)
    then Result := true
    else Result := false;
   if (Form1.CheckBox2.Checked and
          (AnsiCompareText(X1[0],X2[0]) = 0))
    then if(AnsiCompareText(X1[1],X2[1]) >= 0)
          then Result := true
          else Result := false;
  end
  else
   if (Form1.CheckBox2.Checked)
    then if(AnsiCompareText(X1[1],X2[1]) >= 0)
          then Result := true
          else Result := false;
end;

procedure TForm1.BDimClick(Sender: TObject);
var i: integer;
begin
 N := SEDim1.Value;
 STTime.Caption := '';
 // Настройка размеров таблиц массивов
 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.Cells[1, i] := Dep[1+Random(MDep)];
  SGA.Cells[2, i] := Fam[1+Random(MFam)];
  SGC.Cells[1, i] := '';
  SGC.Cells[2, i] := '';
 end;
// Задание размеров массива
 SetLength(A,N,M);
end;

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

begin
// Проверка, включен ли хотя бы 1 индикатор
 if not (CheckBox1.Checked or CheckBox2.Checked)
  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] := 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] := A[i,j]
 else
    for i:=0 to N-1 do
      for j:=0 to M-1 do
        SGC.Cells[j+1, i] := 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
// Вызов обработчика щелчка на кнопке BDim,
// чтобы установить размеры и значения массивов по умолчанию
 BDimClick(Sender);
// Задание метода по умолчанию: пузырьковой сортировки
 CBMethod.ItemIndex := 0;
// Задание выдачи сообщений об ошибках
 ShowErrorArray := true;
// Задание CompareInt в качестве функции сравнения
 CompareSArray := CompareStr;
end;

end.
