Advertisement
Vladislav8653

5.2 delphi

Apr 21st, 2023 (edited)
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 22.03 KB | None | 0 0
  1. unit MainUnit;
  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.Menus, Vcl.StdCtrls;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     HeadLabel: TLabel;
  12.     Create: TButton;
  13.     AddElem: TButton;
  14.     Delete: TButton;
  15.     Show: TButton;
  16.     MainMenu1: TMainMenu;
  17.     PopupMenu1: TPopupMenu;
  18.     N1: TMenuItem;
  19.     N2: TMenuItem;
  20.     N3: TMenuItem;
  21.     N4: TMenuItem;
  22.     N5: TMenuItem;
  23.     OpenDialog1: TOpenDialog;
  24.     SaveDialog1: TSaveDialog;
  25.     procedure N3Click(Sender: TObject);
  26.     procedure N2Click(Sender: TObject);
  27.     procedure AddElemClick(Sender: TObject);
  28.     procedure ShowClick(Sender: TObject);
  29.     procedure CreateClick(Sender: TObject);
  30.     procedure N4Click(Sender: TObject);
  31.     procedure N5Click(Sender: TObject);
  32.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  33.     procedure FormActivate(Sender: TObject);
  34.     procedure DeleteClick(Sender: TObject);
  35.   private
  36.     { Private declarations }
  37.   public
  38.     { Public declarations }
  39.   end;
  40.  
  41. Type
  42.     TArray = Array Of Integer;
  43.     PNode = ^TTree;
  44.     TTree = Record
  45.         Key: Integer;
  46.         Left, Right: PNode;
  47.     End;
  48.  
  49. var
  50.     MainForm: TMainForm;
  51.     Head, NodeForDeleting: PNode;
  52.     Path, SaveResult, StrWithNum : String;
  53.     IsFileOpen, WasTreeInitialized, ShowNumbers : Boolean;
  54.     Keys : TArray;
  55.  
  56.  
  57. implementation
  58.  
  59. uses Add, Show;
  60.  
  61. {$R *.dfm}
  62.  
  63. procedure TMainForm.AddElemClick(Sender: TObject);
  64. begin
  65.     AddNode.ShowModal;
  66. end;
  67.  
  68. procedure DeleteTree(var Head: PNode);
  69. begin
  70.     if Head <> nil then
  71.     begin
  72.         DeleteTree(Head.Left);
  73.         DeleteTree(Head.Right);
  74.         Dispose(Head);
  75.         Head := nil;
  76.     end;
  77.     SetLength(Keys, 0);
  78. end;
  79.  
  80. procedure InitializeTree();
  81. Begin
  82.     WasTreeInitialized := True;
  83.     Head := nil;
  84.     SetLength(Keys, 0);
  85. End;
  86.  
  87. procedure TMainForm.CreateClick(Sender: TObject);
  88. begin
  89.     DeleteTree(Head);
  90.     InitializeTree();
  91.     Application.MessageBox('Пустое дерево создано!', 'Информация', 0);
  92. end;
  93.  
  94.  
  95. procedure DeleteNode(var Root: PNode; Key: Integer);
  96. var
  97.     Current, Parent, Temp: PNode;
  98.     IsLeftChild: Boolean;
  99. begin
  100.     Current := Root;
  101.     Parent := nil;
  102.     IsLeftChild := False;
  103.  
  104.  
  105.     while (Current <> nil) and (Current^.Key <> Key) do
  106.     begin
  107.         Parent := Current;
  108.         if Key < Current^.Key then
  109.         begin
  110.             Current := Current^.Left;
  111.             IsLeftChild := True;
  112.         end
  113.         else
  114.         begin
  115.             Current := Current^.Right;
  116.             IsLeftChild := False;
  117.         end;
  118.     end;
  119.  
  120.  
  121.     if (Current^.Left = nil) and (Current^.Right = nil) then
  122.     begin
  123.         if Current = Root then
  124.           Root := nil
  125.         else if IsLeftChild then
  126.           Parent^.Left := nil
  127.         else
  128.           Parent^.Right := nil;
  129.         Dispose(Current);
  130.         Application.MessageBox('Элемент удален!', 'Информация', 0);
  131.     end
  132.  
  133.  
  134.     else if Current^.Right = nil then
  135.     begin
  136.         if Current = Root then
  137.           Root := Current^.Left
  138.         else if IsLeftChild then
  139.           Parent^.Left := Current^.Left
  140.         else
  141.           Parent^.Right := Current^.Left;
  142.         Dispose(Current);
  143.         Application.MessageBox('Элемент удален!', 'Информация', 0);
  144.     end
  145.     else if Current^.Left = nil then
  146.     begin
  147.         if Current = Root then
  148.           Root := Current^.Right
  149.         else if IsLeftChild then
  150.           Parent^.Left := Current^.Right
  151.         else
  152.           Parent^.Right := Current^.Right;
  153.         Dispose(Current);
  154.         Application.MessageBox('Элемент удален!', 'Информация', 0);
  155.     end
  156.  
  157.  
  158.     else
  159.     begin
  160.         Temp := Current^.Right;
  161.         Parent := Current;
  162.         while Temp^.Left <> nil do
  163.         begin
  164.             Parent := Temp;
  165.             Temp := Temp^.Left;
  166.         end;
  167.         Current^.Key := Temp^.Key;
  168.         if Parent^.Left = Temp then
  169.           Parent^.Left := Temp^.Right
  170.         else
  171.           Parent^.Right := Temp^.Right;
  172.         Dispose(Temp);
  173.         Application.MessageBox('Элемент удален!', 'Информация', 0);
  174.     end;
  175. end;
  176.  
  177. function CheckUserChoise (Num : Integer) : Boolean;
  178. Var
  179.     IsInvalid : Boolean;
  180.     I : Integer;
  181. Begin
  182.     IsInvalid := True;
  183.     For I := Low(Keys) To High(Keys) Do
  184.         If Num = Keys[I] then
  185.         begin
  186.             IsInvalid := False;
  187.             Break;
  188.         end;
  189.     CheckUserChoise := IsInvalid;
  190. End;
  191.  
  192. procedure TMainForm.DeleteClick(Sender: TObject);
  193. var
  194.     NumForDeleting : Integer;
  195.     IsCorrect: Boolean;
  196. begin
  197.     If (WasTreeInitialized) and (Head <> nil) then
  198.     Begin
  199.         IsCorrect := True;
  200.         ShowNumbers := True;
  201.         ShowTree.ShowModal;
  202.         with AddNode Do
  203.         Begin
  204.             Caption := 'Удаление элемента';
  205.             Meeting.Caption := 'Введите элемент:';
  206.             N1.Enabled := False;
  207.             ShowModal;
  208.         End;
  209.         try
  210.             NumForDeleting := StrToInt(StrWithNum);
  211.         except
  212.             AddNode.Data.Text := '';
  213.             IsCorrect := False;
  214.             Application.MessageBox('В этом окне следует вводить удаляемый элемент.', 'Ошибка', MB_ICONSTOP);
  215.         end;
  216.         If CheckUserChoise(NumForDeleting) and (IsCorrect) then
  217.         begin
  218.             AddNode.Data.Text := '';
  219.             IsCorrect := False;
  220.             Application.MessageBox('В этом окне следует вводить существующий элемент.', 'Ошибка', MB_ICONSTOP);
  221.         end;
  222.         If IsCorrect then
  223.         begin
  224.             DeleteNode(Head, NumForDeleting);
  225.         end;
  226.     End
  227.     else if Not(WasTreeInitialized) then
  228.     begin
  229.         Application.MessageBox('Дерева не существует. Создайте его!', 'Информация', 0);
  230.     end
  231.     else
  232.     begin
  233.         Application.MessageBox('Дерево пустое. Добавьте в него элементы, чтобы было что удалять.', 'Информация', 0);
  234.     end;
  235. end;
  236.  
  237. procedure TMainForm.FormActivate(Sender: TObject);
  238. begin
  239.     WasTreeInitialized := False;
  240.     SetLength(Keys, 0);
  241. end;
  242.  
  243. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  244. begin
  245.     CanClose := Application.MessageBox('Вы действительно хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION) = ID_YES;
  246. end;
  247.  
  248. procedure TMainForm.N2Click(Sender: TObject);
  249. Const
  250.     INFO = 'Дерево — одна из наиболее широко распространённых структур данных в информатике, эмулирующая древовидную структуру в виде набора связанных узлов. Является связным графом, не содержащим циклы.';
  251.     INFO2 = #13#10 + #13#10 + 'Текстовый файл должен представлять из себя 1 строчку с числами, введенными через пробел. Информация из файла будет дополнять существующую.';
  252.  
  253. begin
  254.     Application.MessageBox(INFO + INFO2, 'Инструкция', 0);
  255. end;
  256.  
  257. procedure TMainForm.N3Click(Sender: TObject);
  258. begin
  259.     Application.MessageBox('Арефин Владислав гр.251004', 'Разработ4ик', 0);
  260. end;
  261.  
  262. procedure TMainForm.ShowClick(Sender: TObject);
  263. begin
  264.     If (WasTreeInitialized) and (Head <> nil) then
  265.     Begin
  266.         ShowTree.ShowModal;
  267.     End
  268.     else if Not(WasTreeInitialized) then
  269.         begin
  270.             Application.MessageBox('Дерева не существует. Создайте его!', 'Информация', 0);
  271.         end
  272.         else
  273.         begin
  274.             Application.MessageBox('Дерево пустое. Добавьте в него элементы, чтобы оно отобразилось.', 'Информация', 0);
  275.         end;
  276. end;
  277.  
  278.  
  279. Function Open (): String;
  280. Begin
  281.     With MainForm Do
  282.     Begin
  283.         If OpenDialog1.Execute Then
  284.         Begin
  285.             Path := OpenDialog1.FileName;
  286.             IsFileOpen := True;
  287.         End
  288.         Else
  289.             IsFileOpen := False;
  290.     End;
  291.     Open := Path;
  292. End;
  293.  
  294. Function Save (): String;
  295. Begin
  296.     With MainForm Do
  297.     Begin
  298.         If SaveDialog1.Execute Then
  299.         Begin
  300.             Path := SaveDialog1.FileName;
  301.             IsFileOpen := True;
  302.         End
  303.         Else
  304.             IsFileOpen := False;
  305.     End;
  306.     Save := Path;
  307. End;
  308.  
  309. Function GetString(Var FileOutput: TextFile): String;
  310. Stdcall;
  311. External 'My1stLib.dll';
  312.  
  313. type
  314.     TStr = Array of String;
  315.  
  316. function SeparateString (Str : String) : TStr;
  317. Stdcall;
  318. External 'My1stLib.dll';
  319.  
  320.  
  321.  
  322. Function CreateNewNode(Data: Integer; Node: PNode): PNode;
  323. Begin
  324.     New(Result);
  325.     Result.Key := Data;
  326.     Result.Right := Nil;
  327.     Result.Left := Nil;
  328. End;
  329.  
  330.  
  331. Procedure InsertNode(Node: PNode; Data: Integer);
  332. Begin
  333.     If(Data < Node.Key) Then
  334.     Begin
  335.         If(Node.Left <> Nil) Then
  336.             InsertNode(Node.Left, Data)
  337.         Else
  338.             Node.Left := CreateNewNode(Data, Node);
  339.     End
  340.     Else
  341.     Begin
  342.         If(Node.Right <> Nil) Then
  343.             InsertNode(Node.Right, Data)
  344.         Else
  345.             Node.Right := CreateNewNode(Data, Node);
  346.     End;
  347. End;
  348.  
  349. Procedure AddNodeInTree(Data: Integer);
  350. Var
  351.     Node: PNode;
  352. Begin
  353.     SetLength(Keys, (Length(Keys) + 1));
  354.     Keys[High(Keys)] := Data;
  355.     If(Head <> Nil) Then
  356.         InsertNode(Head, Data)
  357.     Else
  358.         Head := CreateNewNode(Data, Nil);
  359. End;
  360.  
  361. function CheckRepetitions (Num : Integer) : Boolean;
  362. Var
  363.     IsCorrect : Boolean;
  364.     I : Integer;
  365. Begin
  366.     IsCorrect := True;
  367.     For I := Low(Keys) To High(Keys) Do
  368.         If Num = Keys[I] then
  369.         begin
  370.             IsCorrect := False;
  371.             Break;
  372.         end;
  373.     CheckRepetitions := IsCorrect;
  374. End;
  375.  
  376. function CheckFile (Arr : TStr) : Boolean;
  377. Var
  378.     IsCorrect : Boolean;
  379.     I, J : Integer;
  380. Begin
  381.     IsCorrect := True;
  382.     For I := Low(Keys) To High(Keys) Do
  383.         For J := I + 1 To High(Keys) Do
  384.             If Arr[I] = Arr[J] then
  385.             begin
  386.                 IsCorrect := False;
  387.                 Break
  388.             end;
  389.     I := 0;
  390.     While ((I <= High(Keys)) and (IsCorrect)) Do
  391.     begin
  392.         IsCorrect := CheckRepetitions(StrToInt(Arr[I]));
  393.     end;
  394.     CheckFile := IsCorrect;
  395. End;
  396.  
  397.  
  398. procedure TMainForm.N4Click(Sender: TObject);
  399. Var
  400.     FileInput : TextFile;
  401.     StrWithNodes : String;
  402.     Arr : TStr;
  403.     I : Integer;
  404.     NewNode, Node: PNode;
  405.     WillContinue : Boolean;
  406. begin
  407.     IsFileOpen := False;
  408.     Path := Open();
  409.     AssignFile(FileInput, Path);
  410.     If ExtractFileExt(Path) <> '.txt' then
  411.         raise Exception.Create('Файл должен быть текстовым. Проверьте исходные данные.');
  412.     Reset(FileInput);
  413.     If (IsFileOpen) then
  414.         StrWithNodes := GetString(FileInput);
  415.     CloseFile(FileInput);
  416.     If (StrWithNodes <> '') then
  417.     Begin
  418.         Arr := SeparateString(StrWithNodes);
  419.         WillContinue := True;
  420.         For I := 0 To High(Arr) Do
  421.             If (Arr[I].Length > 3) then
  422.             begin
  423.                 WillContinue := False;
  424.                 raise Exception.Create('Длина одного элемента не должна превышать 3 символов. Проверьте исходные данные.');
  425.             end;
  426.         If WillContinue then
  427.         Begin
  428.             If CheckFile(Arr) then
  429.             Begin
  430.                 For I := Low(Arr) to High(Arr) Do
  431.                 begin
  432.                     If Arr[I] <> '' then
  433.                         AddNodeInTree(StrToInt(Arr[I]));
  434.                 end;
  435.                 WasTreeInitialized := True;
  436.                 Application.MessageBox('Готово!', 'Информация', 0);
  437.             End
  438.             else
  439.             begin
  440.                 Application.MessageBox('В файле есть повторяющиеся элементы или в файле есть уже существующие элементы.', 'Ошибка', MB_ICONSTOP);
  441.             end;
  442.         End;
  443.     End;
  444. end;
  445.  
  446. procedure CreateStringToSave(var Head: PNode);
  447. begin
  448.     if Head <> nil then
  449.     begin
  450.         CreateStringToSave(Head.Left);
  451.         CreateStringToSave(Head.Right);
  452.         SaveResult := SaveResult + IntToStr(Head.Key) + ' ';
  453.     end;
  454. end;
  455.  
  456.  
  457. procedure TMainForm.N5Click(Sender: TObject);
  458. Var
  459.     FileOutput: TextFile;
  460.     IsCorrect : Boolean;
  461.     CurrNode : PNode;
  462. begin
  463.     If Head = nil then
  464.     begin
  465.         Application.MessageBox('Дерево пустое.', 'Информация', 0);
  466.         Exit
  467.     end;
  468.     SaveResult := '';
  469.     IsCorrect := True;
  470.     Path := Save();
  471.     If (IsFileOpen) Then
  472.     Begin
  473.         CreateStringToSave(Head);
  474.         try
  475.             AssignFile(FileOutput, Path);
  476.             Rewrite(FileOutput);
  477.             Write(FileOutput, SaveResult);
  478.             CloseFile(FileOutput);
  479.         except
  480.             IsCorrect := False;
  481.             Application.MessageBox('Запись в файл не удалась.', 'Ошибка', MB_ICONSTOP);
  482.         end;
  483.  
  484.         If IsCorrect then
  485.         Begin
  486.             Application.MessageBox('Запись файла выполнена успешно.', 'Результат', 0);
  487.         End;
  488.     End;
  489. end;
  490.  
  491. end.
  492.  
  493.  
  494.  
  495. ==============================================Add========================================================
  496. unit Add;
  497.  
  498. interface
  499.  
  500. uses
  501.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  502.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls;
  503.  
  504. type
  505.   TAddNode = class(TForm)
  506.     Data: TEdit;
  507.     Meeting: TLabel;
  508.     MainMenu1: TMainMenu;
  509.     N1: TMenuItem;
  510.     procedure DataKeyPress(Sender: TObject; var Key: Char);
  511.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  512.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  513.     procedure N1Click(Sender: TObject);
  514.     procedure FormDeactivate(Sender: TObject);
  515.   private
  516.     { Private declarations }
  517.   public
  518.     { Public declarations }
  519.   end;
  520.  
  521. var
  522.   AddNode: TAddNode;
  523.  
  524. implementation
  525.  
  526. {$R *.dfm}
  527. Uses MainUnit;
  528.  
  529.  
  530. Function CreateNewNode(Data: Integer; Node: PNode): PNode;
  531. Begin
  532.     New(Result);
  533.     Result.Key := Data;
  534.     Result.Right := Nil;
  535.     Result.Left := Nil;
  536. End;
  537.  
  538.  
  539. Procedure InsertNode(Node: PNode; Data: Integer);
  540. Begin
  541.     If(Data < Node.Key) Then
  542.     Begin
  543.         If(Node.Left <> Nil) Then
  544.             InsertNode(Node.Left, Data)
  545.         Else
  546.             Node.Left := CreateNewNode(Data, Node);
  547.     End
  548.     Else
  549.     Begin
  550.         If(Node.Right <> Nil) Then
  551.             InsertNode(Node.Right, Data)
  552.         Else
  553.             Node.Right := CreateNewNode(Data, Node);
  554.     End;
  555. End;
  556.  
  557. Procedure AddNodeInTree(Data: Integer);
  558. Var
  559.     Node: PNode;
  560. Begin
  561.     SetLength(Keys, (Length(Keys) + 1));
  562.     Keys[High(Keys)] := Data;
  563.     If(Head <> Nil) Then
  564.         InsertNode(Head, Data)
  565.     Else
  566.         Head := CreateNewNode(Data, Nil);
  567. End;
  568.  
  569. function CheckContent (Str : String) : Boolean;
  570. var
  571.     IsCorrect : Boolean;
  572.     NumberForTest : Integer;
  573. begin
  574.     IsCorrect := True;
  575.     Try
  576.         NumberForTest := StrToInt(Str);
  577.     Except
  578.         IsCorrect := False;
  579.  
  580.     End;
  581.     CheckContent := IsCorrect;
  582. end;
  583.  
  584.  
  585. function CheckRepetitions (Num : Integer) : Boolean;
  586. Var
  587.     IsCorrect : Boolean;
  588.     I : Integer;
  589. Begin
  590.     IsCorrect := True;
  591.     For I := Low(Keys) To High(Keys) Do
  592.         If Num = Keys[I] then
  593.         begin
  594.             IsCorrect := False;
  595.             Break;
  596.         end;
  597.     CheckRepetitions := IsCorrect;
  598. End;
  599.  
  600. procedure TAddNode.DataKeyPress(Sender: TObject; var Key: Char);
  601. var
  602.     IsOverFlow : Boolean;
  603. begin
  604.     If (Key = #13) and (Data.Text <> '') and (N1.Enabled) then
  605.     begin
  606.         If (CheckContent(Data.Text)) then
  607.         Begin
  608.             If CheckRepetitions(StrToInt(Data.Text)) then
  609.             begin
  610.                 AddNodeInTree(StrToInt(Data.Text));
  611.                 Application.MessageBox('Элемент добавлен!', 'Поздравления', 0);
  612.                 WasTreeInitialized := True;
  613.             end
  614.             else
  615.             begin
  616.                 Application.MessageBox('К сожалению, нельзя добавлять повторяющиеся элементы. Повторите ввод.', 'Ошибка', MB_ICONSTOP);
  617.             end;
  618.         End
  619.         else
  620.         begin
  621.             Application.MessageBox('Разрешено вводить только целочисленные значения.', 'Ошибка', MB_ICONSTOP);
  622.         end;
  623.         Data.Text := '';
  624.     end;
  625.     If (Key = #13) and (Data.Text <> '') and Not(N1.Enabled) then
  626.     begin
  627.         StrWithNum := Data.Text;
  628.         Data.Text := '';
  629.         AddNode.Close;
  630.     end
  631. end;
  632.  
  633. procedure TAddNode.FormClose(Sender: TObject; var Action: TCloseAction);
  634. begin
  635.     AddNode.TabStop := True;
  636. end;
  637.  
  638. procedure TAddNode.FormDeactivate(Sender: TObject);
  639. begin
  640.     AddNode.Caption := 'Добавить';
  641.     AddNode.Meeting.Caption := 'Введите элемент:';
  642.     AddNode.N1.Enabled := True;
  643. end;
  644.  
  645. procedure TAddNode.FormKeyPress(Sender: TObject; var Key: Char);
  646. begin
  647.     Data.TabStop := True;
  648. end;
  649.  
  650. procedure TAddNode.N1Click(Sender: TObject);
  651. begin
  652.     Application.MessageBox('Узлами дерева являются целочисленные значения в диапазоне [-9..99]', 'Информация', 0);
  653. end;
  654.  
  655. end.
  656.  
  657. ===============================================Show=============================================================
  658. unit Show;
  659.  
  660. interface
  661.  
  662. uses
  663.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  664.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ExtCtrls;
  665.  
  666. type
  667.   TShowTree = class(TForm)
  668.     TreeImage: TImage;
  669.     procedure FormActivate(Sender: TObject);
  670.     procedure FormDeactivate(Sender: TObject);
  671.   private
  672.     { Private declarations }
  673.   public
  674.     { Public declarations }
  675.   end;
  676.  
  677. var
  678.   ShowTree: TShowTree;
  679.  
  680. implementation
  681.  
  682. {$R *.dfm}
  683.  
  684. uses MainUnit;
  685.  
  686.  
  687. procedure DrawBranch(X1, Y1, X2, Y2: Integer);
  688. Begin
  689.    ShowTree.TreeImage.Canvas.MoveTo(X1, Y1);
  690.    ShowTree.TreeImage.Canvas.LineTo(X2, Y2);
  691. End;
  692.  
  693. Procedure DrawTree(Head: PNode; X1, Y1, X2, Y2, Shift: Integer);
  694. Var
  695.     Tree: PNode;
  696. Const
  697.     OffSetTextByX = 8;
  698.     OffSetTextByY = 10;
  699. Begin
  700.     Tree := Head;
  701.     With(ShowTree.TreeImage.Canvas) Do
  702.     Begin
  703.         Pen.Width := 3;
  704.         Font.Size := 12;
  705.         Ellipse(X1, Y1, X2, Y2);
  706.         TextOut(X1 + OffSetTextByX, Y1 + OffSetTextByY, IntToStr((Tree^.Key)));
  707.         {If ShowNumbers then
  708.         Begin
  709.             Brush.Style := bsClear;
  710.             Font.Color := clRed;
  711.             Pen.Width := 1;
  712.             Font.Size := 8;
  713.             TextOut(X1 - 25, Y1 + OffSetTextByY, '№'+ IntToStr(Tree^.SequenceNumber));
  714.  
  715.             Brush.Style := bsSolid;
  716.             Font.Color := clBlack;
  717.             Pen.Width := 3;
  718.             Font.Size := 12
  719.         End;   }
  720.     End;
  721.     If(Tree <> Nil) Then
  722.     Begin
  723.         If(Tree.Left <> Nil) Then
  724.         Begin
  725.             DrawBranch(X1, Y1 + 24, X1 - Shift, Y2 + 24);
  726.             DrawTree(Tree.Left, X1 - Shift, Y1 + 48, X2 - Shift, Y2 + 48, (Shift Div 2));
  727.         End;
  728.         If(Tree.Right <> Nil) Then
  729.         Begin
  730.             DrawBranch(X2, Y1 + 24, X2 + Shift, Y2 + 24);
  731.             DrawTree(Tree.Right, X1 + Shift, Y2, X2 + Shift, Y2 + 48, (Shift Div 2));
  732.         End;
  733.     End;
  734. End;
  735.  
  736.  
  737. procedure TShowTree.FormActivate(Sender: TObject);
  738. const
  739.     Shift = 120;
  740.     INFO1 = 'Выберите вершину, которую хотите удалить.';
  741.     INFO2 = 'Далее закройте окно и введите число с этой вершины';
  742.     INFO3 = 'в соответствующее поле.';
  743. begin
  744.     TreeImage.Picture := nil;
  745.     DrawTree(Head, ShowTree.TreeImage.Width Div 2, 8, ShowTree.TreeImage.Width Div 2 + 48, 56, Shift);
  746.     If ShowNumbers then
  747.     begin
  748.         with  ShowTree.TreeImage.Canvas Do
  749.         begin
  750.             Pen.Width := 2;
  751.             Font.Size := 8;
  752.             TextOut(0, 0, INFO1);
  753.             TextOut(0, 20, INFO2);
  754.             TextOut(0, 40, INFO3);
  755.         end;
  756.     end;
  757. end;
  758.  
  759.  
  760. procedure TShowTree.FormDeactivate(Sender: TObject);
  761. begin
  762.     ShowNumbers := False;
  763. end;
  764.  
  765. end.
  766.  
  767.  
  768. ===============================================Library======================================================
  769. library My1stLib;
  770. uses
  771.   System.SysUtils,
  772.   System.Classes;
  773.  
  774. {$R *.res}
  775.  
  776. Function GetString(Var FileOutput: TextFile): String; stdcall;
  777. Var
  778.     IsRight : Boolean;
  779.     Str : String;
  780. Begin
  781.     IsRight := True;
  782.     Try
  783.         Readln(FileOutput, Str);
  784.         Str := Trim (Str);
  785.     Except
  786.         IsRight := False;
  787.     End;
  788.     If IsRight then
  789.         GetString := Str;
  790. End;
  791.  
  792. type
  793.     TStr = Array of String;
  794.  
  795. function SeparateString (Str : String) : TStr; stdcall;
  796. Var
  797.     StrArr : TStr;
  798.     I, K : Integer;
  799.     Flag : Boolean;
  800. Begin
  801.     K := 0;
  802.     SetLength(StrArr, (Str.Length div 2) + 1);
  803.     For I := 0 To Str.Length div 2 do
  804.         StrArr[i] := '';
  805.     I := 1;
  806.     While I <= Str.Length Do
  807.     begin
  808.         Flag := True;
  809.         While (Str[I] <> ' ') and (I <= Str.Length) Do
  810.         Begin
  811.             StrArr[K] := StrArr[K] + Str[I];
  812.             Inc(I);
  813.             Flag := False;
  814.         End;
  815.         If Not(Flag) then
  816.             Inc(K);
  817.         If Flag then
  818.             Inc(I);
  819.     end;
  820.     I := 1;
  821.     K := 0;
  822.     While Str[I] <> '' Do
  823.     Begin
  824.         If Str[I] = ' ' then
  825.             Inc(K);
  826.         Inc(I);
  827.     End;
  828.     SetLength(StrArr, K + 2);
  829.     Result := StrArr;
  830. End;
  831.  
  832. Exports GetString, SeparateString;
  833.  
  834. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement