Advertisement
ksyshshot

Lab.3.3.F

Feb 7th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.96 KB | Source Code | 0 0
  1. unit Lab_3_3_Form;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.Menus;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     ButtonFile: TMenuItem;
  13.     ButtonOpenFile: TMenuItem;
  14.     ButtonSaveFile: TMenuItem;
  15.     ButtonInstruction: TMenuItem;
  16.     ButtonAbout: TMenuItem;
  17.     OpenDialog1: TOpenDialog;
  18.     SaveDialog1: TSaveDialog;
  19.     LabelTask: TLabel;
  20.     LabelSizeArray: TLabel;
  21.     EditSizeArray: TEdit;
  22.     ButtonCreateSpreadSheep: TButton;
  23.     StringGridArray: TStringGrid;
  24.     ButtonSort: TButton;
  25.     MemoSort: TMemo;
  26.     EditSortedArray: TEdit;
  27.     LabelProcess: TLabel;
  28.     LabelSortedArray: TLabel;
  29.     procedure EditSizeArrayKeyPress(Sender: TObject; var Key: Char);
  30.     procedure ButtonCreateSpreadSheepClick(Sender: TObject);
  31.     procedure EditSizeArrayChange(Sender: TObject);
  32.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  33.     procedure StringGridArrayKeyPress(Sender: TObject; var Key: Char);
  34.     procedure StringGridArraySelectCell(Sender: TObject; ACol, ARow: Integer;
  35.       var CanSelect: Boolean);
  36.     procedure ButtonSortClick(Sender: TObject);
  37.     procedure ButtonInstructionClick(Sender: TObject);
  38.     procedure ButtonAboutClick(Sender: TObject);
  39.     procedure ButtonOpenFileClick(Sender: TObject);
  40.     procedure ButtonSaveFileClick(Sender: TObject);
  41.   private
  42.     { Private declarations }
  43.   public
  44.     { Public declarations }
  45.   end;
  46.  
  47. var
  48.   Form1: TForm1;
  49.  
  50. implementation
  51.  
  52. {$R *.dfm}
  53.  
  54. uses UnitAbout, UnitError, UnitExit, UnitInstruction_3_3;
  55.  
  56. const
  57.     MIN_ELEMENT = -20;
  58.     MAX_ELEMENT = 20;
  59.     MIN_SIZE = 1;
  60.     MAX_SIZE = 20;
  61.  
  62. Type
  63.     TArr = Array Of Integer;
  64. Var
  65.     LengthArr: Integer;
  66.     Arr: TArr;
  67.  
  68. function FillArr(Sender: TObject; ArrLen: Integer; SprSheep: TStringGrid; var IsCorrect: Boolean): TArr;
  69. var
  70.     I: Integer;
  71.     A: TArr;
  72. begin
  73.     SetLength(A, LengthArr);
  74.     I := 1;
  75.     IsCorrect := True;
  76.     while (IsCorrect) and (I <= ArrLen)do
  77.     begin
  78.         try
  79.             A[I - 1] := StrToInt(SprSheep.Cells[I, 1]);
  80.         except
  81.             IsCorrect := False;
  82.             UnitError.FormError.LabelError.Caption := 'Ошибка! Получено некорректное значение элемента массива!';
  83.             UnitError.FormError.ShowModal();
  84.         end;
  85.         Inc(I);
  86.     end;
  87.     FillArr := A;
  88. end;
  89.  
  90.  
  91. procedure FillNumbersSpreadSheep(Sender: TObject; ArrLen: Integer; SprSheep: TStringGrid);
  92. var
  93.     I: Integer;
  94.     CanChange: Boolean;
  95. begin
  96.     for I := 1 to ArrLen do
  97.     begin
  98.         SprSheep.Cells[I, 0] := '№' + IntToStr(I);
  99.     end;
  100. end;
  101.  
  102.  
  103. procedure TForm1.ButtonAboutClick(Sender: TObject);
  104. begin
  105.     UnitAbout.FormAbout.ShowModal();
  106. end;
  107.  
  108. procedure TForm1.ButtonCreateSpreadSheepClick(Sender: TObject);
  109. var
  110.     IsCorrect: Boolean;
  111.     I: Integer;
  112. begin
  113.     ButtonCreateSpreadSheep.Enabled := False;
  114.     IsCorrect := True;
  115.     try
  116.         LengthArr := StrToInt(EditSizeArray.Text);
  117.     except
  118.         IsCorrect := False;
  119.         UnitError.FormError.LabelError.Caption := 'Ошибка! Получено некорректное значение длины массива!';
  120.         UnitError.FormError.ShowModal();
  121.     end;
  122.     if (IsCorrect) then
  123.     begin
  124.         StringGridArray.ColCount := LengthArr + 1;
  125.         SetLength(Arr, LengthArr);
  126.         StringGridArray.ColWidths[0] := 85;
  127.         StringGridArray.Cells[0,0] := '№ элемента';
  128.         StringGridArray.Cells[0,1] := 'Элемент';
  129.         FillNumbersSpreadSheep(Sender, LengthArr, StringGridArray);
  130.         StringGridArray.Visible := True;
  131.         StringGridArray.Enabled := True;
  132.         for I := 1 to LengthArr do
  133.         begin
  134.             StringGridArraySelectCell(Sender, I, 1, IsCorrect);
  135.         end;
  136.         ButtonSort.Visible := True;
  137.         ButtonSort.Enabled := True;
  138.     end;
  139. end;
  140.  
  141. Procedure WriteArr(Arr: TArr; var Memo: TMemo);
  142. Var
  143.     I: Integer;
  144.     Str: String;
  145. Begin
  146.     For I := 0 To High(Arr) Do
  147.         Str := Str + IntToStr(Arr[I]) + ' ';
  148.     Memo.Lines.Add(Str);
  149. End;
  150.  
  151. Procedure Sort(Var Arr: TArr; var Memo: TMemo);
  152. Var
  153.     I, J, X: Integer;
  154. Begin
  155.     For I := 1 To High(Arr) Do
  156.     Begin
  157.         X := Arr[I];
  158.         J := I;
  159.         While (J > 0) And (Arr[J - 1] > X) Do
  160.         Begin
  161.             Arr[J] := Arr[J - 1];
  162.             Dec(J);
  163.         End;
  164.         Arr[J] := X;
  165.         WriteArr(Arr, Memo);
  166.     End;
  167. End;
  168.  
  169. procedure TForm1.ButtonInstructionClick(Sender: TObject);
  170. begin
  171.     UnitInstruction_3_3.FormInstruction_3_3.ShowModal();
  172. end;
  173.  
  174. procedure TForm1.ButtonOpenFileClick(Sender: TObject);
  175. var
  176.     F: TextFile;
  177.     Path, Error: String;
  178.     I, Res, Size: Integer;
  179.     IsCorrect: Boolean;
  180.     A: TArr;
  181. begin
  182.     IsCorrect := True;
  183.     Error := '';
  184.     Res := 0;
  185.     Size := 0;
  186.     If OpenDialog1.Execute() Then
  187.     Begin
  188.         Path := OpenDialog1.FileName;
  189.         AssignFile(F, Path);
  190.         Try
  191.             Reset(F);
  192.             Try
  193.                 Readln(F, Size);
  194.                 if (Size < MIN_SIZE) or (Size > MAX_SIZE) then
  195.                 begin
  196.                     IsCorrect := False;
  197.                     Error := Error + 'Размер массива за пределами диапазона допустимых значений. ';
  198.                 end;
  199.                 I := 0;
  200.                 SetLength(A, Size);
  201.                 While (IsCorrect) and (I < Size) Do
  202.                 Begin
  203.                     Read(F, A[I]);
  204.                     If (A[I] < MIN_ELEMENT) Or (A[I] > MAX_ELEMENT) Then
  205.                     Begin
  206.                         IsCorrect := False;
  207.                         Error := Error + 'Размер элемента за пределами диапазона допустимых значений. ';
  208.                     End;
  209.                     if (I < High(A)) and (EOF(F)) then
  210.                     begin
  211.                         IsCorrect := False;
  212.                         Error := Error + 'Недостаточно элементов в файле. ';
  213.                     end;
  214.                     Inc(I);
  215.                 End;
  216.             Finally
  217.                 CloseFile(F);
  218.             End;
  219.         Except
  220.             IsCorrect := False;
  221.             Error := Error + 'Нет доступа к файлу';
  222.         End;
  223.         If not(IsCorrect) Then
  224.         Begin
  225.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  226.             Res := UnitError.FormError.ShowModal();
  227.         End;
  228.         if Res > 0 Then
  229.             UnitError.FormError.LabelError.Caption := ''
  230.         else
  231.         begin
  232.             LengthArr := Size;
  233.             EditSizeArray.Text := IntToStr(Size);
  234.             ButtonCreateSpreadSheepClick(Sender);
  235.             for I := 1 to LengthArr do
  236.             begin
  237.                 StringGridArray.Cells[I, 1] := IntToStr(A[I - 1]);
  238.             end;
  239.         end;
  240.     End;
  241. end;
  242.  
  243. procedure TForm1.ButtonSaveFileClick(Sender: TObject);
  244. var
  245.     F: TextFile;
  246.     Path, Error: String;
  247.     Res, Answer: Integer;
  248.     IsCorrect: Boolean;
  249. begin
  250.     IsCorrect := True;
  251.     Res := 0;
  252.     Error := '';
  253.     if SaveDialog1.Execute() then
  254.     begin
  255.         Path := SaveDialog1.FileName;
  256.         AssignFile(F, Path);
  257.         Try
  258.             Rewrite(F);
  259.             Try
  260.                 Write(F, 'Отсортированный массив: ', EditSortedArray.Text)
  261.             Finally
  262.                 CloseFile(F);
  263.             End;
  264.         Except
  265.             IsCorrect := False;
  266.             Error := 'Нет доступа к файлу';
  267.         End;
  268.         if not(IsCorrect) then
  269.         begin
  270.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  271.             Res := UnitError.FormError.ShowModal();
  272.         end;
  273.         if Res > 0 Then
  274.             UnitError.FormError.LabelError.Caption := '';
  275.     end;
  276. end;
  277.  
  278. procedure TForm1.ButtonSortClick(Sender: TObject);
  279. var
  280.     I: Integer;
  281.     IsFill, IsCorrect: Boolean;
  282. begin
  283.     for I := 1 to LengthArr do
  284.         if (StringGridArray.Cells[I, 1].IsEmpty) then
  285.             IsFill := False
  286.         else
  287.             IsFill := True;
  288.     if (IsFill) then
  289.         Arr := FillArr(Sender, LengthArr, StringGridArray, IsCorrect)
  290.     else
  291.     begin
  292.         UnitError.FormError.LabelError.Caption := 'Ошибка! Получено недостаточное количество элементов массива!';
  293.         UnitError.FormError.ShowModal();
  294.         IsCorrect := False;
  295.     end;
  296.     if (IsCorrect) then
  297.     begin
  298.         ButtonSaveFile.Enabled := True;
  299.         LabelSortedArray.Visible := True;
  300.         EditSortedArray.Visible := True;
  301.         MemoSort.Text := '';
  302.         MemoSort.Visible := True;
  303.         LabelProcess.Visible := True;
  304.         EditSortedArray.Visible := true;
  305.         WriteArr(Arr, MemoSort);
  306.         Sort(Arr, MemoSort);
  307.         for I := 0 to High(Arr) do
  308.             EditSortedArray.Text := EditSortedArray.Text + IntToStr(Arr[I]) + ' ';
  309.     end;
  310. end;
  311.  
  312. procedure TForm1.EditSizeArrayChange(Sender: TObject);
  313. var
  314.     I, J: Integer;
  315. begin
  316.     ButtonCreateSpreadSheep.Enabled := True;
  317.     StringGridArray.Visible := False;
  318.     StringGridArray.Enabled := False;
  319.     ButtonSaveFile.Enabled := False;
  320.     ButtonSort.Visible := False;
  321.     ButtonSort.Enabled := False;
  322.     LabelSortedArray.Visible := False;
  323.     EditSortedArray.Visible := False;
  324.     EditSortedArray.Text := '';
  325.     LabelProcess.Visible := False;
  326.     MemoSort.Visible := False;
  327.     LabelProcess.Visible := False;
  328.     for I := 0 to StringGridArray.ColCount - 1 do
  329.         for J := 0 to StringGridArray.RowCount - 1 do
  330.             StringGridArray.Cells[I, J] := '';
  331.     if EditSizeArray.Text = '' then
  332.     begin
  333.         ButtonCreateSpreadSheep.Enabled := False;
  334.     end;
  335. end;
  336.  
  337. procedure TForm1.EditSizeArrayKeyPress(Sender: TObject; var Key: Char);
  338. var
  339.     Number: Integer;
  340. begin
  341.     if not(Key in ['0'..'9', #8, #13])then
  342.         Key := #0;
  343.     if (Length(EditSizeArray.Text) = 0) and (Key = '0') Then
  344.         Key := #0;
  345.     if (Length(EditSizeArray.Text) = 1) and (EditSizeArray.Text[1] = '2') and (Key in ['1'..'9']) then
  346.         Key := #0;
  347.     if (Length(EditSizeArray.Text) = 1) and not(EditSizeArray.Text[1] in ['2', '1']) and (Key in ['0'..'9']) then
  348.         Key := #0;
  349.     if (Length(EditSizeArray.Text) > 0) and (Key = #13) then
  350.         ButtonCreateSpreadSheepClick(Sender);
  351. end;
  352.  
  353. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  354. Var
  355.     Res: Integer;
  356. begin
  357.     Res := UnitExit.FormExit.ShowModal();
  358.     If Res = mrOk Then
  359.         CanClose := True
  360.     Else
  361.         CanClose := False;
  362. end;
  363.  
  364. procedure TForm1.StringGridArrayKeyPress(Sender: TObject; var Key: Char);
  365. var
  366.     MaxLength: Integer;
  367. begin
  368.     if not(Key in ['0'..'9', '-', #8, #13])then
  369.         Key := #0;
  370.     MaxLength := 2;
  371.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) > 0) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][1] = '-') then
  372.         MaxLength := 3;
  373.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) > 0) and (Key = '-') then
  374.         Key := #0;
  375.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) > 0) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][1] = '0') and not(Key = #8) Then
  376.         Key := #0;
  377.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = 1) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][1] = '2') and (Key in ['1'..'9']) then
  378.         Key := #0;
  379.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = 1) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][1] in ['3'..'9']) and (Key in ['0'..'9']) then
  380.         Key := #0;
  381.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = 2) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row] = '-2') and not(Key in ['0', #8]) then
  382.         Key := #0;
  383.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = 1) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row] = '-') and (Key = '0') then
  384.         Key := #0;
  385.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = 2) and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][1] = '-') and (StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row][2] in ['3'..'9']) and (Key in ['0'..'9']) then
  386.         Key := #0;
  387.     if (Length(StringGridArray.Cells[StringGridArray.Col, StringGridArray.Row]) = MaxLength) and not(Key = #8)then
  388.         Key := #0;
  389. end;
  390.  
  391. procedure TForm1.StringGridArraySelectCell(Sender: TObject; ACol, ARow: Integer;
  392.   var CanSelect: Boolean);
  393. begin
  394.     if (ACol = 0) or (ARow = 0) then
  395.         CanSelect := False;
  396. end;
  397.  
  398. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement