Advertisement
anticlown

Laba.7.2.Full(Delphi)

Jun 5th, 2023
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 27.33 KB | None | 0 0
  1. Unit UnitVCLMain;
  2.  
  3. Interface
  4.  
  5. Uses
  6.     Winapi.Windows,
  7.     Winapi.Messages,
  8.     System.SysUtils,
  9.     System.Variants,
  10.     System.Classes,
  11.     Vcl.Graphics,
  12.     Vcl.Controls,
  13.     Vcl.Forms,
  14.     Vcl.Dialogs,
  15.     Vcl.StdCtrls,
  16.     Vcl.Buttons,
  17.     Vcl.ExtCtrls,
  18.     Vcl.Grids,
  19.     Vcl.WinXCtrls,
  20.     System.Actions,
  21.     Vcl.ActnList,
  22.     System.ImageList,
  23.     Vcl.ImgList,
  24.     Vcl.VirtualImageList,
  25.     ClipBrd;
  26.  
  27. Type
  28.     TMatrix = Array Of Array Of Integer;
  29.  
  30.     TLabeledEdit = Class(Vcl.ExtCtrls.TLabeledEdit)
  31.     Protected
  32.         Procedure WMPaste(Var Msg: TMessage); Message WM_PASTE;
  33.     End;
  34.  
  35.     TfrmMain = Class(TForm)
  36.         PTop: TPanel;
  37.         SdbtMenu: TSpeedButton;
  38.         LbWelcome: TLabel;
  39.         PClient: TPanel;
  40.         LbTaskInfo: TLabel;
  41.         LbMatrixRequirement: TLabel;
  42.         SplvMenu: TSplitView;
  43.         SdbtExit: TSpeedButton;
  44.         SdbtSaveToFile: TSpeedButton;
  45.         SdbtOpenFromFile: TSpeedButton;
  46.         SdbtStart: TSpeedButton;
  47.         SdbtHelp: TSpeedButton;
  48.         SdbtAboutDeveloper: TSpeedButton;
  49.         StrgrMatrix: TStringGrid;
  50.         BalloonHint: TBalloonHint;
  51.         OpdOpenFromFileDialog: TOpenDialog;
  52.         SvdSaveToFileDialog: TSaveDialog;
  53.         VilImages_48: TVirtualImageList;
  54.         LbeNodesRequirement: TLabeledEdit;
  55.         LbGraph: TLabel;
  56.         BtContinue: TButton;
  57.         BtFind: TButton;
  58.         LbIncorrectInput: TLabel;
  59.         BtBack: TButton;
  60.         Procedure SdbtMenuClick(Sender: TObject);
  61.         Procedure SdbtExitClick(Sender: TObject);
  62.         Procedure SdbtHelpClick(Sender: TObject);
  63.         Procedure SdbtAboutDeveloperClick(Sender: TObject);
  64.         Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  65.         Procedure SdbtOpenFromFileClick(Sender: TObject);
  66.         Procedure SdbtSaveToFileClick(Sender: TObject);
  67.         Procedure LbeNodesRequirementChange(Sender: TObject);
  68.         Procedure BtContinueClick(Sender: TObject);
  69.         Procedure FormCreate(Sender: TObject);
  70.         Procedure BtBackClick(Sender: TObject);
  71.         Procedure BtFindClick(Sender: TObject);
  72.     Private
  73.         IsFirstMatrixCorrect: Boolean;
  74.         Function CheckInput(): Boolean;
  75.     Public
  76.         FirstAdjacencyMatrix: TMatrix;
  77.         SecondAdjacencyMatrix: TMatrix;
  78.     End;
  79.  
  80. Var
  81.     FrmMain: TfrmMain;
  82.  
  83. Implementation
  84.  
  85. {$R *.dfm}
  86.  
  87. Uses UnitData,
  88.     UnitVCLVisualization;
  89.  
  90. { бэк }
  91.  
  92. Function TfrmMain.CheckInput: Boolean;
  93. Const
  94.     MIN_VALUE = 0;
  95.     MAX_VALUE = 1;
  96. Var
  97.     I, J: Integer;
  98.     IsCorrect: Boolean;
  99. Begin
  100.     IsCorrect := True;
  101.     For I := 1 To StrgrMatrix.ColCount - 1 Do
  102.         For J := 1 To StrgrMatrix.RowCount - 1 Do
  103.             Try
  104.                 If (StrToInt(StrgrMatrix.Cells[I, J]) < MIN_VALUE) Or (StrToInt(StrgrMatrix.Cells[I, J]) > MAX_VALUE) Or
  105.                     (Length(StrgrMatrix.Cells[I, J]) > 1) Then
  106.                     IsCorrect := False;
  107.             Except
  108.                 Application.MessageBox('Матрица задана некорректно!', 'Ошибка', MB_ICONERROR);
  109.                 IsCorrect := False;
  110.                 Exit;
  111.             End;
  112.     CheckInput := IsCorrect;
  113. End;
  114.  
  115. Function IsFileCorrect(Path: String): Boolean;
  116. Const
  117.     MIN_SIZE = 2;
  118.     MAX_SIZE = 10;
  119. Var
  120.     InputFile: TextFile;
  121.     IsCorrect: Boolean;
  122.     Size, I, J: Integer;
  123.     Matrix: TMatrix;
  124. Begin
  125.     AssignFile(InputFile, Path);
  126.     IsCorrect := True;
  127.  
  128.     Try
  129.         Try
  130.             Reset(InputFile);
  131.             Readln(InputFile, Size);
  132.  
  133.             If (Size < MIN_SIZE) Or (Size > MAX_SIZE) Then
  134.                 IsCorrect := False
  135.             Else
  136.             Begin
  137.                 SetLength(Matrix, Size, Size);
  138.                 I := 0;
  139.  
  140.                 While (IsCorrect) And (I < Size) Do
  141.                 Begin
  142.                     J := 0;
  143.  
  144.                     While (IsCorrect) And (J < Size) Do
  145.                     Begin
  146.                         Read(InputFile, Matrix[I, J]);
  147.                         If (Matrix[I, J] < 0) Or (Matrix[I, J] > Size) Then
  148.                             IsCorrect := False;
  149.                         Inc(J);
  150.                     End;
  151.  
  152.                     Inc(I);
  153.                 End;
  154.             End;
  155.         Finally
  156.             CloseFile(InputFile);
  157.         End;
  158.     Except
  159.         IsCorrect := False;
  160.     End;
  161.  
  162.     IsFileCorrect := IsCorrect;
  163. End;
  164.  
  165. Procedure GetSizeFromFile(Const Path: String; Var Size: Single; Var IsCorrect: Boolean);
  166. Var
  167.     InputFile: TextFile;
  168.     Null: String;
  169. Begin
  170.     IsCorrect := True;
  171.     Try
  172.         AssignFile(InputFile, Path);
  173.         Try
  174.             Reset(InputFile);
  175.             Readln(InputFile, Null);
  176.  
  177.             If (Null <> '') Then
  178.                 IsCorrect := True
  179.             Else
  180.             Begin
  181.                 IsCorrect := False;
  182.                 Application.MessageBox('Файл пуст!', 'Ошибка', MB_ICONERROR);
  183.             End;
  184.         Finally
  185.             Close(InputFile);
  186.         End;
  187.     Except
  188.         Application.MessageBox('Ошибка доступа!', 'Ошибка', MB_ICONERROR);
  189.     End;
  190.  
  191.     If (IsCorrect) Then
  192.     Begin
  193.         Try
  194.             Try
  195.                 Reset(InputFile);
  196.                 Readln(InputFile, Size);
  197.             Finally
  198.                 Close(InputFile);
  199.             End;
  200.         Except
  201.             IsCorrect := False;
  202.         End;
  203.     End;
  204. End;
  205.  
  206. Function GetMatrixFromFile(Const Path: String; Const Size: Single; Var Matrix: TMatrix; Var IsCorrect: Boolean): TMatrix;
  207. Var
  208.     InputFile: TextFile;
  209.     I, J: Integer;
  210.     Null: String;
  211. Begin
  212.     IsCorrect := True;
  213.     Try
  214.         AssignFile(InputFile, Path);
  215.         Reset(InputFile);
  216.         Readln(InputFile, Null);
  217.         If (Null <> '') Then
  218.             IsCorrect := True
  219.         Else
  220.         Begin
  221.             IsCorrect := False;
  222.             Application.MessageBox('Данные в файле введены неверно или отсутствуют!', 'Ошибка', MB_ICONERROR);
  223.         End;
  224.  
  225.     Except
  226.         Application.MessageBox('Ошибка доступа!', 'Ошибка', MB_ICONERROR);
  227.     End;
  228.  
  229.     If (IsCorrect) Then
  230.     Begin
  231.         Try
  232.             Reset(InputFile);
  233.             Readln(InputFile);
  234.             For I := Low(Matrix) To High(Matrix) Do
  235.                 For J := Low(Matrix[0]) To High(Matrix[0]) Do
  236.                     Read(InputFile, Matrix[I, J]);
  237.         Except
  238.             IsCorrect := False;
  239.         End;
  240.         Close(InputFile);
  241.     End;
  242.  
  243.     GetMatrixFromFile := Matrix;
  244. End;
  245.  
  246. Function GetSecondMatrixFromFile(Const Path: String; Const Size: Single; Var Matrix: TMatrix; Var IsCorrect: Boolean): TMatrix;
  247. Var
  248.     InputFile: TextFile;
  249.     I, J: Integer;
  250.     Null: String;
  251. Begin
  252.     IsCorrect := True;
  253.     Try
  254.         AssignFile(InputFile, Path);
  255.         Reset(InputFile);
  256.         Readln(InputFile, Null);
  257.         If (Null <> '') Then
  258.             IsCorrect := True
  259.         Else
  260.         Begin
  261.             IsCorrect := False;
  262.             Application.MessageBox('Данные в файле введены неверно или отсутствуют!', 'Ошибка', MB_ICONERROR);
  263.         End;
  264.  
  265.     Except
  266.         Application.MessageBox('Ошибка доступа!', 'Ошибка', MB_ICONERROR);
  267.     End;
  268.  
  269.     If (IsCorrect) Then
  270.     Begin
  271.         Try
  272.             Reset(InputFile);
  273.             Readln(InputFile);
  274.             For I := Low(Matrix) To High(Matrix) Do
  275.                 Readln(InputFile);
  276.             For I := Low(Matrix) To High(Matrix) Do
  277.                 For J := Low(Matrix[0]) To High(Matrix[0]) Do
  278.                     Read(InputFile, Matrix[I, J]);
  279.         Except
  280.             IsCorrect := False;
  281.         End;
  282.         Close(InputFile);
  283.     End;
  284.  
  285.     GetSecondMatrixFromFile := Matrix;
  286. End;
  287.  
  288. { форма }
  289.  
  290. Procedure TfrmMain.FormCreate(Sender: TObject);
  291. Begin
  292.     IsFirstMatrixCorrect := False;
  293. End;
  294.  
  295. Procedure TfrmMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  296. Begin
  297.     If Application.MessageBox(PChar('Вы уверены, что хотите выйти?'), PChar('Выход'), MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1 + MB_TASKMODAL)
  298.         = IDYES Then
  299.         CanClose := True
  300.     Else
  301.         CanClose := False;
  302. End;
  303.  
  304. Procedure TLabeledEdit.WMPaste(Var Msg: TMessage);
  305. Const
  306.     MIN_VALUE = 2;
  307.     MAX_VALUE = 10;
  308. Begin
  309.     If Clipboard.HasFormat(CF_TEXT) Then
  310.     Begin
  311.         Try
  312.             If (StrToInt(Clipboard.AsText) < MIN_VALUE) Or (StrToInt(Clipboard.AsText) > MAX_VALUE) Then
  313.             Begin
  314.                 Application.MessageBox(Pchar('В буфере обмена содержится неподходящее значение!'), 'Ошибка', MB_ICONWARNING);
  315.                 Exit;
  316.             End;
  317.         Except
  318.             Application.MessageBox(Pchar('При чтении из буфера произошла ошибка!'), 'Ошибка', MB_ICONWARNING);
  319.             Exit;
  320.         End;
  321.     End
  322.     Else
  323.     Begin
  324.         Application.MessageBox(Pchar('В буфере обмена содержатся некорректные данные!'), 'Ошибка', MB_ICONWARNING);
  325.         Exit;
  326.     End;
  327.     Inherited;
  328. End;
  329.  
  330. Function NewEditProc(Window: HWND; UMsg: UINT; WindowParametr: WPARAM; LParam: LPARAM): Integer; Stdcall;
  331. Const
  332.     MIN_VALUE = 0;
  333.     MAX_VALUE = 1;
  334. Var
  335.     Col, Row: Integer;
  336. Begin
  337.     Col := FrmMain.StrgrMatrix.Col;
  338.     Row := FrmMain.StrgrMatrix.Row;
  339.  
  340.     If UMsg = WM_PASTE Then
  341.     Begin
  342.         Try
  343.             If (StrToInt(Clipboard.AsText) < MIN_VALUE) Or (StrToInt(Clipboard.AsText) > MAX_VALUE) Then
  344.             Begin
  345.                 Application.MessageBox(Pchar('В буфере обмена содержится неподходящее значение!'), 'Ошибка', MB_ICONWARNING);
  346.                 Exit;
  347.             End
  348.             Else
  349.             Begin
  350.                 FrmMain.StrgrMatrix.Cells[Col, Row] := Clipboard.AsText;
  351.                 Exit;
  352.             End;
  353.         Except
  354.             Application.MessageBox(Pchar('В буфере обмена находятся неподходящие данные!'), 'Ошибка', MB_ICONWARNING);
  355.             Exit;
  356.         End;
  357.     End
  358.     Else
  359.         Result := CallWindowProc(Pointer(GetWindowLong(Window, GWL_USERDATA)), Window, UMsg, WindowParametr, LParam);
  360. End;
  361.  
  362. { кнопки на боковой панели }
  363.  
  364. Procedure TfrmMain.SdbtAboutDeveloperClick(Sender: TObject);
  365. Const
  366.     FIRST_MESSAGE = 'Ф.И.О.: Карась А.С. a.k.a Clownfish' + #13#10;
  367.     SECOND_MESSAGE = 'Группа: 251004' + #13#10;
  368.     THIRD_MESSAGE = 'Контакты: предварительная запись вживую по адресу' + #13#10;
  369.     FOURTH_MESSAGE = 'г.Гродно, ул.Мостовая, д.31';
  370. Begin
  371.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE, 'О разработчике');
  372. End;
  373.  
  374. Procedure TfrmMain.SdbtExitClick(Sender: TObject);
  375. Begin
  376.     Close;
  377. End;
  378.  
  379. Procedure TfrmMain.SdbtHelpClick(Sender: TObject);
  380. Const
  381.     FIRST_MESSAGE = '- Вводимыми значениями могут являться только целые числа!' + #13#10;
  382.     SECOND_MESSAGE = '- Диапазон ввода количества вершин: 2...10' + #13#10;
  383.     THIRD_MESSAGE = '- Для ввода из файла используйте вкладку ''Файл'' - ''Открыть''.' + #13#10;
  384.     FOURTH_MESSAGE = '- Для сохранения в файл используйте вкладку ''Файл'' - ''Сохранить''.' + #13#10;
  385.     FIFTH_MESSAGE = '- Для удобного использования программы представлен набор кнопок на левой панели.';
  386. Begin
  387.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE + FIFTH_MESSAGE, 'Справка');
  388. End;
  389.  
  390. Procedure TfrmMain.SdbtMenuClick(Sender: TObject);
  391. Begin
  392.     SplvMenu.Opened := Not SplvMenu.Opened;
  393. End;
  394.  
  395. Procedure TfrmMain.SdbtOpenFromFileClick(Sender: TObject);
  396. Var
  397.     SizeFromFile: Single;
  398.     IsCorrect: Boolean;
  399.     Size, I, J: Integer;
  400. Begin
  401.     If OpdOpenFromFileDialog.Execute() Then
  402.         If IsFileCorrect(OpdOpenFromFileDialog.FileName) Then
  403.         Begin
  404.             GetSizeFromFile(OpdOpenFromFileDialog.FileName, SizeFromFile, IsCorrect);
  405.             Size := Round(SizeFromFile);
  406.  
  407.             SetLength(FirstAdjacencyMatrix, Size, Size);
  408.             SetLength(SecondAdjacencyMatrix, Size, Size);
  409.             FirstAdjacencyMatrix := GetMatrixFromFile(OpdOpenFromFileDialog.FileName, Size, FirstAdjacencyMatrix, IsCorrect);
  410.             SecondAdjacencyMatrix := GetSecondMatrixFromFile(OpdOpenFromFileDialog.FileName, Size, SecondAdjacencyMatrix, IsCorrect);
  411.  
  412.             If (IsCorrect) Then
  413.             Begin
  414.                 LbeNodesRequirement.Text := IntToStr(Size);
  415.                 For I := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  416.                     For J := Low(FirstAdjacencyMatrix[0]) To High(FirstAdjacencyMatrix[0]) Do
  417.                         StrgrMatrix.Cells[J + 1, I + 1] := IntToStr(FirstAdjacencyMatrix[I, J]);
  418.                 BtContinueClick(Sender);
  419.                 For I := Low(SecondAdjacencyMatrix) To High(SecondAdjacencyMatrix) Do
  420.                     For J := Low(SecondAdjacencyMatrix[0]) To High(SecondAdjacencyMatrix[0]) Do
  421.                         StrgrMatrix.Cells[J + 1, I + 1] := IntToStr(SecondAdjacencyMatrix[I, J]);
  422.                 BtFindClick(Sender);
  423.             End
  424.             Else
  425.                 Application.MessageBox('Данные в файле некорректны, попробуйте ещё раз.', 'Ошибка!', MB_ICONERROR);
  426.         End
  427.         Else
  428.             Application.MessageBox('Данные в файле некорректны, попробуйте ещё раз.', 'Ошибка!', MB_ICONERROR);
  429. End;
  430.  
  431. Procedure TfrmMain.SdbtSaveToFileClick(Sender: TObject);
  432. Var
  433.     OutputFile: TextFile;
  434.     I, J: Integer;
  435. Begin
  436.  
  437.     If SvdSaveToFileDialog.Execute() And FileExists(SvdSaveToFileDialog.FileName) Then
  438.     Begin
  439.         AssignFile(OutputFile, SvdSaveToFileDialog.FileName);
  440.  
  441.         Try
  442.             Try
  443.                 Rewrite(OutputFile);
  444.  
  445.                 Writeln(OutputFile, 'Входные данные ');
  446.                 Writeln(OutputFile, 'Кол-во вершин: ', Length(FirstAdjacencyMatrix));
  447.  
  448.                 Write(OutputFile, 'Первая матрица смежности: ' + #13#10);
  449.                 Write(OutputFile, '    ');
  450.                 For I := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  451.                     Write(OutputFile, I + 1, '    ');
  452.                 Write(OutputFile, #13#10);
  453.                 For I := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  454.                 Begin
  455.                     Write(OutputFile, I + 1, '   ');
  456.                     For J := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  457.                         Write(OutputFile, FirstAdjacencyMatrix[I, J], '    ');
  458.                     Write(OutputFile, #13#10);
  459.                 End;
  460.  
  461.                 Write(OutputFile, 'Вторая матрица смежности: ' + #13#10);
  462.                 Write(OutputFile, '    ');
  463.                 For I := Low(SecondAdjacencyMatrix) To High(SecondAdjacencyMatrix) Do
  464.                     Write(OutputFile, I + 1, '    ');
  465.                 Write(OutputFile, #13#10);
  466.                 For I := Low(SecondAdjacencyMatrix) To High(SecondAdjacencyMatrix) Do
  467.                 Begin
  468.                     Write(OutputFile, I + 1, '   ');
  469.                     For J := Low(SecondAdjacencyMatrix) To High(SecondAdjacencyMatrix) Do
  470.                         Write(OutputFile, SecondAdjacencyMatrix[I, J], '    ');
  471.                     Write(OutputFile, #13#10);
  472.                 End;
  473.                 Writeln(OutputFile, 'Ответ: ', FrmVisualization.PBottom.Caption);
  474.  
  475.                 Application.MessageBox('Данные успешно записаны в файл!', 'Сохранение', MB_ICONINFORMATION);
  476.             Finally
  477.                 CloseFile(OutputFile);
  478.             End;
  479.         Except
  480.             Application.MessageBox('Отказано в доступе! Измените параметры файла! ', 'Ошибка!', MB_ICONERROR);
  481.         End;
  482.     End
  483.     Else
  484.         Application.MessageBox('Введено некорректное имя файла или закрыто окно сохранения!', 'Ошибка!', MB_ICONERROR);
  485.  
  486. End;
  487.  
  488. { компоненты формы }
  489.  
  490. Procedure TfrmMain.LbeNodesRequirementChange(Sender: TObject);
  491. Const
  492.     MIN_VALUE = 2;
  493.     MAX_VALUE = 10;
  494. Var
  495.     I: Integer;
  496. Begin
  497.     IsFirstMatrixCorrect := False;
  498.     For I := 0 To StrgrMatrix.RowCount Do
  499.         StrgrMatrix.Rows[I].Clear;
  500.     If (LbeNodesRequirement.Text <> '') And Not((StrToInt(LbeNodesRequirement.Text) < MIN_VALUE) Or
  501.         (StrToInt(LbeNodesRequirement.Text) > MAX_VALUE)) Then
  502.     Begin
  503.         StrgrMatrix.ColCount := StrToInt(LbeNodesRequirement.Text) + 1;
  504.         StrgrMatrix.RowCount := StrgrMatrix.ColCount;
  505.         StrgrMatrix.Width := (StrgrMatrix.DefaultColWidth + 3) * StrgrMatrix.ColCount;
  506.         If StrgrMatrix.Width > StrgrMatrix.Constraints.MaxWidth Then
  507.             StrgrMatrix.Width := StrgrMatrix.Constraints.MaxWidth;
  508.         StrgrMatrix.Height := (StrgrMatrix.DefaultRowHeight + 3) * StrgrMatrix.RowCount;
  509.         If StrgrMatrix.Height > StrgrMatrix.Constraints.MaxHeight Then
  510.             StrgrMatrix.Height := StrgrMatrix.Constraints.MaxHeight;
  511.         For I := 1 To StrgrMatrix.RowCount Do
  512.         Begin
  513.             StrgrMatrix.Cells[I, 0] := IntToStr(I);
  514.             StrgrMatrix.Cells[0, I] := IntToStr(I);
  515.         End;
  516.  
  517.         StrgrMatrix.Left := (FrmMain.Width - StrgrMatrix.Width) Div 2 + 10;
  518.         LbMatrixRequirement.Visible := True;
  519.         StrgrMatrix.Visible := True;
  520.         LbIncorrectInput.Visible := False;
  521.     End
  522.     Else
  523.     Begin
  524.         LbMatrixRequirement.Visible := False;
  525.         StrgrMatrix.Visible := False;
  526.         SdbtStart.Enabled := False;
  527.         LbIncorrectInput.Visible := True;
  528.     End;
  529. End;
  530.  
  531. Procedure TfrmMain.BtBackClick(Sender: TObject);
  532. Var
  533.     I, J: Integer;
  534. Begin
  535.     BtContinue.Enabled := True;
  536.     BtBack.Enabled := False;
  537.     BtBack.Visible := False;
  538.     BtFind.Enabled := False;
  539.     BtFind.Visible := False;
  540.     SdbtStart.Enabled := False;
  541.     LbGraph.Caption := 'Первый граф';
  542.     LbeNodesRequirement.Enabled := True;
  543.  
  544.     For I := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  545.         For J := Low(FirstAdjacencyMatrix[0]) To High(FirstAdjacencyMatrix[0]) Do
  546.             StrgrMatrix.Cells[J + 1, I + 1] := IntToStr(FirstAdjacencyMatrix[I, J]);
  547. End;
  548.  
  549. Procedure TfrmMain.BtContinueClick(Sender: TObject);
  550. Var
  551.     I, J: Integer;
  552. Begin
  553.     If CheckInput Then
  554.     Begin
  555.         SetLength(FirstAdjacencyMatrix, StrToInt(LbeNodesRequirement.Text), StrToInt(LbeNodesRequirement.Text));
  556.         For I := Low(FirstAdjacencyMatrix) To High(FirstAdjacencyMatrix) Do
  557.             For J := Low(FirstAdjacencyMatrix[0]) To High(FirstAdjacencyMatrix[0]) Do
  558.                 FirstAdjacencyMatrix[I, J] := StrToInt(StrgrMatrix.Cells[J + 1, I + 1]);
  559.         IsFirstMatrixCorrect := True;
  560.  
  561.         BtContinue.Enabled := False;
  562.         BtBack.Enabled := True;
  563.         BtBack.Visible := True;
  564.         BtFind.Enabled := True;
  565.         BtFind.Visible := True;
  566.         SdbtStart.Enabled := True;
  567.         LbeNodesRequirement.Enabled := False;
  568.         LbGraph.Caption := 'Второй граф';
  569.  
  570.         For I := 1 To StrgrMatrix.ColCount - 1 Do
  571.             For J := 1 To StrgrMatrix.RowCount - 1 Do
  572.                 StrgrMatrix.Cells[I, J] := IntToStr(SecondAdjacencyMatrix[J - 1, I - 1]);
  573.     End;
  574. End;
  575.  
  576. Procedure TfrmMain.BtFindClick(Sender: TObject);
  577. Var
  578.     I, J: Integer;
  579. Begin
  580.     If CheckInput Then
  581.     Begin
  582.         SetLength(SecondAdjacencyMatrix, StrToInt(LbeNodesRequirement.Text), StrToInt(LbeNodesRequirement.Text));
  583.         For I := Low(SecondAdjacencyMatrix) To High(SecondAdjacencyMatrix) Do
  584.             For J := Low(SecondAdjacencyMatrix[0]) To High(SecondAdjacencyMatrix[0]) Do
  585.                 SecondAdjacencyMatrix[I, J] := StrToInt(StrgrMatrix.Cells[J + 1, I + 1]);
  586.  
  587.         SdbtSaveToFile.Enabled := True;
  588.         FrmVisualization.Show;
  589.         FrmMain.Hide;
  590.     End;
  591. End;
  592.  
  593. End.
  594.  
  595. Unit UnitVCLLoadingScreen;
  596.  
  597. Interface
  598.  
  599. Uses
  600.     Winapi.Windows,
  601.     Winapi.Messages,
  602.     System.SysUtils,
  603.     System.Variants,
  604.     System.Classes,
  605.     Vcl.Graphics,
  606.     Vcl.Controls,
  607.     Vcl.Forms,
  608.     Vcl.Dialogs,
  609.     Vcl.ExtCtrls,
  610.     Vcl.Imaging.Pngimage, Vcl.Imaging.jpeg;
  611.  
  612. Type
  613.     TfrmLoadingScreen = Class(TForm)
  614.         TmrEndLoadingScreen: TTimer;
  615.         TmrAlphaBlendChanging: TTimer;
  616.     imLogo: TImage;
  617.     pBack: TPanel;
  618.         Procedure FormCreate(Sender: TObject);
  619.         Procedure TmrEndLoadingScreenTimer(Sender: TObject);
  620.         Procedure TmrAlphaBlendChangingTimer(Sender: TObject);
  621.     End;
  622.  
  623. Var
  624.     FrmLoadingScreen: TfrmLoadingScreen;
  625.  
  626. Implementation
  627.  
  628. {$R *.dfm}
  629.  
  630. Procedure TfrmLoadingScreen.FormCreate(Sender: TObject);
  631. Var
  632.     HRgn: Cardinal;
  633. Begin
  634.     HRgn := CreateEllipticRgn(0, 0, 400, 400);
  635.     SetWindowRgn(Handle, HRgn, False);
  636.  
  637.     TmrEndLoadingScreen.Enabled := True;
  638.     TmrAlphaBlendChanging.Enabled := True;
  639. End;
  640.  
  641. Procedure TfrmLoadingScreen.TmrAlphaBlendChangingTimer(Sender: TObject);
  642. Begin
  643.     If FrmLoadingScreen.AlphaBlendValue > 253 Then
  644.         TmrAlphaBlendChanging.Enabled := False
  645.     Else
  646.         FrmLoadingScreen.AlphaBlendValue := FrmLoadingScreen.AlphaBlendValue + 2;
  647. End;
  648.  
  649. Procedure TfrmLoadingScreen.TmrEndLoadingScreenTimer(Sender: TObject);
  650. Begin
  651.     TmrEndLoadingScreen.Enabled := False;
  652. End;
  653.  
  654. End.
  655.  
  656. Unit UnitData;
  657.  
  658. Interface
  659.  
  660. Uses
  661.     System.SysUtils,
  662.     System.Classes, Vcl.BaseImageCollection, Vcl.ImageCollection;
  663.  
  664. Type
  665.     TdtmdImages = Class(TDataModule)
  666.     imcImages: TImageCollection;
  667.     End;
  668.  
  669. Var
  670.     dtmdImages: TdtmdImages;
  671.  
  672. Implementation
  673.  
  674. {%CLASSGROUP 'Vcl.Controls.TControl'}
  675. {$R *.dfm}
  676.  
  677. End.
  678.  
  679. Unit UnitVCLVisualization;
  680.  
  681. Interface
  682.  
  683. Uses
  684.     Winapi.Windows,
  685.     Winapi.Messages,
  686.     System.SysUtils,
  687.     System.Variants,
  688.     System.Classes,
  689.     Vcl.Graphics,
  690.     Vcl.Controls,
  691.     Vcl.Forms,
  692.     Vcl.Dialogs,
  693.     Vcl.StdCtrls,
  694.     Vcl.ExtCtrls,
  695.     UnitVCLMain;
  696.  
  697. Type
  698.     TCoords = Record
  699.         X: Integer;
  700.         Y: Integer;
  701.     End;
  702.  
  703.     TArr = Array Of Integer;
  704.  
  705.     TfrmVisualization = Class(TForm)
  706.         PBottom: TPanel;
  707.         BtClose: TButton;
  708.         BtSaveToFile: TButton;
  709.         PbFirst: TPaintBox;
  710.         PbSecond: TPaintBox;
  711.         Procedure FormClose(Sender: TObject; Var Action: TCloseAction);
  712.         Procedure BtCloseClick(Sender: TObject);
  713.         Procedure BtSaveToFileClick(Sender: TObject);
  714.         Procedure FormShow(Sender: TObject);
  715.         Procedure PbFirstPaint(Sender: TObject);
  716.         Procedure PbSecondPaint(Sender: TObject);
  717.     Private
  718.         Function GetPowers(Matrix: TMatrix): TArr;
  719.         Function FindIsIsomorphic(Const FirstMatrix, SecondMatrix: TMatrix): Boolean;
  720.         Procedure VizualizeGraph(Canvas: TCanvas; Const Matrix: TMatrix);
  721.     End;
  722.  
  723. Var
  724.     FrmVisualization: TfrmVisualization;
  725.  
  726. Implementation
  727.  
  728. {$R *.dfm}
  729. { бэк }
  730.  
  731. Function TfrmVisualization.GetPowers(Matrix: TMatrix): TArr;
  732. Var
  733.     I, J, SumOfConnections, Temp: Integer;
  734.     Vector: TArr;
  735. Begin
  736.     SetLength(Vector, Length(Matrix));
  737.     For I := Low(Matrix) To High(Matrix) Do
  738.     Begin
  739.         SumOfConnections := 0;
  740.         For J := Low(Matrix[0]) To High(Matrix[0]) Do
  741.             If Matrix[I, J] = 0 Then
  742.                 Inc(SumOfConnections);
  743.         Vector[I] := SumOfConnections;
  744.     End;
  745.  
  746.     For I := Low(Vector) To High(Vector) Do
  747.         For J := Low(Vector) To High(Vector) - 1 Do
  748.             If Vector[J] > Vector[J + 1] Then
  749.             Begin
  750.                 Temp := Vector[J];
  751.                 Vector[J] := Vector[J + 1];
  752.                 Vector[J + 1] := Temp;
  753.             End;
  754.  
  755.     GetPowers := Vector;
  756. End;
  757.  
  758. Procedure TfrmVisualization.PbFirstPaint(Sender: TObject);
  759. Begin
  760.     VizualizeGraph(PbFirst.Canvas, FrmMain.FirstAdjacencyMatrix);
  761. End;
  762.  
  763. Procedure TfrmVisualization.PbSecondPaint(Sender: TObject);
  764. Begin
  765.     VizualizeGraph(PbSecond.Canvas, FrmMain.SecondAdjacencyMatrix);
  766. End;
  767.  
  768. Function TfrmVisualization.FindIsIsomorphic(Const FirstMatrix, SecondMatrix: TMatrix): Boolean;
  769. Var
  770.     I, J: Integer;
  771.     IsIsomorphic: Boolean;
  772.     FirstVector, SecondVector: TArr;
  773. Begin
  774.     IsIsomorphic := True;
  775.     SetLength(FirstVector, Length(FirstMatrix));
  776.     SetLength(SecondVector, Length(SecondMatrix));
  777.  
  778.     If Length(FirstMatrix) <> Length(SecondMatrix) Then
  779.         IsIsomorphic := False
  780.     Else
  781.     Begin
  782.         FirstVector := GetPowers(FirstMatrix);
  783.         SecondVector := GetPowers(SecondMatrix);
  784.  
  785.         For I := Low(FirstVector) To High(FirstVector) Do
  786.             If FirstVector[I] <> SecondVector[I] Then
  787.                 IsIsomorphic := False;
  788.     End;
  789.  
  790.     FindIsIsomorphic := IsIsomorphic;
  791. End;
  792.  
  793. { компоненты }
  794.  
  795. Procedure TfrmVisualization.VizualizeGraph(Canvas: TCanvas; Const Matrix: TMatrix);
  796. Const
  797.     X0 = 200;
  798.     Y0 = 200;
  799.     Radius = 150;
  800.     Pi = 3;
  801. Var
  802.     X, Y, A, I, J, NodeRadius: Integer;
  803.     VectorOfCoords: Array Of TCoords;
  804. Begin
  805.     Randomize;
  806.     SetLength(VectorOfCoords, Length(Matrix));
  807.     NodeRadius := Radius Div 8;
  808.     With Canvas Do
  809.     Begin
  810.         For I := Low(Matrix) To High(Matrix) Do
  811.         Begin
  812.             A := 2 * Pi * ((I + 1) * 360 Div Length(Matrix));
  813.             //A := 2 * Pi * Random(Radius);
  814.             X := X0 + Round(Radius * Cos(A));
  815.             Y := Y0 + Round(Radius * Sin(A));
  816.             VectorOfCoords[I].X := X;
  817.             VectorOfCoords[I].Y := Y;
  818.         End;
  819.     End;
  820.  
  821.     Canvas.Font.Size := 12;
  822.     Canvas.Pen.Width := 3;
  823.     For I := Low(Matrix) To High(Matrix) Do
  824.         For J := Low(Matrix) To High(Matrix) Do
  825.             If (Matrix[I, J] = 1) And (I <> J) Then
  826.                 With Canvas Do
  827.                 Begin
  828.                     Pen.Color := ClRed;
  829.                     MoveTo(VectorOfCoords[I].X, VectorOfCoords[I].Y);
  830.                     LineTo(VectorOfCoords[J].X, VectorOfCoords[J].Y);
  831.                     Pen.Color := ClBlack;
  832.                 End;
  833.  
  834.     For I := Low(Matrix) To High(Matrix) Do
  835.     Begin
  836.         Canvas.Ellipse(VectorOfCoords[I].X - NodeRadius, VectorOfCoords[I].Y - NodeRadius, VectorOfCoords[I].X + NodeRadius,
  837.             VectorOfCoords[I].Y + NodeRadius);
  838.         Canvas.TextOut(VectorOfCoords[I].X - 7, VectorOfCoords[I].Y - 10, IntToStr(I + 1));
  839.     End;
  840. End;
  841.  
  842. Procedure TfrmVisualization.BtCloseClick(Sender: TObject);
  843. Begin
  844.     Close;
  845. End;
  846.  
  847. Procedure TfrmVisualization.BtSaveToFileClick(Sender: TObject);
  848. Begin
  849.     FrmMain.SdbtSaveToFileClick(Sender);
  850. End;
  851.  
  852. Procedure TfrmVisualization.FormClose(Sender: TObject; Var Action: TCloseAction);
  853. Begin
  854.     FrmMain.Show;
  855. End;
  856.  
  857. Procedure TfrmVisualization.FormShow(Sender: TObject);
  858. Var
  859.     IsIsomorphic: Boolean;
  860. Begin
  861.     PbFirst.Repaint;
  862.     PbSecond.Repaint;
  863.     IsIsomorphic := FindIsIsomorphic(FrmMain.FirstAdjacencyMatrix, FrmMain.SecondAdjacencyMatrix);
  864.     If IsIsomorphic Then
  865.         PBottom.Caption := 'Графы изоморфны'
  866.     Else
  867.         PBottom.Caption := 'Графы не изоморфны';
  868. End;
  869.  
  870. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement