Advertisement
Vladislav8653

5.1 delphi

Apr 9th, 2023 (edited)
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.86 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.     Head: TLabel;
  12.     Create: TButton;
  13.     Add: 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 AddClick(Sender: TObject);
  28.     procedure DeleteClick(Sender: TObject);
  29.     procedure ShowClick(Sender: TObject);
  30.     procedure CreateClick(Sender: TObject);
  31.     procedure N4Click(Sender: TObject);
  32.     procedure N5Click(Sender: TObject);
  33.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  34.   private
  35.     { Private declarations }
  36.   public
  37.     { Public declarations }
  38.   end;
  39.  
  40. type
  41.     PNode = ^TNode;
  42.     TNode = record
  43.         Data : String;
  44.         Next : PNode;
  45.     end;
  46.  
  47.     TQueue = record
  48.         Head, Tail : PNode;
  49.     end;
  50. var
  51.     MainForm: TMainForm;
  52.     Queue : TQueue;
  53.     Path, Result : String;
  54.     IsFileOpen : Boolean;
  55.  
  56. implementation
  57.  
  58. uses Add, Show, Create;
  59.  
  60. {$R *.dfm}
  61.  
  62.  
  63.  
  64. function DeleteFirstElement(var Queue: TQueue): String;
  65. var
  66.     Node: PNode;
  67. begin
  68.     Node := Queue.Head;
  69.     Queue.Head := Queue.Head.Next;
  70.     DeleteFirstElement := Node.Data;
  71.     Dispose(Node);
  72. end;
  73.  
  74. procedure TMainForm.AddClick(Sender: TObject);
  75. begin
  76.     AddNode.ShowModal;
  77. end;
  78.  
  79. procedure TMainForm.CreateClick(Sender: TObject);
  80. Var
  81.     MsgResult : Integer;
  82. begin
  83.     If Queue.Head = nil then
  84.         CreateQueue.ShowModal
  85.     else
  86.     begin
  87.         MsgResult := MessageDlg ('Создать новую очередь (старая не сохранится)?', mtConfirmation, [mbYes, mbNo], 0);
  88.         If MsgResult = mrYes then
  89.         begin
  90.             CreateQueue.ShowModal;
  91.         end;
  92.     end;
  93. end;
  94.  
  95. procedure TMainForm.DeleteClick(Sender: TObject);
  96. Var
  97.     NodeForDelete, Info : String;
  98.     MsgResult : Integer;
  99.     IsEmpty : Boolean;
  100. begin
  101.     IsEmpty := False;
  102.     if Queue.Head = nil then
  103.     Begin
  104.         Application.MessageBox('Очередь пуста.', 'Информация', 0);
  105.         IsEmpty := True;
  106.     End;
  107.  
  108.     If Not(IsEmpty) then
  109.     Begin
  110.         MsgResult := MessageDlg ('Удалить элемент?', mtConfirmation, [mbYes, mbNo], 0);
  111.         If MsgResult = mrYes then
  112.         begin
  113.             NodeForDelete := DeleteFirstElement(Queue);
  114.             Info := 'Элемент "' + NodeForDelete + '" удалён.';
  115.             Application.MessageBox(PWideChar(Info), 'Удаление элемента', 0);
  116.         end;
  117.     End;
  118. end;
  119.  
  120. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  121. begin
  122.     CanClose := Application.MessageBox('Вы действительно хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION) = ID_YES;
  123. end;
  124.  
  125. procedure TMainForm.N2Click(Sender: TObject);
  126. begin
  127.     Application.MessageBox('Очередь - это структура данных, в которой элементы добавляются в конец очереди и удаляются из начала очереди.', 'Инструкция', 0);
  128. end;
  129.  
  130. procedure TMainForm.N3Click(Sender: TObject);
  131. begin
  132.     Application.MessageBox('Арефин Владислав гр.251004', 'Разработ4ик', 0);
  133. end;
  134.  
  135. procedure TMainForm.ShowClick(Sender: TObject);
  136. begin
  137.     If Queue.Head <> nil then
  138.     Begin
  139.         ShowQueue.ShowModal;
  140.     End
  141.     else
  142.     begin
  143.         Application.MessageBox('Очередь пуста.', 'Информация', 0);
  144.     end;
  145. end;
  146.  
  147.  
  148. Function Open (): String;
  149. Begin
  150.     With MainForm Do
  151.     Begin
  152.         If OpenDialog1.Execute Then
  153.         Begin
  154.             Path := OpenDialog1.FileName;
  155.             IsFileOpen := True;
  156.         End
  157.         Else
  158.             IsFileOpen := False;
  159.     End;
  160.     Open := Path;
  161. End;
  162.  
  163. Function Save (): String;
  164. Begin
  165.     With MainForm Do
  166.     Begin
  167.         If SaveDialog1.Execute Then
  168.         Begin
  169.             Path := SaveDialog1.FileName;
  170.             IsFileOpen := True;
  171.         End
  172.         Else
  173.             IsFileOpen := False;
  174.     End;
  175.     Save := Path;
  176. End;
  177.  
  178. Function GetString(Var FileOutput: TextFile): String;
  179. Stdcall;
  180. External 'My1stLib.dll';
  181.  
  182. type
  183.     TStr = Array of String;
  184.  
  185. function SeparateString (Str : String) : TStr;
  186. Stdcall;
  187. External 'My1stLib.dll';
  188.  
  189.  
  190. procedure TMainForm.N4Click(Sender: TObject);
  191. Var
  192.     FileInput : TextFile;
  193.     StrWithNodes : String;
  194.     Arr : TStr;
  195.     I : Integer;
  196.     NewNode, Node: PNode;
  197. begin
  198.     IsFileOpen := False;
  199.     Path := Open();
  200.     AssignFile(FileInput, Path);
  201.     Reset(FileInput);
  202.     If (IsFileOpen) then
  203.         StrWithNodes := GetString(FileInput);
  204.     CloseFile(FileInput);
  205.     If (StrWithNodes <> '') then
  206.     Begin
  207.         Arr := SeparateString(StrWithNodes);
  208.         I := 0;
  209.         If Queue.Head <> nil then
  210.             While (Queue.Head <> nil) Do
  211.             Begin
  212.                 Node := Queue.Head;
  213.                 Queue.Head := Queue.Head.Next;
  214.                 Dispose(Node);
  215.             End;
  216.  
  217.         While (I <> High(Arr)) Do
  218.         begin
  219.             New(NewNode);
  220.             NewNode^.Data := Arr[I];
  221.             NewNode^.Next := nil;
  222.             if Queue.Head = nil then
  223.                 Queue.Head := NewNode
  224.             else
  225.                 Queue.Tail.Next := NewNode;
  226.             Queue.Tail := NewNode;
  227.             Inc(I);
  228.         end;
  229.         Application.MessageBox('Готово!', 'Информация', 0);
  230.     End;
  231. end;
  232.  
  233.  
  234. procedure TMainForm.N5Click(Sender: TObject);
  235. Var
  236.     FileOutput: TextFile;
  237.     IsCorrect : Boolean;
  238.     CurrNode : PNode;
  239. begin
  240.     If Queue.Head = nil then
  241.     begin
  242.         Application.MessageBox('Очередь пуста.', 'Информация', 0);
  243.         exit
  244.     end;
  245.     Result := '';
  246.     IsCorrect := True;
  247.     Path := Save();
  248.     If (IsFileOpen) Then
  249.     Begin
  250.         CurrNode := Queue.Head;
  251.         While (CurrNode <> nil) Do
  252.         Begin
  253.             Result := Result + CurrNode.Data + ' ';
  254.             CurrNode := CurrNode.Next;
  255.         End;
  256.  
  257.         try
  258.             AssignFile(FileOutput, Path);
  259.             Rewrite(FileOutput);
  260.             Write(FileOutput, Result);
  261.             CloseFile(FileOutput);
  262.         except
  263.             IsCorrect := False;
  264.             Application.MessageBox('Запись в файл не удалась.', 'Ошибка', MB_ICONSTOP);
  265.         end;
  266.  
  267.         If IsCorrect then
  268.         Begin
  269.             Application.MessageBox('Запись файла выполнена успешно.', 'Результат', 0);
  270.         End;
  271.     End;
  272. end;
  273.  
  274.  
  275. end.
  276.  
  277. -------------------------------------------------------------------------------
  278. library My1stLib;
  279. uses
  280.   System.SysUtils,
  281.   System.Classes;
  282.  
  283. {$R *.res}
  284.  
  285. Function GetString(Var FileOutput: TextFile): String; stdcall;
  286. Var
  287.     IsRight : Boolean;
  288.     Str : String;
  289. Begin
  290.     IsRight := True;
  291.     Try
  292.         Readln(FileOutput, Str);
  293.         Str := Trim (Str);
  294.     Except
  295.         IsRight := False;
  296.     End;
  297.     If IsRight then
  298.         GetString := Str;
  299. End;
  300.  
  301. type
  302.     TStr = Array of String;
  303.  
  304. function SeparateString (Str : String) : TStr; stdcall;
  305. Var
  306.     StrArr : TStr;
  307.     I, K : Integer;
  308.     Flag : Boolean;
  309. Begin
  310.     K := 0;
  311.     SetLength(StrArr, (Str.Length div 2) + 1);
  312.     For I := 0 To Str.Length div 2 do
  313.         StrArr[i] := '';
  314.     I := 1;
  315.     While I <= Str.Length Do
  316.     begin
  317.         Flag := True;
  318.         While (Str[I] <> ' ') and (I <= Str.Length) Do
  319.         Begin
  320.             StrArr[K] := StrArr[K] + Str[I];
  321.             Inc(I);
  322.             Flag := False;
  323.         End;
  324.         If Not(Flag) then
  325.             Inc(K);
  326.         If Flag then
  327.             Inc(I);
  328.     end;
  329.     I := 1;
  330.     K := 0;
  331.     While Str[I] <> '' Do
  332.     Begin
  333.         If Str[I] = ' ' then
  334.             Inc(K);
  335.         Inc(I);
  336.     End;
  337.     SetLength(StrArr, K + 2);
  338.     Result := StrArr;
  339. End;
  340.  
  341. Exports GetString, SeparateString;
  342.  
  343. end.
  344.  
  345. -------------------------------------------------------------------------------
  346. unit Create;
  347.  
  348. interface
  349.  
  350. uses
  351.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  352.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Menus;
  353.  
  354. type
  355.   TCreateQueue = class(TForm)
  356.     Grid: TStringGrid;
  357.     Instruction: TLabel;
  358.     MainMenu1: TMainMenu;
  359.     N1: TMenuItem;
  360.     procedure N1Click(Sender: TObject);
  361.     procedure GridKeyPress(Sender: TObject; var Key: Char);
  362.   private
  363.     { Private declarations }
  364.   public
  365.     { Public declarations }
  366.   end;
  367.  
  368. var
  369.   CreateQueue: TCreateQueue;
  370.  
  371. implementation
  372. uses MainUnit;
  373.  
  374. {$R *.dfm}
  375.  
  376. procedure TCreateQueue.GridKeyPress(Sender: TObject; var Key: Char);
  377. var
  378.     NewNode: PNode;
  379.     I : Integer;
  380. begin
  381.     If Key = '+' then
  382.         Grid.ColCount := Grid.ColCount + 5;
  383.     If Key = #13 then
  384.     begin
  385.         I := 0;
  386.         While (I <> Grid.ColCount) Do
  387.         begin
  388.             If (Grid.Cells[I, 0] <> '') then
  389.             begin
  390.                 New(NewNode);
  391.                 NewNode^.Data := Grid.Cells[I, 0];
  392.                 NewNode^.Next := nil;
  393.                 if Queue.Head = nil then
  394.                     Queue.Head := NewNode
  395.                 else
  396.                     Queue.Tail.Next := NewNode;
  397.                  Queue.Tail := NewNode;
  398.             end;
  399.             Inc(I);
  400.         end;
  401.         Application.MessageBox('Готово!', 'Информация', 0);
  402.         CreateQueue.Close;
  403.     end;
  404. end;
  405.  
  406. procedure TCreateQueue.N1Click(Sender: TObject);
  407. begin
  408.     Application.MessageBox('Нажмите Enter, если вы завершили ввод.'+ #13#10 +'Нажмите "+", чтобы добавить еще 5 ячеек для ввода (по умолчанию их 10). Пустые ячейки будут просто проигнорированы.', 'Справка', 0);
  409. end;
  410.  
  411. end.
  412. -------------------------------------------------------------------------------
  413. unit Show;
  414.  
  415. interface
  416.  
  417. uses
  418.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  419.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids;
  420.  
  421. type
  422.   TShowQueue = class(TForm)
  423.     Output: TStringGrid;
  424.     procedure FormActivate(Sender: TObject);
  425.   private
  426.     { Private declarations }
  427.   public
  428.     { Public declarations }
  429.   end;
  430.  
  431. var
  432.   ShowQueue: TShowQueue;
  433.  
  434. implementation
  435.  
  436. {$R *.dfm}
  437.  
  438. uses MainUnit;
  439.  
  440.  
  441.  
  442. procedure TShowQueue.FormActivate(Sender: TObject);
  443. Var
  444.     CurrNode : PNode;
  445.     I : Integer;
  446. begin
  447.     Output.Cells[0, 0] := '';
  448.     Output.ColCount := 1;
  449.  
  450.     CurrNode := Queue.Head;
  451.     I := 0;
  452.     While (CurrNode <> nil) Do
  453.     Begin
  454.         Output.Cells[I, 0] := CurrNode.Data;
  455.         CurrNode := CurrNode.Next;
  456.         Output.ColCount := Output.ColCount + 1;
  457.         Inc(I);
  458.     End;
  459.     Output.ColCount := Output.ColCount - 1;
  460. end;
  461.  
  462.  
  463. end.
  464. -------------------------------------------------------------------------------
  465. unit Add;
  466.  
  467. interface
  468.  
  469. uses
  470.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  471.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls;
  472.  
  473. type
  474.   TAddNode = class(TForm)
  475.     Data: TEdit;
  476.     Meeting: TLabel;
  477.     Panel1: TPanel;
  478.     procedure DataKeyPress(Sender: TObject; var Key: Char);
  479.     procedure FormShow(Sender: TObject);
  480.   private
  481.     { Private declarations }
  482.   public
  483.     { Public declarations }
  484.   end;
  485.  
  486. var
  487.   AddNode: TAddNode;
  488.  
  489. implementation
  490.  
  491. {$R *.dfm}
  492. Uses MainUnit;
  493.  
  494.  
  495. procedure AddNewElement (var Queue : TQueue; Data : String);
  496. Var
  497.     NewNode : PNode;
  498. Begin
  499.     New(NewNode);
  500.     NewNode.Data := Data;
  501.     NewNode.Next := nil;
  502.     if Queue.Head = nil then
  503.         Queue.Head := NewNode
  504.     else
  505.         Queue.Tail.Next := NewNode;
  506.     Queue.Tail := NewNode;
  507. End;
  508.  
  509. procedure TAddNode.DataKeyPress(Sender: TObject; var Key: Char);
  510. Var
  511.     MsgResult : Integer;
  512. begin
  513.     If (Key = #13) and (Data.Text <> '') then
  514.     begin
  515.         // здесь было бы славно убрать звук
  516.         MsgResult := MessageDlg ('Вы хотите добавить "' +  Data.Text +'" в очередь?', mtConfirmation, [mbYes, mbNo], 0);
  517.         If MsgResult = mrYes then
  518.         begin
  519.             AddNewElement(Queue, Data.Text);
  520.             AddNode.Close;
  521.         end;
  522.         Data.Text := '';
  523.     end;
  524. end;
  525.  
  526. procedure TAddNode.FormShow(Sender: TObject);
  527. begin
  528.     Panel1.SetFocus; // это костыль для того, чтобы убрать фокус с Edit. Но мне он не нравится.
  529. end;
  530.  
  531. end.
  532.  
  533.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement