Advertisement
gguuppyy

LAB52

Apr 13th, 2024
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.70 KB | Source Code | 0 0
  1. Unit MainUnit;
  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.ComCtrls,
  17.     Vcl.ExtCtrls,
  18.     Vcl.Grids,
  19.     Vcl.Menus,
  20.     TreeUnit,
  21.     BackUnit,
  22.     DevInfUnit,
  23.     ManualUnit,
  24.     Vcl.ExtDlgs;
  25.  
  26. Type
  27.     TMainForm = Class(TForm)
  28.         AddButton: TButton;
  29.         NewNodeEdit: TEdit;
  30.         MainPaintBox: TPaintBox;
  31.         ScrollBox: TScrollBox;
  32.         Timer: TTimer;
  33.         FreeButton: TButton;
  34.         StringGrid1: TStringGrid;
  35.         MainMenu: TMainMenu;
  36.         ManualButtonMenu: TMenuItem;
  37.         DeveloperButtonMenu: TMenuItem;
  38.         PopupMenu: TPopupMenu;
  39.         TaskLabel: TLabel;
  40.         ResButton: TButton;
  41.         ResMemo: TMemo;
  42.         SaveDialog1: TSaveDialog;
  43.         FileButton: TMenuItem;
  44.         SaveButton: TMenuItem;
  45.         CloseButton: TMenuItem;
  46.         OpenButton: TMenuItem;
  47.         OpenTextFileDialog1: TOpenTextFileDialog;
  48.         Procedure AddButtonClick(Sender: TObject);
  49.         Procedure FreeButtonClick(Sender: TObject);
  50.         Procedure FormCreate(Sender: TObject);
  51.         Procedure MainPaintBoxPaint(Sender: TObject);
  52.         Procedure NewNodeEditKeyPress(Sender: TObject; Var Key: Char);
  53.         Procedure NewNodeEditChange(Sender: TObject);
  54.         Procedure NewNodeEditKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  55.         Procedure AddElemToGrid(Grid: TStringGrid; Elem: Integer);
  56.         Procedure ErrMessage();
  57.         Procedure DeveloperButtonMenuClick(Sender: TObject);
  58.         Procedure ManualButtonMenuClick(Sender: TObject);
  59.         Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  60.         Procedure ResButtonClick(Sender: TObject);
  61.         Procedure ExitButtonClick(Sender: TObject);
  62.         Procedure SaveButtonClick(Sender: TObject);
  63.         Procedure FileButtonClick(Sender: TObject);
  64.         Procedure OpenButtonClick(Sender: TObject);
  65.         Procedure LoadTreeFromFile(Tree: TTree; Const FileName: String; Sender: TObject);
  66.         Procedure GetPath(Var Path: String);
  67.         Procedure CloseButtonClick(Sender: TObject);
  68.     Private
  69.         { Private declarations }
  70.     Public
  71.         { Public declarations }
  72.     End;
  73.  
  74. Function CreateTree(): TTree; StdCall; External 'TreeLib.dll';
  75. Function Add(Var Node: TNodePointer; Elem: Integer): Boolean; StdCall; External 'TreeLib.dll';
  76. Function GetHigh(Node: TNodePointer): Integer; StdCall; External 'TreeLib.dll';
  77. Procedure DeleteTree(Var Node: TNodePointer); StdCall; External 'TreeLib.dll';
  78. Procedure CheckHeight(Node: TNodePointer; Var Fin: String); StdCall; External 'TreeLib.dll';
  79. Function GetNodeWithDifferentHeight(Node: TNodePointer): String; StdCall; External 'TreeLib.dll';
  80.  
  81. Var
  82.     MainForm: TMainForm;
  83.     Tree: TTree;
  84.     ChoosedNum: Integer;
  85.     Node: TNodePointer;
  86.     IsSaved: Boolean = False;
  87.  
  88. Implementation
  89.  
  90. {$R *.dfm}
  91.  
  92. Procedure ClearGrid(Grid: TStringGrid);
  93. Var
  94.     J, I: Integer;
  95. Begin
  96.     Grid.Visible := False;
  97.     For I := 0 To Grid.ColCount - 1 Do
  98.         For J := 0 To Grid.RowCount - 1 Do
  99.             Grid.Cells[I, J] := '';
  100.     Grid.ColCount := 1;
  101. End;
  102.  
  103. Procedure TMainForm.AddButtonClick(Sender: TObject);
  104. Var
  105.     NewNodeData, MaxCountOfNode, TreeHigh: Integer;
  106.     IsAdded: Boolean;
  107. Begin
  108.     NewNodeData := StrToInt(NewNodeEdit.Text);
  109.     NewNodeEdit.Text := '';
  110.     If Add(Tree^.Next, NewNodeData) Then
  111.     Begin
  112.         AddElemToGrid(StringGrid1, NewNodeData);
  113.         ChoosedNum := NewNodeData;
  114.     End
  115.     Else
  116.         ErrMessage();
  117.  
  118.     If Tree^.Next <> Nil Then
  119.     Begin
  120.         FreeButton.Enabled := True;
  121.         ResButton.Enabled := True;
  122.     End;
  123.  
  124.     TreeHigh := GetHigh(Tree^.Next);
  125.     MaxCountOfNode := Pow(2, TreeHigh - 1);
  126.  
  127.     MainPaintBox.Width := NODE_SIZE * MaxCountOfNode;
  128.     MainPaintBox.Height := LAYER_SIZE * TreeHigh;
  129.  
  130.     MainPaintBox.Canvas.MoveTo(MainPaintBox.Width Div 2, NODE_SIZE Div 2);
  131.     PrintTree(Tree^.Next, MainPaintBox.Canvas, 0, MainPaintBox.Width, 0, ChoosedNum);
  132. End;
  133.  
  134. Procedure TMainForm.AddElemToGrid(Grid: TStringGrid; Elem: Integer);
  135. Begin
  136.     With Grid Do
  137.     Begin
  138.         If Visible Then
  139.         Begin
  140.             ColCount := ColCount + 1;
  141.         End
  142.         Else
  143.             Visible := True;
  144.         Cells[ColCount - 1, 0] := IntToStr(ColCount) + '.';
  145.         Cells[ColCount - 1, 1] := IntToStr(Elem);
  146.     End;
  147. End;
  148.  
  149. Procedure TMainForm.CloseButtonClick(Sender: TObject);
  150. Begin
  151.     Close();
  152. End;
  153.  
  154. Procedure TMainForm.GetPath(Var Path: String);
  155. Begin
  156.     If OpenTextFileDialog1.Execute Then
  157.     Begin
  158.         Path := OpenTextFileDialog1.FileName;
  159.     End
  160.     Else
  161.     Begin
  162.         ShowMessage('Открытие файла отменено.');
  163.     End;
  164. End;
  165.  
  166. Procedure TMainForm.LoadTreeFromFile(Tree: TTree; Const FileName: String; Sender: TObject);
  167. Var
  168.     FileStream: TStreamReader;
  169.     Line: String;
  170.     NodeData, MaxCountOfNode, TreeHigh: Integer;
  171.     NodesAdded: Boolean;
  172. Begin
  173.     FileStream := TStreamReader.Create(FileName);
  174.     Try
  175.         NodesAdded := False;
  176.  
  177.         While Not FileStream.EndOfStream Do
  178.         Begin
  179.             Line := FileStream.ReadLine;
  180.             If TryStrToInt(Line, NodeData) Then
  181.             Begin
  182.                 If Add(Tree^.Next, NodeData) Then
  183.                 Begin
  184.                     AddElemToGrid(TStringGrid(Sender), NodeData);
  185.                     NodesAdded := True;
  186.                 End;
  187.             End;
  188.         End;
  189.     Finally
  190.         FileStream.Free;
  191.     End;
  192.  
  193.     If NodesAdded Then
  194.     Begin
  195.         FreeButton.Enabled := True;
  196.         ResButton.Enabled := True;
  197.     End;
  198.  
  199.     TreeHigh := GetHigh(Tree^.Next);
  200.     MaxCountOfNode := Pow(2, TreeHigh - 1);
  201.  
  202.     MainPaintBox.Width := NODE_SIZE * MaxCountOfNode;
  203.     MainPaintBox.Height := LAYER_SIZE * TreeHigh;
  204.  
  205.     MainPaintBox.Canvas.MoveTo(MainPaintBox.Width Div 2, NODE_SIZE Div 2);
  206.     PrintTree(Tree^.Next, MainPaintBox.Canvas, 0, MainPaintBox.Width, 0, ChoosedNum);
  207. End;
  208.  
  209. Procedure TMainForm.DeveloperButtonMenuClick(Sender: TObject);
  210. Var
  211.     DeveloperForm: TDeveloperForm;
  212. Begin
  213.     DeveloperForm := TDeveloperForm.Create(Self);
  214.     DeveloperForm.ShowModal;
  215.     DeveloperForm.Free;
  216. End;
  217.  
  218. Procedure TMainForm.ErrMessage;
  219. Begin
  220.     Application.MessageBox('Такой элемент уже существует', 'Ошибочка', MB_OK + MB_ICONASTERISK + MB_DEFBUTTON2)
  221. End;
  222.  
  223. Procedure TMainForm.FormCreate(Sender: TObject);
  224. Begin
  225.     Tree := CreateTree();
  226.     TaskLabel.Caption := ('Вывести номера вершин, для которых ' + #13#10 + 'высота левого поддерева не равна высоте правого поддерева.');
  227. End;
  228.  
  229. Procedure TMainForm.FreeButtonClick(Sender: TObject);
  230. Begin
  231.     DeleteTree(Tree^.Next);
  232.     FreeButton.Enabled := False;
  233.     ResButton.Enabled := False;
  234.     ResMemo.Lines.Clear;
  235.     ClearGrid(StringGrid1);
  236.     MainPaintBox.OnPaint(Sender);
  237.  
  238. End;
  239.  
  240. Procedure TMainForm.MainPaintBoxPaint(Sender: TObject);
  241. Begin
  242.     With MainPaintBox.Canvas Do
  243.     Begin
  244.         Pen.Width := 3;
  245.         Brush.Color := ClMenu;
  246.         FillRect(MainPaintBox.ClientRect);
  247.     End;
  248.     MainPaintBox.Canvas.MoveTo(MainPaintBox.Width Div 2, NODE_SIZE Div 2);
  249.     PrintTree(Tree^.Next, MainPaintBox.Canvas, 0, MainPaintBox.Width, 0, ChoosedNum);
  250. End;
  251.  
  252. Procedure TMainForm.ManualButtonMenuClick(Sender: TObject);
  253. Var
  254.     ManualForm: TManualForm;
  255. Begin
  256.     ManualForm := TManualForm.Create(Self);
  257.     ManualForm.ShowModal;
  258.     ManualForm.Free;
  259. End;
  260.  
  261. Procedure TMainForm.ExitButtonClick(Sender: TObject);
  262. Begin
  263.     Close();
  264. End;
  265.  
  266. Procedure TMainForm.OpenButtonClick(Sender: TObject);
  267. Var
  268.     FileName: String;
  269. Begin
  270.     GetPath(FileName);
  271.  
  272.     If FileName <> '' Then
  273.     Begin
  274.         If Tree^.Next <> Nil Then
  275.             DeleteTree(Tree^.Next);
  276.  
  277.         ClearGrid(StringGrid1);
  278.  
  279.         LoadTreeFromFile(Tree, FileName, StringGrid1);
  280.     End
  281.     Else
  282.         ShowMessage('Выберите файл.');
  283. End;
  284.  
  285. Procedure TMainForm.NewNodeEditChange(Sender: TObject);
  286. Begin
  287.     With Sender As TEdit Do
  288.         If (Text <> '') And (Text <> '-') Then
  289.             AddButton.Enabled := True
  290.         Else
  291.             AddButton.Enabled := False;
  292. End;
  293.  
  294. Procedure TMainForm.NewNodeEditKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  295. Begin
  296.     If ((SsShift In Shift) Or (SsCtrl In Shift)) And Not((Key = VK_RIGHT) Or (Key = VK_LEFT)) Then
  297.         Key := 0;
  298.     If Key = VK_DELETE Then
  299.         Key := 0;
  300.     If (Key = VK_RETURN) And AddButton.Enabled Then
  301.         AddButton.Click();
  302. End;
  303.  
  304. Procedure TMainForm.FileButtonClick(Sender: TObject);
  305. Begin
  306.     If ResMemo.Lines.Count = 0 Then
  307.     Begin
  308.         SaveButton.Enabled := False;
  309.     End
  310.     Else
  311.     Begin
  312.         SaveButton.Enabled := True;
  313.     End;
  314. End;
  315.  
  316. Procedure TMainForm.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  317. Begin
  318.     If SaveButton.Enabled And Not IsSaved Then
  319.         Case Application.MessageBox('Сохранить данные перед выходом?', 'Выход', MB_YESNOCANCEL + MB_ICONQUESTION + MB_DEFBUTTON3) Of
  320.             IDYES:
  321.                 Begin
  322.                     SaveButton.Click;
  323.                     CanClose := True;
  324.                 End;
  325.             IDNO:
  326.                 CanClose := True;
  327.             IDCANCEL:
  328.                 CanClose := False;
  329.         End
  330.     Else
  331.         Case Application.MessageBox('Вы точно хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) Of
  332.             IDYES:
  333.                 CanClose := True;
  334.             IDNO:
  335.                 CanClose := False;
  336.         End;
  337. End;
  338.  
  339. Procedure TMainForm.NewNodeEditKeyPress(Sender: TObject; Var Key: Char);
  340. Begin
  341.     With Sender As TEdit Do
  342.         TotalKeyPress(Key, SelStart, SelLength, MIN_NODE, MAX_NODE, Text);
  343. End;
  344.  
  345. Procedure TMainForm.ResButtonClick(Sender: TObject);
  346. Var
  347.     NodesWithDifferentHeight, S: String;
  348. Begin
  349.     NodesWithDifferentHeight := GetNodeWithDifferentHeight(Tree^.Next);
  350.     If NodesWithDifferentHeight = '' Then
  351.         S := ('Такие вершины отсутствуют')
  352.     Else
  353.         S := ('Вершины с разной высотой:' + NodesWithDifferentHeight);
  354.     ResMemo.Lines.Clear;
  355.     ResMemo.Lines.Add(S);
  356.     IsSaved := True;
  357. End;
  358.  
  359. Procedure TMainForm.SaveButtonClick(Sender: TObject);
  360. Begin
  361.     If SaveDialog1.Execute Then
  362.     Begin
  363.  
  364.         ResMemo.Lines.SaveToFile(SaveDialog1.FileName);
  365.         ShowMessage('Сохранение прошло успешно.');
  366.     End
  367.     Else
  368.  
  369.     Begin
  370.         ShowMessage('Сохранение отменено.');
  371.     End;
  372. End;
  373.  
  374. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement