Advertisement
ksyshshot

Lab.5.2

Mar 31st, 2023
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.33 KB | Source Code | 0 0
  1. {$R *.dfm}
  2.  
  3. uses UnitAbout, UnitError, UnitExit, UnitDrawTree, UnitNodesAndLeaves,
  4.   UnitInstruction_5_2, UnitTask_5_2;
  5.  
  6. const
  7.     MAX_DATA = 99;
  8.     MIN_DATA = -99;
  9.     SIZE_NODE = 28;
  10.     HALF_SIZE_NODE = 14;
  11.     TEXT_INDENT = 6;
  12.  
  13. type
  14.     TPointer = ^TElement;
  15.     TElement = record
  16.         Data: Integer;
  17.         NextLeft: TPointer;
  18.         NextRight: TPointer;
  19.     end;
  20.  
  21. procedure AddElement(var Curr: TPointer; Data: Integer); stdcall; external 'Lab_5_2_Lib';
  22. procedure DeleteElement(var Curr: TPointer; Data: Integer); stdcall; external 'Lab_5_2_Lib';
  23. function Power(Numb, Pow: Integer): Integer; stdcall; external 'Lab_5_2_Lib';
  24. function SearchElementInTree(Curr: TPointer; Numb: Integer): TPointer; stdcall; external 'Lab_5_2_Lib';
  25. procedure CountInTree(Curr: TPointer; var Nodes: Integer; var Leaves: Integer); stdcall; external 'Lab_5_2_Lib';
  26.  
  27. var
  28.     Head: TPointer;
  29.  
  30. procedure TFormMain.ButtonAddElementClick(Sender: TObject);
  31. var
  32.     IsCorrect: Boolean;
  33.     Error: String;
  34.     Data: Integer;
  35.     Elem: TPointer;
  36. begin
  37.     IsCorrect := true;
  38.     ButtonAddElement.Enabled := false;
  39.     try
  40.          Data := StrToInt(EditChangeTree.Text);
  41.          if (Data < MIN_DATA) or (Data > MAX_DATA) then
  42.          begin
  43.             IsCorrect := false;
  44.             Error := 'Значение элемента находится вне допустимого диапазона. ';
  45.          end;
  46.     except
  47.         IsCorrect := false;
  48.         Error := 'Введено некорректное значение элемента. ';
  49.     end;
  50.     if (IsCorrect) then
  51.     begin
  52.         AddElement(Head, Data);
  53.         EditChangeTree.Text := '';
  54.     end
  55.     else
  56.     begin
  57.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  58.         UnitError.FormError.ShowModal();
  59.         UnitError.FormError.LabelError.Caption := '';
  60.     end;
  61. end;
  62.  
  63. procedure TFormMain.ButtonDeleteElementClick(Sender: TObject);
  64. var
  65.     IsCorrect: Boolean;
  66.     Error: String;
  67.     Data: Integer;
  68.     Elem: TPointer;
  69. begin
  70.     IsCorrect := true;
  71.     ButtonDeleteElement.Enabled := false;
  72.     try
  73.          Data := StrToInt(EditChangeTree.Text);
  74.          if (Data < MIN_DATA) or (Data > MAX_DATA) then
  75.          begin
  76.             IsCorrect := false;
  77.             Error := 'Значение элемента находится вне допустимого диапазона. ';
  78.          end;
  79.     except
  80.         IsCorrect := false;
  81.         Error := 'Введено некорректное значение элемента. ';
  82.     end;
  83.     if (IsCorrect) then
  84.     begin
  85.         if (SearchElementInTree(Head, Data) <> nil) then
  86.             DeleteElement(Head, Data)
  87.         else
  88.         begin
  89.             Error := 'Данный элемент не найден в дереве.';
  90.             UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  91.             UnitError.FormError.ShowModal();
  92.             UnitError.FormError.LabelError.Caption := '';
  93.         end;
  94.         EditChangeTree.Text := '';
  95.     end
  96.     else
  97.     begin
  98.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  99.         UnitError.FormError.ShowModal();
  100.         UnitError.FormError.LabelError.Caption := '';
  101.     end;
  102. end;
  103.  
  104. procedure DrawNode(Curr: TPointer; Level: Integer; IsLeft: Boolean; X, Y: Integer);
  105. var
  106.     m, l, i: Integer; //m - середина, l - ширина, i - отступ
  107.     CurrX, CurrY: Integer;
  108. begin
  109.     if Curr <> nil then
  110.     begin
  111.         l := UnitDrawTree.FormTree.ImageTree.Width;
  112.         m := l div 2;
  113.         i := m div Power(2, Level + 1);
  114.         with (UnitDrawTree.FormTree.ImageTree.Canvas) do
  115.         begin
  116.             CurrX := X - HALF_SIZE_NODE;
  117.             CurrY := Y;
  118.             //Rectangle(CurrX, CurrY, CurrX + SIZE_NODE, CurrY + SIZE_NODE);
  119.             Ellipse(CurrX, CurrY, CurrX + SIZE_NODE, CurrY + SIZE_NODE);
  120.             TextOut(CurrX + TEXT_INDENT, CurrY + TEXT_INDENT, IntToStr(Curr^.Data));
  121.             CurrX := X;
  122.             CurrY := Y + SIZE_NODE;
  123.             MoveTo(CurrX, CurrY);
  124.             if (IsLeft) and (Curr^.NextLeft <> nil) then
  125.             begin
  126.                 LineTo(CurrX - i, CurrY + HALF_SIZE_NODE);
  127.             end;
  128.             if not(IsLeft) and (Curr^.NextLeft <> nil) then
  129.             begin
  130.                 LineTo(CurrX - i, CurrY + HALF_SIZE_NODE);
  131.             end;
  132.             DrawNode(Curr^.NextLeft, (Level + 1), True, CurrX - i, CurrY + HALF_SIZE_NODE);
  133.             MoveTo(CurrX, CurrY);
  134.             if (Curr^.NextRight <> nil) then
  135.             begin
  136.                 LineTo(CurrX + i, CurrY + HALF_SIZE_NODE);
  137.             end;
  138.             DrawNode(Curr^.NextRight, (Level + 1), false, CurrX + i, CurrY + HALF_SIZE_NODE);
  139.             MoveTo(CurrX - 2 * i, CurrY - HALF_SIZE_NODE - SIZE_NODE);
  140.         end;
  141.     end;
  142. end;
  143.  
  144. procedure TFormMain.ButtonDrawTreeClick(Sender: TObject);
  145. var
  146.     Temp: TPointer;
  147. begin
  148.     UnitDrawTree.FormTree.ImageTree.Canvas.Pen.Color := clWhite;
  149.     UnitDrawTree.FormTree.ImageTree.Canvas.Brush.Color := clSkyBlue;
  150.     UnitDrawTree.FormTree.ImageTree.Canvas.Font.Color := clWhite;
  151.     UnitDrawTree.FormTree.ImageTree.Canvas.Font.Name := 'Century Gothic';
  152.     UnitDrawTree.FormTree.ImageTree.Canvas.Font.Style := [fsBold];
  153.     UnitDrawTree.FormTree.ImageTree.Canvas.Rectangle(0, 0, UnitDrawTree.FormTree.ImageTree.Width, UnitDrawTree.FormTree.ImageTree.Height);
  154.     DrawNode(Head, 0, True, (UnitDrawTree.FormTree.ImageTree.Width div 2), HALF_SIZE_NODE);
  155.     UnitDrawTree.FormTree.ShowModal();
  156. end;
  157.  
  158. procedure TFormMain.ButtonFindAnswerClick(Sender: TObject);
  159. var
  160.     Error: String;
  161.     CountNode, CountLeaf: Integer;
  162. begin
  163.     CountNode := 0;
  164.     CountLeaf := 0;
  165.     if Head <> nil then
  166.     begin
  167.         CountInTree(Head, CountNode, CountLeaf);
  168.         UnitNodesAndLeaves.FormNodesAndLeaves.LabelNodes.Caption := IntToStr(CountNode);
  169.         UnitNodesAndLeaves.FormNodesAndLeaves.LabelLeaves.Caption := IntToStr(CountLeaf);
  170.         UnitNodesAndLeaves.FormNodesAndLeaves.ShowModal();
  171.         UnitNodesAndLeaves.FormNodesAndLeaves.LabelNodes.Caption := '';
  172.         UnitNodesAndLeaves.FormNodesAndLeaves.LabelLeaves.Caption := '';
  173.     end
  174.     else
  175.     begin
  176.         Error := 'Дерево пустое. ';
  177.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  178.         UnitError.FormError.ShowModal();
  179.         UnitError.FormError.LabelError.Caption := '';
  180.     end;
  181. end;
  182.  
  183. procedure TFormMain.ButtonTaskClick(Sender: TObject);
  184. begin
  185.     UnitTask_5_2.FormTask.ShowModal();
  186. end;
  187.  
  188. procedure TFormMain.EditChangeTreeChange(Sender: TObject);
  189. begin
  190.     if (EditChangeTree.Text <> '') and (EditChangeTree.Text <> '-') then
  191.     begin
  192.         ButtonAddElement.Enabled := true;
  193.         ButtonDeleteElement.Enabled := true;
  194.     end
  195.     else
  196.     begin
  197.         ButtonAddElement.Enabled := false;
  198.         ButtonDeleteElement.Enabled := false;
  199.     end;
  200. end;
  201.  
  202. procedure TFormMain.EditChangeTreeKeyPress(Sender: TObject; var Key: Char);
  203. begin
  204.     if not(Key in ['0'..'9', #8, '-']) then
  205.         Key := #0;
  206.     if (Length(EditChangeTree.Text) > 0) and (EditChangeTree.Text[1] = '-') then
  207.         EditChangeTree.MaxLength := 3
  208.     else
  209.         EditChangeTree.MaxLength := 2;
  210.     if (Length(EditChangeTree.Text) > 0) and (Key = '-') then
  211.         Key := #0;
  212.     if (Length(EditChangeTree.Text) = 1) and (EditChangeTree.Text[1] = '-') and (Key = '0') then
  213.         Key := #0;
  214.     if (Length(EditChangeTree.Text) = 1) and (EditChangeTree.Text[1] = '0') and not(Length(EditChangeTree.SelText) > 0) and not(Key = #8) then
  215.         Key := #0;
  216. end;
  217.  
  218. procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  219. begin
  220.     If UnitExit.FormExit.ShowModal() = mrOk Then
  221.         CanClose := True
  222.     Else
  223.         CanClose := False;
  224. end;
  225.  
  226.  
  227. procedure TFormMain.FormCreate(Sender: TObject);
  228. begin
  229.     Head := nil;
  230. end;
  231.  
  232. procedure TFormMain.NAboutClick(Sender: TObject);
  233. begin
  234.     UnitAbout.FormAbout.ShowModal();
  235. end;
  236.  
  237. procedure TFormMain.NInstructionClick(Sender: TObject);
  238. begin
  239.     UnitInstruction_5_2.FormInstruction.ShowModal();
  240. end;
  241.  
  242. procedure TFormMain.NOpenFileClick(Sender: TObject);
  243. var
  244.     Path, Error, InputStr: String;
  245.     IsCorrect, IsEmpty: Boolean;
  246.     F: TextFile;
  247.     Element: Integer;
  248. begin
  249.     IsCorrect := true;
  250.     Error := '';
  251.     IsEmpty := true;
  252.     if (OpenDialog.Execute) then
  253.     begin
  254.         Path := OpenDialog.FileName;
  255.         AssignFile(F, Path);
  256.         try
  257.             Reset(F);
  258.             try
  259.                 while not(EoF(F)) and (IsCorrect) do
  260.                 begin
  261.                     Readln(F, InputStr);
  262.                     if not(InputStr.IsEmpty) then
  263.                     begin
  264.                         try
  265.                             Element := StrToInt(InputStr);
  266.                             if (Element < MIN_DATA) or (Element > MAX_DATA) then
  267.                             begin
  268.                                 IsCorrect := false;
  269.                                 Error := 'Найден элемент, не входящий в допустимый диапазон. ';
  270.                             end
  271.                             else
  272.                             begin
  273.                                 AddElement(Head, Element);
  274.                                 IsEmpty := false;
  275.                             end;
  276.                         except
  277.                             IsCorrect := false;
  278.                             Error := 'Найден некорректный элемент списка. ';
  279.                         end;
  280.                     end;
  281.                 end;
  282.                 if (IsCorrect) then
  283.                 begin
  284.                     if (IsEmpty) then
  285.                     begin
  286.                         IsCorrect := false;
  287.                         Error := 'В файле не найдено элементов. ';
  288.                     end;
  289.                 end;
  290.             finally
  291.                 CloseFile(F);
  292.             end;
  293.         except
  294.             IsCorrect := false;
  295.             Error := 'Ошибка при считывании данных из файла. ';
  296.         end;
  297.     end;
  298.     if not(IsCorrect) then
  299.     begin
  300.         Head := nil;
  301.         UnitError.FormError.LabelError.Caption := 'Ошибка! ' + Error;
  302.         UnitError.FormError.ShowModal();
  303.         UnitError.FormError.LabelError.Caption := '';
  304.     end;
  305. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement