Advertisement
ksyshshot

7.2

Jun 7th, 2023
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.16 KB | Source Code | 0 0
  1. unit UnitMain;
  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.ExtCtrls, Vcl.StdCtrls, Vcl.Grids,
  8.   Vcl.Menus;
  9.  
  10. type
  11.   TFormMain = class(TForm)
  12.     StringGrid: TStringGrid;
  13.     Edit: TEdit;
  14.     Label1: TLabel;
  15.     ButtonCreate: TButton;
  16.     ButtonFind: TButton;
  17.     MatrixGrid: TStringGrid;
  18.     MainMenu: TMainMenu;
  19.     OpenDialog: TOpenDialog;
  20.     SaveDialog: TSaveDialog;
  21.     NFile: TMenuItem;
  22.     NInstruction: TMenuItem;
  23.     NAbout: TMenuItem;
  24.     NOpenFile: TMenuItem;
  25.     NSaveFile: TMenuItem;
  26.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  27.     procedure EditChange(Sender: TObject);
  28.     procedure ButtonCreateClick(Sender: TObject);
  29.     procedure StringGridKeyPress(Sender: TObject; var Key: Char);
  30.     procedure StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
  31.       var CanSelect: Boolean);
  32.     procedure Button2Click(Sender: TObject);
  33.     procedure ButtonFindClick(Sender: TObject);
  34.     procedure NInstructionClick(Sender: TObject);
  35.     procedure NAboutClick(Sender: TObject);
  36.     procedure NOpenFileClick(Sender: TObject);
  37.     procedure NSaveFileClick(Sender: TObject);
  38.   private
  39.     { Private declarations }
  40.   public
  41.     { Public declarations }
  42.   end;
  43.  
  44. var
  45.   FormMain: TFormMain;
  46.  
  47. implementation
  48.  
  49. {$R *.dfm}
  50.  
  51. uses UnitAbout, UnitError, UnitExit, UnitInstruction_7_2;
  52.  
  53. type
  54.     TArr = Array of Integer;
  55.     TMatrix = Array of TArr;
  56.  
  57. var
  58.     Count: Integer;
  59.  
  60. function CheckRow(Str: TStringGrid; ARow, VerCount: Integer): Boolean;
  61. var
  62.     I: Integer;
  63.     IsCorrect: Boolean;
  64. begin
  65.     IsCorrect := true;
  66.     I := 1;
  67.     if (Str.Cells[I, Arow].IsEmpty) then
  68.     begin
  69.         IsCorrect := false;
  70.     end
  71.     else
  72.     begin
  73.         I := 2;
  74.         while (I < VerCount) and (IsCorrect) do
  75.         begin
  76.             if not(Str.Cells[I, ARow].IsEmpty) and
  77.             ((StrToInt(Str.Cells[I, Arow]) < StrToInt(Str.Cells[I - 1, ARow]))
  78.             or (StrToInt(Str.Cells[I, Arow]) > VerCount)) then
  79.             begin
  80.                 IsCorrect := false;
  81.             end;
  82.             Inc(I);
  83.         end;
  84.     end;
  85.     CheckRow := IsCorrect;
  86. end;
  87.  
  88. procedure TFormMain.Button2Click(Sender: TObject);
  89. begin
  90.     ButtonFind.Enabled := true;
  91. end;
  92.  
  93. procedure TFormMain.ButtonCreateClick(Sender: TObject);
  94. var
  95.     I: Integer;
  96. begin
  97.     Count := StrToInt(Edit.Text);
  98.     StringGrid.RowCount := Count;
  99.     StringGrid.ColCount := Count + 1;
  100.     ButtonCreate.Enabled := false;
  101.     for I := 1 to Count do
  102.     begin
  103.         StringGrid.Cells[0, I - 1] := '№' + IntToStr(I);
  104.     end;
  105.     StringGrid.Enabled := true;
  106.     ButtonFind.Enabled := true;
  107. end;
  108.  
  109. function GetArrFromRow(Str: TStringGrid; ARow: Integer): TArr;
  110. var
  111.     I, Count: Integer;
  112.     A: TArr;
  113. begin
  114.     I := 1;
  115.     Count := 0;
  116.     while (I < Str.ColCount) and not(Str.Cells[I, ARow].IsEmpty)do
  117.     begin
  118.         Inc(Count);
  119.         Inc(I);
  120.     end;
  121.     SetLength(A, Count);
  122.     I := 1;
  123.     while (I < Str.ColCount) and not(Str.Cells[I, ARow].IsEmpty)do
  124.     begin
  125.         A[I - 1] := StrToInt(Str.Cells[I, ARow]);
  126.         Inc(I);
  127.     end;
  128.     GetArrFromRow := A;
  129. end;
  130.  
  131. function GetListFromStringGrid(Str: TStringGrid): TMatrix;
  132. var
  133.     M: TMatrix;
  134.     A: TArr;
  135.     I: Integer;
  136. begin
  137.     SetLength(M, Str.RowCount);
  138.     for I := 0 to High(M) do
  139.     begin
  140.         A := GetArrFromRow(Str, I);
  141.         SetLength(M[I], Length(A));
  142.         M[I] := A;
  143.     end;
  144.     GetListFromStringGrid := M;
  145. end;
  146.  
  147. procedure MakeZeroMatrix(var M: TMatrix);
  148. var
  149.     I, J: Integer;
  150. begin
  151.     for I := 0 to High(M) do
  152.     begin
  153.         for J := 0 to High(M) do
  154.         begin
  155.             M[I][J] := 0;
  156.         end;
  157.     end;
  158. end;
  159.  
  160. function GetMatrixFromList(List: TMatrix; Count: Integer): TMatrix;
  161. var
  162.     I, J: Integer;
  163.     Matrix: TMatrix;
  164. begin
  165.     SetLength(Matrix, Count, Count);
  166.     MakeZeroMatrix(Matrix);
  167.     for I := 0 to High(List) do
  168.     begin
  169.         for J := 0 to High(List[I]) do
  170.         begin
  171.             Matrix[I][List[I][J] - 1] := 1;
  172.         end;
  173.     end;
  174.     GetMatrixFromList := Matrix;
  175. end;
  176.  
  177. procedure FillMatrix(var Str: TStringGrid; Matrix: TMatrix);
  178. var
  179.     I, J: Integer;
  180. begin
  181.     Str.ColCount := Length(Matrix);
  182.     Str.RowCount := Length(Matrix);
  183.     for I := 0 to High(Matrix) do
  184.     begin
  185.         for J := 0 to High(Matrix) do
  186.         begin
  187.             Str.Cells[I, J] := IntToStr(Matrix[I][J]);
  188.         end;
  189.     end;
  190. end;
  191.  
  192. procedure TFormMain.ButtonFindClick(Sender: TObject);
  193. var
  194.     I: Integer;
  195.     IsCorrect: Boolean;
  196.     Matrix, List: TMatrix;
  197. begin
  198.     IsCorrect := true;
  199.     I := 0;
  200.     while (I < StringGrid.RowCount) and (IsCorrect) do
  201.     begin
  202.         if not(CheckRow(StringGrid, I, StringGrid.RowCount)) then
  203.         begin
  204.             IsCorrect := false;
  205.         end;
  206.         Inc(I);
  207.     end;
  208.     if (IsCorrect) then
  209.     begin
  210.         List := GetListFromStringGrid(StringGrid);
  211.         Matrix := GetMatrixFromList(List, StringGrid.RowCount);
  212.         FillMatrix(MatrixGrid, Matrix);
  213.         NSaveFile.Enabled := true;
  214.     end
  215.     else
  216.     begin
  217.         UnitError.FormError.LabelError.Caption := 'Проверьте корректность ввода списков!';
  218.         UnitError.FormError.ShowModal;
  219.         UnitError.FormError.LabelError.Caption := '';
  220.         NSaveFile.Enabled := false;
  221.     end;
  222. end;
  223.  
  224. procedure TFormMain.EditChange(Sender: TObject);
  225. begin
  226.     if Edit.Text <> '' then
  227.         ButtonCreate.Enabled := true
  228.     else
  229.         ButtonCreate.Enabled := false;
  230.     StringGrid.Enabled := false;
  231.     ButtonFind.Enabled := false;
  232. end;
  233.  
  234. procedure TFormMain.EditKeyPress(Sender: TObject; var Key: Char);
  235. begin
  236.     if not(Key in ['2'..'9', #8]) then
  237.         Key := #0;
  238. end;
  239.  
  240. procedure TFormMain.NAboutClick(Sender: TObject);
  241. begin
  242.     UnitAbout.FormAbout.ShowModal;
  243. end;
  244.  
  245. procedure TFormMain.NInstructionClick(Sender: TObject);
  246. begin
  247.     UnitInstruction_7_2.FormInstruction.ShowModal;
  248. end;
  249.  
  250. procedure TFormMain.NOpenFileClick(Sender: TObject);
  251. var
  252.     F: TextFile;
  253.     Path: String;
  254.     IsCorrect: Boolean;
  255.     Number, I, J, Vertex: Integer;
  256. begin
  257.     IsCorrect := true;
  258.     if OpenDialog.Execute then
  259.     begin
  260.         Path := OpenDialog.FileName;
  261.         try
  262.             AssignFile(F, Path);
  263.             Reset(F);
  264.             try
  265.                 Readln(F, Number);
  266.                 Edit.Text := IntToStr(Number);
  267.                 ButtonCreateClick(Sender);
  268.                 I := 0;
  269.                 while (I < Number) do
  270.                 begin
  271.                     J := 0;
  272.                     while (J < Number + 1) do
  273.                     begin
  274.                         Read(F, Vertex);
  275.                         if Vertex > 0 then
  276.                         begin
  277.                             StringGrid.Cells[J + 1, I] := IntToStr(Vertex);
  278.                         end
  279.                         else
  280.                         begin
  281.                             J := Number;
  282.                         end;
  283.                         Inc(J);
  284.                     end;
  285.                     Inc(I);
  286.                 end;
  287.                 if not(EoF(F)) then
  288.                 begin
  289.                     IsCorrect := false;
  290.                 end;
  291.             finally
  292.                 CloseFile(F);
  293.             end;
  294.         except
  295.             UnitError.FormError.LabelError.Caption := 'Возникла ошибка при считывании списка из файла!';
  296.             UnitError.FormError.ShowModal;
  297.             UnitError.FormError.LabelError.Caption := '';
  298.         end;
  299.     end;
  300.     if not(IsCorrect) then
  301.     begin
  302.         UnitError.FormError.LabelError.Caption := 'В файле найдены лишние элементы!';
  303.         UnitError.FormError.ShowModal;
  304.         UnitError.FormError.LabelError.Caption := '';
  305.     end;
  306. end;
  307.  
  308. procedure TFormMain.NSaveFileClick(Sender: TObject);
  309. var
  310.     F: TextFile;
  311.     Path: String;
  312.     I, J: Integer;
  313. begin
  314.     if SaveDialog.Execute then
  315.     begin
  316.         Path := SaveDialog.FileName;
  317.         try
  318.             AssignFile(F, Path);
  319.             Rewrite(F);
  320.             try
  321.                 Writeln(F, 'Матрица смежности:');
  322.                 I := 0;
  323.                 while (I < MatrixGrid.ColCount) do
  324.                 begin
  325.                     J := 0;
  326.                     while (J < MatrixGrid.RowCount) do
  327.                     begin
  328.                         Write(F, MatrixGrid.Cells[I, J], ' ');
  329.                         Inc(J);
  330.                     end;
  331.                     Writeln(F, '');
  332.                     Inc(I);
  333.                 end;
  334.             finally
  335.                 CloseFile(F);
  336.             end;
  337.         except
  338.             UnitError.FormError.LabelError.Caption := 'Возникла ошибка при считывании списка из файла!';
  339.             UnitError.FormError.ShowModal;
  340.             UnitError.FormError.LabelError.Caption := '';
  341.         end;
  342.     end;
  343. end;
  344.  
  345. procedure TFormMain.StringGridKeyPress(Sender: TObject; var Key: Char);
  346. var
  347.     Row, Col: Integer;
  348. begin
  349.     Row := StringGrid.Row;
  350.     Col := StringGrid.Col;
  351.     if not(Key in ['1'..'9', #8]) then
  352.         Key := #0;
  353.     if (length(StringGrid.Cells[Col, Row]) = 1) and not(Key in [#8])then
  354.         Key := #0;
  355.     try
  356.         if (Col > 1) and (Ord(Key) <= Ord(StringGrid.Cells[Col - 1, Row][1])) and not(Key = #8) then
  357.             Key := #0;
  358.     except
  359.         UnitError.FormError.LabelError.Caption := 'Ввод значения не возможен, т.к. предыдущая ячейка не заполнена!';
  360.         UnitError.FormError.ShowModal;
  361.         UnitError.FormError.LabelError.Caption := '';
  362.     end;
  363.     if (Col > 0) and (Ord(Key) > Ord(Edit.Text[1])) and not(Key = #8) then
  364.         Key := #0;
  365.     if (StringGrid.Cells[Col - 1, Row].IsEmpty) then
  366.         Key := #0;
  367. end;
  368.  
  369. procedure TFormMain.StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
  370.   var CanSelect: Boolean);
  371. begin
  372.     if (ACol <> (Count - 1)) and not(StringGrid.Cells[ACol + 1, ARow].IsEmpty)
  373.     and not(StringGrid.Cells[ACol - 1, ARow].IsEmpty) then
  374.         CanSelect := false;
  375. end;
  376.  
  377. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement