Advertisement
Egor_Vakar

(Delphi) lab 5.1 MainUnit

Mar 21st, 2022
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.33 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.ComCtrls, Vcl.Grids, Vcl.StdCtrls,
  8.   Vcl.Menus;
  9.  
  10. type
  11.   TMainForm = class(TForm)
  12.     ClearButton: TButton;
  13.     MainMenu: TMainMenu;
  14.     FileMenu: TMenuItem;
  15.     OpenFromFileMenu: TMenuItem;
  16.     SaveToFileMenu: TMenuItem;
  17.     DeveloperInfoMenu: TMenuItem;
  18.     OpenFromFile: TOpenDialog;
  19.     OutputLabel: TLabel;
  20.     SaveToFile: TSaveDialog;
  21.     sgArray: TStringGrid;
  22.     TaskInfo: TLabel;
  23.     addButton: TButton;
  24.     DeleteLabel: TLabel;
  25.     DeleteButton: TButton;
  26.     ReverseButton: TButton;
  27.     procedure AddElem(Str: String);
  28.     procedure DeleteElem;
  29.     procedure DeveloperInfoMenuClick(Sender: TObject);
  30.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  31.     procedure MainCreate(Sender: TObject);
  32.     procedure DeleteButtonClick(Sender: TObject);
  33.     procedure addButtonClick(Sender: TObject);
  34.     procedure ReverseButtonClick(Sender: TObject);
  35.     procedure AddFromFile(Sender: TObject);
  36.     procedure SaveToFileMenuClick(Sender: TObject);
  37.  
  38.   private
  39.     { Private declarations }
  40.   public
  41.     { Public declarations }
  42.   end;
  43.  
  44. var
  45.   MainForm: TMainForm;
  46.  
  47. implementation
  48.  
  49. {$R *.dfm}
  50.  
  51. uses deleteElem, addElem;
  52.  
  53. Type
  54.     TPList = ^TList;
  55.         TList = Record
  56.             Data: String;
  57.             PNext: TPList;
  58.             PPrev: TPList;
  59.     End;
  60.  
  61. function IsOutFileCorrect(Path: String): Boolean;
  62. stdcall; external 'Lib.dll';
  63. function IsInFileCorrect(const Path: String): Boolean;
  64. stdcall; external 'Lib.dll';
  65.  
  66. var
  67.     Head: TPList;
  68.     Tail: TPList;
  69.     Len: Integer;
  70.  
  71. procedure TMainForm.addButtonClick(Sender: TObject);
  72. begin
  73.     MainForm.Enabled := False;
  74.     AddForm.Show;
  75. end;
  76.  
  77. procedure TMainForm.AddElem(Str: String);
  78. var
  79.     Temp: TPList;
  80. begin
  81.     New(Temp);
  82.     Temp^.Data := Str;
  83.     if Head = nil then
  84.         Head := Temp
  85.     else
  86.         if Tail = nil then
  87.         begin
  88.             Head^.pNext := Temp;
  89.             Tail := Temp;
  90.             Tail^.pPrev := Head;
  91.         end
  92.         else
  93.         begin
  94.             Tail^.pNext := Temp;
  95.             Temp^.pPrev := Tail;
  96.             Tail := Temp;
  97.         end;
  98.     Inc(Len);
  99.     ClearButton.Enabled := True;
  100.     DeleteButton.Enabled := True;
  101.     SaveToFileMenu.Enabled := True;
  102.     if Len > 1 then
  103.         ReverseButton.Enabled := True;
  104. end;
  105.  
  106.  
  107. procedure TMainForm.AddFromFile(Sender: TObject);
  108. Var
  109.     i, Temp, Size: Integer;
  110.     inFile: TextFile;
  111.     IsCorrect: Boolean;
  112. begin
  113.     IsCorrect := True;
  114.     if OpenFromFile.Execute() then
  115.     begin
  116.         if (IsInFileCorrect(OpenFromFile.FileName)) then
  117.         begin
  118.             AssignFile(InFile, OpenFromFile.FileName);
  119.             Reset(InFile);
  120.             Read(InFile, Size);
  121.             for i := 0 to Size - 1 do
  122.             begin
  123.                 Read(InFile,Temp);
  124.                 AddElem(IntToStr(Temp));
  125.                 if MainForm.sgArray.Cells[0,1] <> '' then
  126.                     MainForm.sgArray.ColCount := MainForm.sgArray.ColCount + 1;
  127.                 MainForm.sgArray.Cells[MainForm.sgArray.ColCount - 1, 0] := IntToStr(MainForm.sgArray.ColCount);
  128.                 MainForm.sgArray.Cells[MainForm.sgArray.ColCount - 1, 1] := IntToStr(Temp);
  129.             end;
  130.             CloseFile(InFile);
  131.             SaveToFileMenu.Enabled := True;
  132.         end
  133.         else
  134.             IsCorrect := False;
  135.     end
  136.     else
  137.         IsCorrect := False;
  138.     if not IsCorrect then
  139.         Application.MessageBox('Работа с файлом некорректна', 'Ошибка', MB_ICONERROR);
  140. end;
  141.  
  142. procedure TMainForm.DeleteButtonClick(Sender: TObject);
  143. begin
  144.     DeleteForm.Show;
  145. end;
  146.  
  147. procedure TMainForm.DeleteElem;
  148. var
  149.     isDeleted: Boolean;
  150.     Index, Counter, i: Integer;
  151.     Temp, List: TPList;
  152. begin
  153.     isDeleted := False;
  154.     Index := StrToInt(DeleteLabel.Caption);
  155.     DeleteLabel.Caption := '';
  156.     if (Index = 1) then
  157.     begin
  158.         if Len <> 1 then
  159.         begin
  160.             Head := Head^.pNext;
  161.             Head^.pPrev := nil;
  162.         end
  163.         else
  164.             Head := nil;
  165.         IsDeleted := True;
  166.     end
  167.     else
  168.         if (Index = Len) then
  169.         begin
  170.             Tail := Tail^.pPrev;
  171.             Tail^.pNext := nil;
  172.             IsDeleted := True;
  173.         end;
  174.  
  175.     if (not IsDeleted) then
  176.     begin
  177.         if (Index <= Len - 1 - Index) then
  178.         begin
  179.             temp := head;
  180.             counter := 0;
  181.             while (counter <> Index) do
  182.             begin
  183.                 Temp := Temp^.pNext;
  184.                 Inc(Counter);
  185.             end;
  186.         end
  187.         else
  188.         begin
  189.             Temp := Tail;
  190.             Counter := Len - 1;
  191.             while (Counter <> Index) do
  192.             begin
  193.                 Temp := Temp^.pPrev;
  194.                 Inc(Counter);
  195.             end;
  196.         end;
  197.         Temp^.pPrev^.pNext := Temp^.pNext;
  198.         Temp^.pNext^.pPrev := Temp^.pPrev;
  199.     end;
  200.  
  201.     SgArray.Cells[Index - 1,1] := '';
  202.     if Index <> Len then
  203.         for i := Index - 1 to Len - 2 do
  204.             SgArray.Cells[i,1] := SgArray.Cells[i + 1,1];
  205.         SgArray.Cells[Len,0] := '';
  206.     SgArray.Cells[Len,1] := '';
  207.     if SgArray.ColCount <> 1 then
  208.         SgArray.ColCount := SgArray.ColCount - 1
  209.     else
  210.     SgArray.Cells[0,0] := '';
  211.     Dec(Len);
  212.     if Len = 0 then
  213.     begin
  214.         ClearButton.Enabled := False;
  215.         DeleteButton.Enabled := False;
  216.         ReverseButton.Enabled := False;
  217.         SaveToFileMenu.Enabled := False;
  218.     end
  219.     else
  220.         if Len = 1 then
  221.             ReverseButton.Enabled := False;
  222. end;
  223.  
  224. procedure TMainForm.DeveloperInfoMenuClick(Sender: TObject);
  225. begin
  226.     Application.MessageBox('Студент группы 151002, Вакарь Егор', 'О разработчике');
  227. end;
  228.  
  229. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  230. var
  231.     WND: HWND;
  232.     lpCaption, lpText: PChar;
  233.     Tip: Integer;
  234. begin
  235.     WND := MainForm.Handle;
  236.     lpCaption := 'Выход';
  237.     lpText := 'Вы уверены, что хотите выйти?';
  238.     Tip := MB_YESNO + MB_ICONINFORMATION + MB_DEFBUTTON2;
  239.     case MessageBox(WND, lpText, lpCaption, Tip) of
  240.         IDYES : CanClose := True;
  241.         IDNO : CanClose := False;
  242.     end
  243. end;
  244.  
  245. procedure TMainForm.MainCreate(Sender: TObject);
  246. var
  247.     i: Integer;
  248. begin
  249.     for i := 0 to Len - 1 do
  250.     begin
  251.         SgArray.Cells[i,0] := '';
  252.         SgArray.Cells[i,1] := '';
  253.     end;
  254.     SgArray.ColCount := 1;
  255.     Head := nil;
  256.     Tail := nil;
  257.     Len := 0;
  258.     ClearButton.Enabled := False;
  259.     DeleteButton.Enabled := False;
  260.     ReverseButton.Enabled := False;
  261.     SaveToFileMenu.Enabled := False;
  262. end;
  263.  
  264. procedure TMainForm.ReverseButtonClick(Sender: TObject);
  265. var
  266.     FromHead, FromTail: TPList;
  267.     Counter: Integer;
  268.     Temp: String;
  269. begin
  270.     FromHead := Head;
  271.     FromTail := Tail;
  272.     Counter := 0;
  273.     while (Counter <> (Len div 2)) do
  274.     begin
  275.         Temp := FromHead^.Data;
  276.         FromHead^.data := FromTail^.Data;
  277.         SgArray.Cells[Counter,1] := FromTail^.Data;
  278.         FromTail^.Data := Temp;
  279.         SgArray.Cells[Len - 1 - Counter,1] := FromTail^.Data;
  280.         FromHead := FromHead^.pNext;
  281.         FromTail := FromTail^.pPrev;
  282.         Inc(Counter);
  283.     end;
  284. end;
  285.  
  286. procedure TMainForm.SaveToFileMenuClick(Sender: TObject);
  287. Var
  288.     Temp: TPList;
  289.     OutFile: TextFile;
  290.     IsCorrect: Boolean;
  291.     i: Integer;
  292. begin
  293.     IsCorrect := True;
  294.     if OpenFromFile.Execute() then
  295.         if IsOutFileCorrect(OpenFromFile.FileName) then
  296.         begin
  297.             AssignFile(OutFile, OpenFromFile.FileName);
  298.             Rewrite(OutFile);
  299.             Writeln(OutFile, 'Список:');
  300.             Temp := Head;
  301.             for i := 1 to Len do
  302.             begin
  303.                 Write(OutFile, Temp^.Data + ' ');
  304.                 Temp := Temp^.PNext;
  305.             end;
  306.             CloseFile(OutFile);
  307.         end
  308.         else
  309.             IsCorrect := False
  310.     else
  311.         IsCorrect := False;
  312.     if not IsCorrect then
  313.         Application.MessageBox('Работа с файлом некорректна', 'Ошибка', MB_ICONERROR)
  314.     else
  315.         Application.MessageBox('Данные сохранены в файл', 'Успех');
  316. end;
  317.  
  318. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement