Vanilla_Fury

laba_7_2_del

Jun 9th, 2021
588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 23.47 KB | None | 0 0
  1. unit MainUnit;
  2.  
  3. interface
  4.  
  5. uses
  6.     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7.     System.Classes, Vcl.Graphics,
  8.     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,
  9.     Vcl.ExtCtrls,
  10.     Vcl.Samples.Spin, Vcl.Menus, Vcl.Grids, System.RegularExpressions,
  11.     Vcl.Imaging.jpeg, Vcl.ExtDlgs, Math;
  12.  
  13. type
  14.     TCoords = record
  15.         X: Integer;
  16.         Y: Integer;
  17.     end;
  18.  
  19.     TArrStr = Array of String;
  20.  
  21.     TPath = Array of Integer;
  22.  
  23.     TMatrix = array of array of Integer;
  24.  
  25.     TMainForm = class(TForm)
  26.         Visualizer: TImage;
  27.         MatrixGrid: TStringGrid;
  28.         OpenDialog: TOpenDialog;
  29.         MainMenu1: TMainMenu;
  30.     About: TMenuItem;
  31.         File1: TMenuItem;
  32.     OpenFile: TMenuItem;
  33.         OrderSpinEdit: TSpinEdit;
  34.         LabelMatrixInput: TLabel;
  35.         LabelSetSize: TLabel;
  36.         LabelGraph: TLabel;
  37.         SaveDialog: TSaveDialog;
  38.         LabelToMeasureScreenOfUser: TLabel;
  39.     LabelFromVertex: TLabel;
  40.     SpinEditFromVertex: TSpinEdit;
  41.     LabelToVetex: TLabel;
  42.     SpinEditToVertex: TSpinEdit;
  43.     NSaveAs: TMenuItem;
  44.     BalloonHint1: TBalloonHint;
  45.     NFileReq: TMenuItem;
  46.         procedure OrderSpinEditChange(Sender: TObject);
  47.         procedure SetSize();
  48.         procedure FormCreate(Sender: TObject);
  49.         procedure OpenFileClick(Sender: TObject);
  50.         procedure DrawVertexes();
  51.         procedure DrawLines();
  52.         procedure DrawGraph();
  53.         procedure ShowGraphButtonClick(Sender: TObject);
  54.         procedure GetMatrixFromGrid();
  55.         procedure DrawShortestWay();
  56.         procedure ClearScreen();
  57.         procedure MatrixGridSetEditText(Sender: TObject; ACol, ARow: Integer;
  58.           const Value: string);
  59.         procedure AboutClick(Sender: TObject);
  60.         procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  61.     procedure SpinEditVertexChange(Sender: TObject);
  62.     procedure NSaveAsClick(Sender: TObject);
  63.     procedure NFileReqClick(Sender: TObject);
  64.     private
  65.         MultPix: Single;
  66.         function MultPixels(PixQuant: Integer): Integer;
  67.         procedure ConvertAllConstants();
  68.         function GetFastestPath(FromU, ToV: Integer): TPath;
  69.         procedure DrawExtraVertexAndLine(X1, Y1, X2, Y2: Integer);
  70.         function GetCoordsOfVertex(VertexNumber, AmountOfVertexes
  71.           : Integer): TCoords;
  72.         procedure CalculateAllPaths();
  73.         procedure DrawWeights();
  74.         procedure DrawEverythingAndCalculateEverything();
  75.     public
  76.         { Public declarations }
  77.     end;
  78.  
  79. var
  80.     MainForm: TMainForm;
  81.     DEFAULT_WIDTH_Real, POINT_RAD_Real, LINE_WIDTH_Real,
  82.       GRAPH_RAD_Real, VERTEX_RAD_Real, FONT_HEIGHT_Real, PATH_WIDTH_Real: Integer;
  83.     Matrix, FullWeightMatrix: TMatrix;
  84.     PathMatrix: TMatrix;
  85.     DataIsSaved: Boolean;
  86.     PathStr: String;
  87.  
  88. const
  89.     VERTEXES_COLOR = $00B3B300;
  90.     BACKGROUND_COLOR = $001C1A13;
  91.     WEIGHT_COLOR = $004F009D;
  92.     PATH_COLOR = $004F00FF;
  93.     POINT_RAD = 10;
  94.     LINE_WIDTH = 5;
  95.     GRAPH_RAD = 150;
  96.     VERTEX_RAD = 30;
  97.     FONT_HEIGHT = 20;
  98.     INF = 1000000;
  99.     MAX_ORDER = 10;
  100.     MIN_ORDER = 2;
  101.  
  102. function FindRegEx(SInput, StrRegEx: String; StrIfNothingFound: String = '')
  103.   : TArrStr; external 'FindRegExes.dll';
  104. procedure MyMessageBoxInfo(Form: TForm; CaptionWindow, TextMessage: String;
  105.   IsWarning: Boolean = False); external 'Dll_MyMessageBox.dll';
  106. function MyMessageBoxYesNo(Form: TForm; CaptionWindow, TextMessage: String;
  107.   IsWarning: Boolean = False): Boolean; external 'Dll_MyMessageBox.dll';
  108.  
  109. implementation
  110.  
  111. {$R *.dfm}
  112.  
  113. function TMainForm.GetFastestPath(FromU, ToV: Integer): TPath;
  114. var
  115.     Path: TPath;
  116.     LengthOfPath, SizeOfMatrix: Integer;
  117.  
  118. begin
  119.     if FullWeightMatrix[FromU - 1][ToV - 1] < INF then
  120.     begin
  121.         SizeOfMatrix := Length(Matrix);
  122.         SetLength(Path, SizeOfMatrix);
  123.         LengthOfPath := 0;
  124.         PathStr := '';
  125.         while ToV <> FromU do
  126.         begin
  127.             Path[LengthOfPath] := FromU;
  128.             PathStr := PathStr + IntToStr(FromU) + ' -> ';
  129.             Inc(LengthOfPath);
  130.             FromU := PathMatrix[FromU - 1, ToV - 1];
  131.         end;
  132.         Path[LengthOfPath] := FromU;
  133.         PathStr := PathStr + IntToStr(FromU);
  134.         Inc(LengthOfPath);
  135.         SetLength(Path, LengthOfPath);
  136.     end
  137.     else
  138.         SetLength(Path, 0);
  139.  
  140.     Result := Path;
  141. end;
  142.  
  143. procedure TMainForm.CalculateAllPaths();
  144. var
  145.     i, U, V: Integer;
  146.     SizeOfMatrix: Integer;
  147.  
  148. begin
  149.     SizeOfMatrix := Length(Matrix);
  150.     SetLength(PathMatrix, SizeOfMatrix, SizeOfMatrix);
  151.     SetLength(FullWeightMatrix, SizeOfMatrix, SizeOfMatrix);
  152.  
  153.     for U := 0 to SizeOfMatrix - 1 do
  154.         for V := 0 to SizeOfMatrix - 1 do
  155.         begin
  156.             FullWeightMatrix[U][V] := Matrix[U][V];
  157.             PathMatrix[U][V] := V + 1;
  158.         end;
  159.  
  160.     for i := 0 to SizeOfMatrix - 1 do
  161.         for U := 0 to SizeOfMatrix - 1 do
  162.             for V := 0 to SizeOfMatrix - 1 do
  163.                 if (U <> i) and (V <> i) and (FullWeightMatrix[U, i] + FullWeightMatrix[i, V] < FullWeightMatrix[U, V])
  164.                  and (FullWeightMatrix[U, i] < INF) and (FullWeightMatrix[i, V] < INF) then
  165.                 begin
  166.                     FullWeightMatrix[U, V] := FullWeightMatrix[U, i] +
  167.                       FullWeightMatrix[i, V];
  168.  
  169.                     PathMatrix[U, V] := PathMatrix[U, i];
  170.                 end;
  171. end;
  172.  
  173. procedure TMainForm.DrawVertexes();
  174. var
  175.     i, X, Y, OffsetOfTextYUp, OffsetOfTextYDown, OffsetOfTextX_Real, SizeOfMatrix: Integer;
  176.     CurrCoords: TCoords;
  177.  
  178. const
  179.     OffsetOfTextX = 5;
  180.  
  181. begin
  182.     SizeOfMatrix := Length(Matrix);
  183.     OffsetOfTextYUp := VERTEX_RAD_Real + FONT_HEIGHT_Real;
  184.     OffsetOfTextYDown := VERTEX_RAD_Real;
  185.     OffsetOfTextX_Real := MultPixels(OffsetOfTextX);
  186.  
  187.     with Visualizer.Canvas do
  188.     begin
  189.         Pen.Color := VERTEXES_COLOR;
  190.         Pen.Width := 1;
  191.         Font.Name := 'Segoe UI';
  192.         Font.Style := [fsBold];
  193.         Font.Color := VERTEXES_COLOR;
  194.         Font.Height := FONT_HEIGHT_Real;
  195.         for i := 0 to SizeOfMatrix - 1 do
  196.         begin
  197.             Brush.Color := VERTEXES_COLOR;
  198.             CurrCoords := GetCoordsOfVertex(i + 1, SizeOfMatrix);
  199.             X := CurrCoords.X;
  200.             Y := CurrCoords.Y;
  201.             Ellipse(X - VERTEX_RAD_Real, Y - VERTEX_RAD_Real,
  202.               X + VERTEX_RAD_Real, Y + VERTEX_RAD_Real);
  203.             Brush.Color := BACKGROUND_COLOR;
  204.             if i < SizeOfMatrix / 2 then
  205.                 TextOut(X - OffsetOfTextX_Real, Y - OffsetOfTextYUp,
  206.                   IntToStr(i + 1))
  207.             else
  208.                 TextOut(X - OffsetOfTextX_Real, Y + OffsetOfTextYDown,
  209.                   IntToStr(i + 1));
  210.         end;
  211.     end;
  212. end;
  213.  
  214. function TMainForm.GetCoordsOfVertex(VertexNumber, AmountOfVertexes
  215.   : Integer): TCoords;
  216. var
  217.     Coords: TCoords;
  218.     Center: TCoords;
  219.     Phi: Extended;
  220.  
  221. begin
  222.     Phi := (VertexNumber - 1) * 2 * Pi / AmountOfVertexes;
  223.     Center.X := Visualizer.Width div 2;
  224.     Center.Y := Visualizer.Height div 2;
  225.  
  226.     Coords.Y := Round(Center.Y - GRAPH_RAD_Real * Sin(Phi));
  227.     Coords.X := Round(Center.X - GRAPH_RAD_Real * Cos(Phi));
  228.  
  229.     Result := Coords;
  230. end;
  231.  
  232. procedure TMainForm.DrawLines();
  233. var
  234.     i, J: Byte;
  235.     X1, X2, Y1, Y2: Integer;
  236.  
  237. begin
  238.     with Visualizer.Canvas do
  239.     begin
  240.         Pen.Color := VERTEXES_COLOR;
  241.         Font.Color := VERTEXES_COLOR;
  242.         Pen.Width := LINE_WIDTH_Real;
  243.         for i := 0 to High(Matrix) do
  244.         begin
  245.             for J := i + 1 to High(Matrix) do
  246.             begin
  247.                 if (Matrix[i][j] < INF) then
  248.                 begin
  249.                     X1 := GetCoordsOfVertex(i + 1, Length(Matrix)).X;
  250.                     Y1 := GetCoordsOfVertex(i + 1, Length(Matrix)).Y;
  251.                     X2 := GetCoordsOfVertex(j + 1, Length(Matrix)).X;
  252.                     Y2 := GetCoordsOfVertex(j + 1, Length(Matrix)).Y;
  253.                     MoveTo(X1, Y1);
  254.                     LineTo(X2, Y2);
  255.                 end;
  256.             end;
  257.         end;
  258.     end;
  259. end;
  260.  
  261. procedure TMainForm.DrawWeights();
  262. var
  263.     i, J: Byte;
  264.     X1, X2, Y1, Y2, XMid, YMid, ShX, ShY, dY, dX: Integer;
  265.     Diagonal: Extended;
  266.  
  267. begin
  268.     with Visualizer.Canvas do
  269.     begin
  270.         Pen.Color := WEIGHT_COLOR;
  271.         Font.Color := WEIGHT_COLOR;
  272.         Brush.Color := VERTEXES_COLOR;
  273.         Pen.Width := Max(1, LINE_WIDTH_Real div 3);
  274.         Font.Height := FONT_HEIGHT_Real * 2 div 3;
  275.         for i := 0 to High(Matrix) do
  276.         begin
  277.             for J := i + 1 to High(Matrix) do
  278.             begin
  279.                 if (Matrix[i][j] < INF) then
  280.                 begin
  281.                     X1 := GetCoordsOfVertex(i + 1, Length(Matrix)).X;
  282.                     Y1 := GetCoordsOfVertex(i + 1, Length(Matrix)).Y;
  283.                     X2 := GetCoordsOfVertex(j + 1, Length(Matrix)).X;
  284.                     Y2 := GetCoordsOfVertex(j + 1, Length(Matrix)).Y;
  285.                     dX := X2 - X1;
  286.                     dY := Y2 - Y1;
  287.                     Diagonal := Sqrt(dy * dy + dx * dx);
  288.                     ShX := Trunc(2 * POINT_RAD_Real * dY / Diagonal);
  289.                     ShY := - Trunc(2 * POINT_RAD_Real * dX / Diagonal);
  290.  
  291.                     XMid := (X1 + X2) div 2;
  292.                     YMid := (Y1 + Y2) div 2;
  293.                     if dX <> 0 then
  294.                     begin
  295.                         XMid := XMid + dX * 3 div 17;
  296.                         YMid := YMid + dX * 3 div 17 * dY div dX;
  297.                     end
  298.                     else
  299.                     begin
  300.                         YMid := YMid + dY * 3 div 17;
  301.                         XMid := XMid + dY * 3 div 17 * dX div dY;
  302.                     end;
  303.  
  304.  
  305.                     MoveTo(XMid, YMid);
  306.                     LineTo(XMid + ShX, YMid + ShY);
  307.                     Ellipse(XMid - LINE_WIDTH_Real div 2, YMid - LINE_WIDTH_Real div 2, XMid + LINE_WIDTH_Real div 2, YMid + LINE_WIDTH_Real div 2);
  308.                     TextOut(XMid + ShX, YMid + ShY - Font.Height div 2, IntToStr(Matrix[i][j]));
  309.                 end;
  310.             end;
  311.         end;
  312.     end;
  313. end;
  314.  
  315. procedure TMainForm.DrawGraph();
  316. begin
  317.     DrawVertexes();
  318.     DrawLines();
  319.     DrawWeights();
  320. end;
  321.  
  322. procedure TMainForm.DrawShortestWay();
  323. var
  324.     i: Integer;
  325.     Path: TPath;
  326.     FromU, ToV: Integer;
  327.  
  328. begin
  329.     ClearScreen();
  330.     DrawGraph();
  331.  
  332.     FromU := SpinEditFromVertex.Value;
  333.     ToV := SpinEditToVertex.Value;
  334.  
  335.     Path := GetFastestPath(FromU, ToV);
  336.     with Visualizer.Canvas do
  337.         if Length(Path) > 1 then
  338.         begin
  339.             for i := 0 to High(Path) - 1 do
  340.                 DrawExtraVertexAndLine(GetCoordsOfVertex(Path[i], Length(Matrix)).X,
  341.                  GetCoordsOfVertex(Path[i], Length(Matrix)).Y,
  342.                  GetCoordsOfVertex(Path[i + 1], Length(Matrix)).X,
  343.                  GetCoordsOfVertex(Path[i + 1], Length(Matrix)).Y);
  344.  
  345.             Font.Height := POINT_RAD_Real * 2;
  346.             Brush.Color := BACKGROUND_COLOR;
  347.             Font.Color := VERTEXES_COLOR;
  348.             TextOut(POINT_RAD_Real, POINT_RAD_Real, 'Путь из вершины ' + IntToStr(FromU) + ' в вершину ' + IntToStr(ToV) + ' имеет вес ' + IntToStr(FullWeightMatrix[FromU - 1][ToV - 1]));
  349.         end
  350.         else
  351.         begin
  352.             Font.Height := POINT_RAD_Real * 2;
  353.             Brush.Color := BACKGROUND_COLOR;
  354.             Font.Color := WEIGHT_COLOR;
  355.             TextOut(POINT_RAD_Real, POINT_RAD_Real, 'Путь из вершины ' + IntToStr(FromU) + ' в вершину ' + IntToStr(ToV) + ' не найден');
  356.         end;
  357.  
  358.     DrawWeights();
  359. end;
  360.  
  361. procedure TMainForm.DrawExtraVertexAndLine(X1, Y1, X2, Y2: Integer);
  362. begin
  363.     with Visualizer.Canvas do
  364.     begin
  365.         Pen.Color := PATH_COLOR;
  366.         Pen.Width := PATH_WIDTH_Real;
  367.         Brush.Color := PATH_COLOR;
  368.         Ellipse(X1 - POINT_RAD_Real, Y1 - POINT_RAD_Real, X1 + POINT_RAD_Real,
  369.           Y1 + POINT_RAD_Real);
  370.         Ellipse(X2 - POINT_RAD_Real, Y2 - POINT_RAD_Real, X2 + POINT_RAD_Real,
  371.           Y2 + POINT_RAD_Real);
  372.  
  373.         MoveTo(X1, Y1);
  374.         LineTo(X2, Y2);
  375.     end;
  376. end;
  377.  
  378. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  379. begin
  380.     CanClose := MyMessageBoxYesNo(MainForm, 'Закрыть программу?',
  381.       'Вы уверены, что хотите выйти из программы?');
  382. end;
  383.  
  384. procedure TMainForm.FormCreate(Sender: TObject);
  385. begin
  386.     MultPix := LabelToMeasureScreenOfUser.Width / 100;
  387.     ConvertAllConstants();
  388.     DataIsSaved := True;
  389.  
  390.     OrderSpinEdit.Value := 10;
  391.     ClearScreen();
  392.     MainForm.Width := DEFAULT_WIDTH_Real;
  393.  
  394.     DrawEverythingAndCalculateEverything();
  395. end;
  396.  
  397. procedure TMainForm.ConvertAllConstants();
  398. begin
  399.     DEFAULT_WIDTH_Real := MatrixGrid.Left + Visualizer.Width + Visualizer.Left;
  400.     POINT_RAD_Real := MultPixels(POINT_RAD);
  401.     LINE_WIDTH_Real := MultPixels(LINE_WIDTH);
  402.     GRAPH_RAD_Real := MultPixels(GRAPH_RAD);
  403.     VERTEX_RAD_Real := MultPixels(VERTEX_RAD);
  404.     FONT_HEIGHT_Real := MultPixels(FONT_HEIGHT);
  405.     PATH_WIDTH_Real := Max(1, LINE_WIDTH_Real div 2);
  406. end;
  407.  
  408. procedure TMainForm.ClearScreen();
  409. begin
  410.     with Visualizer.Canvas do
  411.     begin
  412.         Brush.Color := BACKGROUND_COLOR;
  413.         Pen.Color := BACKGROUND_COLOR;
  414.         Rectangle(0, 0, Visualizer.Width, Visualizer.Height);
  415.     end;
  416. end;
  417.  
  418. procedure TMainForm.OpenFileClick(Sender: TObject);
  419. const
  420.     ErrorDuringInputOccured = 'Возникла ошибка при открытии файла.' + #10#13 +
  421.                 'Пожалуйста, выберите файл формата (.txt) с ' +
  422.                 'корректными данными.';
  423.  
  424. var
  425.     FileInput : TextFile;
  426.     PathToFile, String1, RegExString: String;
  427.     i, j, SizeOfMatrix: Integer;
  428.     IsCorrect, SaidNoSaving: Boolean;
  429.     ArrStr: TArrStr;
  430.  
  431. begin
  432.     IsCorrect := True;
  433.     SaidNoSaving := False;
  434.  
  435.     if not DataIsSaved then
  436.         if MyMessageBoxYesNo(MainForm, 'Сохранить данные?', 'Вы хотите сохранить текущие данные?' +
  437.         #10#13 + 'Иначе после открытия файла все текущие данные будут утеряны.', True) then
  438.             NSaveAsClick(MainForm)
  439.         else
  440.             SaidNoSaving := True;
  441.  
  442.     if (DataIsSaved or SaidNoSaving or MyMessageBoxYesNo(MainForm, 'Открыть файл?', 'Вы уверены, что хотите открыть новый файл?' + #10#13 +
  443.         'Все текущие данные будут утеряны.', True))
  444.         and OpenDialog.Execute then
  445.     begin
  446.         PathToFile := OpenDialog.FileName;
  447.  
  448.         try
  449.             AssignFile(FileInput, PathToFile);
  450.             Reset(FileInput);
  451.  
  452.             Readln(FileInput, String1);
  453.             RegExString := FindRegEx(String1, '^\s*0*([2-9]|10)\s*$')[0];
  454.             if RegExString <> '' then
  455.             begin
  456.                 SizeOfMatrix := StrToInt(RegExString);
  457.                 OrderSpinEdit.Value := SizeOfMatrix;
  458.                 SetSize();
  459.             end
  460.             else
  461.                 IsCorrect := False;
  462.  
  463.             i := 0;
  464.             while IsCorrect and (i < SizeOfMatrix) do
  465.             begin
  466.                 Readln(FileInput, String1);
  467.                 RegExString := FindRegEx(String1 + ' ', '^\s*(((0*([1-9]\d{0,2})?)|-)\s+){' + IntToStr(SizeOfMatrix) + '}\s*$')[0];
  468.                 if RegExString <> '' then
  469.                 begin
  470.                     ArrStr := FindRegEx(RegExString, '([1-9]\d{0,2})|-');
  471.                     j := 0;
  472.                     while j < Length(ArrStr) do
  473.                     begin
  474.                         String1 := ArrStr[j];
  475.                         if String1 = '-' then
  476.                             MatrixGrid.Cells[j + 1, i + 1] := ''
  477.                         else
  478.                             MatrixGrid.Cells[j + 1, i + 1] := String1;
  479.  
  480.                         MatrixGridSetEditText(Self, j + 1, i + 1, MatrixGrid.Cells[J + 1, i + 1]);
  481.                         Inc(j);
  482.                     end;
  483.                 end
  484.                 else
  485.                     IsCorrect := False;
  486.                 Inc(i);
  487.             end;
  488.         except
  489.             IsCorrect := False;
  490.         end;
  491.  
  492.         if not IsCorrect then
  493.         begin
  494.             MyMessageBoxInfo(MainForm, 'Ошибка', ErrorDuringInputOccured, True);
  495.  
  496.             SetSize();
  497.         end;
  498.     end;
  499.  
  500.     DrawEverythingAndCalculateEverything();
  501. end;
  502.  
  503. procedure TMainForm.AboutClick(Sender: TObject);
  504. begin
  505.     MyMessageBoxInfo(MainForm, 'Справка',
  506.       'Граф задан матрицей смежности, где числа - весы рёбер. Программа находит самый быстрый путь из одной вершины в другую.');
  507. end;
  508.  
  509. procedure TMainForm.NFileReqClick(Sender: TObject);
  510. begin
  511.     MyMessageBoxInfo(MainForm, 'Требования к файлу',
  512.       'В первой строке должно быть число - количество N вершин графа. Затем должно следовать N строк по N чисел от 0 до 999.');
  513. end;
  514.  
  515. procedure TMainForm.OrderSpinEditChange(Sender: TObject);
  516. begin
  517.     DataIsSaved := False;
  518.     SetSize();
  519.  
  520.     SpinEditFromVertex.MaxValue := OrderSpinEdit.Value;
  521.     SpinEditFromVertex.Value := Min(SpinEditFromVertex.Value, OrderSpinEdit.Value);
  522.     SpinEditToVertex.MaxValue := OrderSpinEdit.Value;
  523.     SpinEditToVertex.Value := Min(SpinEditToVertex.Value, OrderSpinEdit.Value);
  524.  
  525.     DrawEverythingAndCalculateEverything();
  526. end;
  527.  
  528. procedure TMainForm.SetSize();
  529. const
  530.     CorrectionOfWidthOfStringGrid = 5;
  531.  
  532. var
  533.     i: Byte;
  534.     Size: Byte;
  535.  
  536. begin
  537.     Size := OrderSpinEdit.Value + 1;
  538.     MatrixGrid.ColCount := Size;
  539.     MatrixGrid.RowCount := Size;
  540.     MatrixGrid.DefaultColWidth :=
  541.       (MatrixGrid.Width - MultPixels(CorrectionOfWidthOfStringGrid))
  542.       div Size;
  543.     MatrixGrid.DefaultRowHeight :=
  544.       (MatrixGrid.Height - MultPixels(CorrectionOfWidthOfStringGrid))
  545.       div Size;
  546.     MatrixGrid.Font.Height := Trunc(MatrixGrid.DefaultRowHeight * 2 / 3);
  547.     for i := Size to 10 do
  548.     begin
  549.         MatrixGrid.Rows[i].Clear;
  550.         MatrixGrid.Cols[i].Clear;
  551.     end;
  552.     for i := 0 to Size - 1 do
  553.     begin
  554.         MatrixGrid.Cells[0, i + 1] := IntToStr(i + 1);
  555.         MatrixGrid.Cells[i + 1, 0] := IntToStr(i + 1);
  556.         MatrixGrid.Cells[i + 1, i + 1] := '0';
  557.     end;
  558. end;
  559.  
  560. procedure TMainForm.ShowGraphButtonClick(Sender: TObject);
  561. begin
  562.     DrawEverythingAndCalculateEverything();
  563. end;
  564.  
  565. procedure TMainForm.DrawEverythingAndCalculateEverything();
  566. begin
  567.     GetMatrixFromGrid();
  568.  
  569.     CalculateAllPaths();
  570.     DrawShortestWay();
  571. end;
  572.  
  573. procedure TMainForm.SpinEditVertexChange(Sender: TObject);
  574. begin
  575.     DataIsSaved := False;
  576.     if SpinEditFromVertex.Value <> SpinEditToVertex.Value then
  577.         DrawShortestWay()
  578.     else
  579.     begin
  580.         ClearScreen();
  581.         DrawGraph();
  582.     end;
  583. end;
  584.  
  585. procedure TMainForm.MatrixGridSetEditText(Sender: TObject; ACol, ARow: Integer;
  586.   const Value: string);
  587. var
  588.     FoundRegEx: String;
  589.  
  590. begin
  591.     DataIsSaved := False;
  592.     if ACol <> ARow then
  593.     begin
  594.         FoundRegEx := FindRegEx(Value.Trim,
  595.           '\d{1,3}')[0];
  596.         if FoundRegEx <> Value then
  597.             MatrixGrid.Cells[ACol, ARow] := FindRegEx(Value.Trim, '\d{1,3}')[0];
  598.  
  599.         MatrixGrid.Cells[ARow, ACol] := MatrixGrid.Cells[ACol, ARow];
  600.     end
  601.     else
  602.         MatrixGrid.Cells[ACol, ARow] := '0';
  603.  
  604.     DrawEverythingAndCalculateEverything();
  605. end;
  606.  
  607. procedure TMainForm.GetMatrixFromGrid();
  608. var
  609.     i, J, SizeOfMatrix: Byte;
  610.  
  611. begin
  612.     SizeOfMatrix := OrderSpinEdit.Value;
  613.     SetLength(Matrix, SizeOfMatrix, SizeOfMatrix);
  614.  
  615.     for i := 0 to High(Matrix) do
  616.         for J := 0 to High(Matrix) do
  617.         begin
  618.             if MatrixGrid.Cells[J + 1, i + 1] <> '' then
  619.                 Matrix[i][J] := StrToInt(MatrixGrid.Cells[J + 1, i + 1])
  620.             else
  621.                 Matrix[i][J] := INF;
  622.         end;
  623. end;
  624.  
  625. function TMainForm.MultPixels(PixQuant: Integer): Integer;
  626. begin
  627.     Result := Round(PixQuant * MultPix);
  628. end;
  629.  
  630. procedure TMainForm.NSaveAsClick(Sender: TObject);
  631. var
  632.     FileOutput : TextFile;
  633.     StrFilePath: String;
  634.     ShouldNotRepeat, TimerGoes: Boolean;
  635.     Point: TPoint;
  636.     i, j ,k, ii: Integer;
  637.  
  638. begin
  639.     try
  640.         repeat
  641.             ShouldNotRepeat := True;
  642.             SaveDialog.FileName := 'Путь в графе ' + DateTimeToStr(Date) + ' ' + TimeToStr(Time).Replace(':', '-', [rfReplaceAll]) + '.txt';
  643.  
  644.             if SaveDialog.Execute then
  645.             begin
  646.                 StrFilePath := SaveDialog.FileName;
  647.                 StrFilePath := FindRegEx(StrFilePath, '.+\.txt', StrFilePath + '.txt')[0];
  648.  
  649.                 if FileExists(StrFilePath) then
  650.                     if MyMessageBoxYesNo(MainForm, 'Перезаписать файл?', 'Такой файл уже существует.' +
  651.                         #10#13 + 'Вы хотите перезаписать файл? Это действие невозможно отменить.', True)
  652.                     then
  653.                         ShouldNotRepeat := True
  654.                     else
  655.                         ShouldNotRepeat := False
  656.                 else
  657.                     ShouldNotRepeat := True;
  658.  
  659.                 if ShouldNotRepeat then
  660.                 begin
  661.                     AssignFile(FileOutput, StrFilePath);
  662.                     Rewrite(FileOutput);
  663.  
  664.                     Writeln(FileOutput, 'Матрица весов рёбер:');
  665.                     i := 0;
  666.                     while i < Length(Matrix) do
  667.                     begin
  668.                         j := 0;
  669.                         while j < Length(Matrix) do
  670.                         begin
  671.                             if Matrix[i][j] <> INF then
  672.                                 Write(FileOutput, IntToStr(Matrix[i][j]) + ' ')
  673.                             else
  674.                                 Write(FileOutput, '- ');
  675.                             Inc(j);
  676.                         end;
  677.                         Writeln(FileOutput);
  678.  
  679.                         Inc(i);
  680.                     end;
  681.  
  682.                     if FullWeightMatrix[SpinEditFromVertex.Value - 1][SpinEditToVertex.Value - 1] < Inf then
  683.                     begin
  684.                         Writeln(FileOutput, 'Путь из вершины ' + SpinEditFromVertex.Text + ' в вершину ' + SpinEditToVertex.Text + ' имеет вес ' + IntToStr(FullWeightMatrix[SpinEditFromVertex.Value - 1][SpinEditToVertex.Value - 1]) + '.');
  685.                         Writeln(FileOutput, PathStr);
  686.                     end
  687.                     else
  688.                         Writeln(FileOutput, 'Путь из вершины ' + SpinEditFromVertex.Text + ' в вершину ' + SpinEditToVertex.Text + ' не найден.');
  689.  
  690.                     CloseFile(FileOutput);
  691.                     DataIsSaved := True;
  692.                     BalloonHint1.Title := 'Готово';
  693.                     BalloonHint1.Description := 'Партия успешно сохранена в файл.';
  694.                     Point.X := MultPixels(20);
  695.                     Point.Y := 0;
  696.                     Balloonhint1.ShowHint(ClientToScreen(Point));
  697.                 end;
  698.             end;
  699.         until ShouldNotRepeat;
  700.     except
  701.         MyMessageBoxInfo(MainForm, 'Ошибка', 'Не удается открыть файл для вывода данных или записать в него данные.');
  702.     end;
  703. end;
  704.  
  705. end.
Advertisement
Add Comment
Please, Sign In to add comment