Advertisement
anticlown

Lab.5.1.Full(Delphi)

Mar 17th, 2023
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 13.13 KB | None | 0 0
  1. Unit UnitMain;
  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.ExtCtrls,
  16.   Vcl.StdCtrls,
  17.   Vcl.Menus,
  18.   Vcl.ComCtrls,
  19.   Vcl.Buttons,
  20.   System.ImageList,
  21.   Vcl.ImgList,
  22.   Vcl.VirtualImageList,
  23.   Vcl.AppEvnts,
  24.   ClipBrd;
  25.  
  26. Type
  27.   TLabeledEdit = Class(Vcl.ExtCtrls.TLabeledEdit)
  28.   Protected
  29.     Procedure WMPaste(Var Msg:TMessage); Message WM_PASTE;
  30.   End;
  31.   TfrmMain = Class(TForm)
  32.     pButtons: TPanel;
  33.     svdSaveToFileDialog: TSaveDialog;
  34.     mmMainMenu: TMainMenu;
  35.     miFileMenu: TMenuItem;
  36.     miOpenFromFile: TMenuItem;
  37.     miSaveToFile: TMenuItem;
  38.     miHelp: TMenuItem;
  39.     miInfoAboutDeveloper: TMenuItem;
  40.     opdOpenFromFileDialog: TOpenDialog;
  41.     vilImages_48: TVirtualImageList;
  42.     sdbtOpenFromFile: TSpeedButton;
  43.     sdbtStart: TSpeedButton;
  44.     sdbtSaveToFile: TSpeedButton;
  45.     pBack: TPanel;
  46.     BalloonHint: TBalloonHint;
  47.     lbWelcome: TLabel;
  48.     lbTaskInfo: TLabel;
  49.     sdbtHelp: TSpeedButton;
  50.     lbePatrisipants: TLabeledEdit;
  51.     lbeOut: TLabeledEdit;
  52.     btStart: TButton;
  53.     lbOutParticipants: TLabel;
  54.     lbLastParticipant: TLabel;
  55.     lbOut: TLabel;
  56.     lbLast: TLabel;
  57.     lbIncorrectPatricipants: TLabel;
  58.     lbIncorrectOut: TLabel;
  59.     appeEvents: TApplicationEvents;
  60.     Procedure miHelpClick(Sender: TObject);
  61.     Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  62.     Procedure miInfoAboutDeveloperClick(Sender: TObject);
  63.     Procedure miOpenFromFileClick(Sender: TObject);
  64.     Procedure btStartClick(Sender: TObject);
  65.     Procedure sdbtSaveToFileClick(Sender: TObject);
  66.     Procedure sdbtHelpClick(Sender: TObject);
  67.     Procedure sdbtOpenFromFileClick(Sender: TObject);
  68.     Procedure miSaveToFileClick(Sender: TObject);
  69.     Procedure sdbtStartClick(Sender: TObject);
  70.     Procedure lbePatrisipantsChange(Sender: TObject);
  71.     Procedure lbeOutChange(Sender: TObject);
  72.   End;
  73.  
  74. Var
  75.   frmMain: TfrmMain;
  76.   NextInChain: THandle;
  77.  
  78. Implementation
  79.  
  80. {$R *.dfm}
  81.  
  82. Uses UnitData;
  83.  
  84. Type
  85.     TArr = Array Of Integer;
  86.     TPElement = ^TElement;
  87.     TElement = Record
  88.         Number: Integer;
  89.         Next: TPElement;
  90.     End;
  91.     TMyFuncType = Function(Msg: PChar): Boolean; stdcall;
  92.     TMyProcType = Procedure(Flag: Boolean); stdcall;
  93.  
  94. Function IsFileOfNumbersCorrect(Path: String): Boolean; stdcall; External 'anticlown.dll';
  95.  
  96. Procedure GetNumbersFromFile(Path: String; Var Participants, NumberOut: Integer; Var IsCorrect: Boolean); stdcall;  External 'anticlown.dll';
  97.  
  98. Function InputList(NumberOfParticipants: Integer): TPElement;
  99. Var
  100.     Head, CurrElem: TPElement;
  101.     I: Integer;
  102. Begin
  103.     New(CurrElem);
  104.     Head := CurrElem;
  105.     I := 0;
  106.  
  107.     While I < NumberOfParticipants - 1 Do
  108.     Begin
  109.         CurrElem^.Number := I + 1;
  110.  
  111.         New(CurrElem^.Next);
  112.         CurrElem := CurrElem^.Next;
  113.         Inc(I);
  114.     End;
  115.  
  116.     CurrElem^.Next := Head;
  117.     CurrElem^.Number := I + 1;
  118.     InputList := Head;
  119. End;
  120.  
  121. Function OutList(NumberOfParticipants, NumberOut: Integer; Head: TPElement): TArr;
  122. Var
  123.     AnsArr: TArr;
  124.     CurrElem, Temp: TPElement;
  125.     I, Counter: Integer;
  126. Begin
  127.     SetLength(AnsArr, NumberOfParticipants);
  128.     Counter := 0;
  129.     CurrElem := Head;
  130.  
  131.     If NumberOut = 1 Then
  132.     Begin
  133.         I := 1;
  134.  
  135.         While I < NumberOfParticipants Do
  136.         Begin
  137.             CurrElem := CurrElem^.Next;
  138.             Inc(I);
  139.         End;
  140.  
  141.         While Counter <> NumberOfParticipants Do
  142.         Begin
  143.             AnsArr[Counter] := CurrElem^.Next.Number;
  144.             Temp := CurrElem^.Next;
  145.             CurrElem^.Next:= Temp^.Next;
  146.             Dispose(Temp);
  147.             Inc(Counter);
  148.         End;
  149.     End
  150.     Else
  151.     Begin
  152.         While Counter <> NumberOfParticipants Do
  153.         Begin
  154.             I := 1;
  155.  
  156.             While I < NumberOut - 1 Do
  157.             Begin
  158.                 CurrElem := CurrElem^.Next;
  159.                 Inc(I);
  160.             End;
  161.  
  162.             AnsArr[Counter] := CurrElem^.Next.Number;
  163.             Temp := CurrElem^.Next;
  164.             CurrElem^.Next:= Temp^.Next;
  165.             Dispose(Temp);
  166.             CurrElem := CurrElem^.Next;
  167.             Inc(Counter);
  168.         End;
  169.     End;
  170.  
  171.     OutList := AnsArr;
  172. End;
  173.  
  174. Procedure TfrmMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  175. Begin
  176.     If Application.MessageBox(PChar('Вы уверены, что хотите выйти?'), PChar('Выход'),
  177.         MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1 + MB_TASKMODAL) = IDYES Then
  178.             CanClose := True
  179.         Else
  180.             CanClose := False;
  181. End;
  182.  
  183. Procedure TfrmMain.miHelpClick(Sender: TObject);
  184. Const
  185.     FIRST_MESSAGE = '- Вводимыми значениями могут являться только целые числа!' + #13#10;
  186.     SECOND_MESSAGE = '- Диапазон ввода количества участников: 3...10' + #13#10;
  187.     THIRD_MESSAGE = '- Для удобного использования программы представлена панель кнопок на левой панели.';
  188.     FOURTH_MESSAGE = '- Для ввода из файла используйте вкладку ''Файл'' - ''Открыть''.' + #13#10;
  189.     FIFTH_MESSAGE = '- Для сохранения в файл используйте вкладку ''Файл'' - ''Сохранить''.' + #13#10;
  190.     SIXTH_MESSAGE = '- Учтите: Каждое из значений в файле должно начинаться с новой строки!';
  191. Begin
  192.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + FOURTH_MESSAGE + SIXTH_MESSAGE + FIFTH_MESSAGE, 'Справка');
  193. End;
  194.  
  195. Procedure TfrmMain.sdbtHelpClick(Sender: TObject);
  196. Begin
  197.     miHelpClick(Sender);
  198. End;
  199.  
  200. Procedure TfrmMain.miInfoAboutDeveloperClick(Sender: TObject);
  201. Const
  202.     FIRST_MESSAGE = 'Ф.И.О.: Карась А.С. a.k.a Clownfish' + #13#10;
  203.     SECOND_MESSAGE = 'Группа: 251004' + #13#10;
  204.     THIRD_MESSAGE = 'Контакты: предварительная запись вживую по адресу' + #13#10;
  205.     FOURTH_MESSAGE = 'г.Гродно, ул.Мостовая, д.31';
  206. Begin
  207.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE,'О разработчике');
  208. End;
  209.  
  210. Procedure TfrmMain.miOpenFromFileClick(Sender: TObject);
  211. Var
  212.     Participants, NumberOut: Integer;
  213.     IsCorrect: Boolean;
  214. Begin
  215.     If opdOpenFromFileDialog.Execute() Then
  216.         If IsFileOfNumbersCorrect(opdOpenFromFileDialog.FileName) Then
  217.         Begin
  218.             GetNumbersFromFile(opdOpenFromFileDialog.FileName, Participants, NumberOut, IsCorrect);
  219.             If (IsCorrect) Then
  220.             Begin
  221.                 lbePatrisipants.Text := IntToStr(Participants);
  222.                 lbeOut.Text := IntToStr(NumberOut);
  223.                 btStartClick(Sender);
  224.             End;
  225.         End
  226.         Else
  227.             Application.MessageBox('Данные в файле некорректны, попробуйте ещё раз.', 'Ошибка!', MB_ICONERROR);
  228. End;
  229.  
  230. Procedure TfrmMain.sdbtOpenFromFileClick(Sender: TObject);
  231. Begin
  232.     miOpenFromFileClick(Sender);
  233. End;
  234.  
  235. Procedure TLabeledEdit.WMPaste(Var Msg: TMessage);
  236. Const
  237.     MIN_VALUE = 2;
  238.     MAX_VALUE = 10;
  239. Begin
  240.     If Clipboard.HasFormat(CF_TEXT) Then
  241.     Begin
  242.         Try
  243.             If (StrToInt(Clipboard.AsText) < MIN_VALUE) Or (StrToInt(Clipboard.AsText) > MAX_VALUE) Then
  244.             Begin
  245.                 Application.MessageBox(Pchar('В буфере обмена содержится неподходящее значение!'), 'Ошибка', MB_ICONWARNING);
  246.                 Exit;
  247.             End;
  248.         Except
  249.             Application.MessageBox(Pchar('При чтении из буфера произошла ошибка!'), 'Ошибка', MB_ICONWARNING);
  250.             Exit;
  251.         End;
  252.     End
  253.     Else
  254.     Begin
  255.         Application.MessageBox(Pchar('В буфере обмена содержатся некорректные данные!'), 'Ошибка', MB_ICONWARNING);
  256.         Exit;
  257.     End;
  258.     inherited;
  259. End;
  260.  
  261. Procedure TfrmMain.lbePatrisipantsChange(Sender: TObject);
  262. Const
  263.     MIN_VALUE = 3;
  264.     MAX_VALUE = 10;
  265. Begin
  266.     If (lbePatrisipants.Text <> '') Then
  267.     Begin
  268.         If (StrToInt(lbePatrisipants.Text) < MIN_VALUE) Or (StrToInt(lbePatrisipants.Text) > MAX_VALUE) Or (lbePatrisipants.Text[1] = '0') Then
  269.         Begin
  270.             lbIncorrectPatricipants.Visible := True;
  271.             btStart.Enabled := False;
  272.             sdbtStart.Enabled := False;
  273.         End
  274.         Else
  275.         Begin
  276.             lbIncorrectPatricipants.Visible := False;
  277.             If lbIncorrectOut.Visible Then
  278.             Begin
  279.                 btStart.Enabled := False;
  280.                 sdbtStart.Enabled := False;
  281.             End
  282.             Else
  283.             Begin
  284.                 btStart.Enabled := True;
  285.                 sdbtStart.Enabled := True;
  286.             End;
  287.         End;
  288.     End
  289.     Else
  290.     Begin
  291.         btStart.Enabled := False;
  292.         sdbtStart.Enabled := False;
  293.     End;
  294. End;
  295.  
  296. Procedure TfrmMain.lbeOutChange(Sender: TObject);
  297. Const
  298.     MIN_VALUE = 1;
  299.     MAX_VALUE = 10;
  300. Begin
  301.     If (lbeOut.Text <> '') Then
  302.     Begin
  303.         If (StrToInt(lbeOut.Text) < MIN_VALUE) Or (StrToInt(lbeOut.Text) > MAX_VALUE) Or (lbeOut.Text[1] = '0') Then
  304.         Begin
  305.             lbIncorrectOut.Visible := True;
  306.             btStart.Enabled := False;
  307.             sdbtStart.Enabled := False;
  308.         End
  309.         Else
  310.         Begin
  311.             lbIncorrectOut.Visible := False;
  312.             If lbIncorrectPatricipants.Visible Then
  313.             Begin
  314.                 btStart.Enabled := False;
  315.                 sdbtStart.Enabled := False;
  316.             End
  317.             Else
  318.             Begin
  319.                 btStart.Enabled := True;
  320.                 sdbtStart.Enabled := True;
  321.             End;
  322.         End;
  323.     End
  324.     Else
  325.     Begin
  326.         btStart.Enabled := False;
  327.         sdbtStart.Enabled := False;
  328.     End;
  329. End;
  330.  
  331. Procedure TfrmMain.btStartClick(Sender: TObject);
  332. Const
  333.     ERROR_MESSAGE = 'Номер выбывающего не может быть больше количества играющих! Измените номер выбывающего!';
  334. Var
  335.     Head: TPElement;
  336.     NumberOfParticipants, NumberOut, I: Integer;
  337.     AnsArr: TArr;
  338. Begin
  339.     If (StrToInt(lbeOut.Text) > StrToInt(lbePatrisipants.Text)) Then
  340.         Application.MessageBox(ERROR_MESSAGE, Pchar('Ошибка'), MB_ICONERROR)
  341.     Else
  342.     Begin
  343.         lbOutParticipants.Visible := True;
  344.         lbLastParticipant.Visible := True;
  345.         lbOut.Caption := '';
  346.         lbLast.Caption := '';
  347.  
  348.         NumberOfParticipants := StrToInt(lbePatrisipants.Text);
  349.         NumberOut := StrToInt(lbeOut.Text);
  350.         SetLength(AnsArr, NumberOfParticipants);
  351.  
  352.         Head := InputList(NumberOfParticipants);
  353.         AnsArr := OutList(NumberOfParticipants, NumberOut, Head);
  354.  
  355.         For I := Low(AnsArr) To High(AnsArr) - 1 Do
  356.             lbOut.Caption := lbOut.Caption + IntToStr(AnsArr[I]) + ' ';
  357.         lbLast.Caption := IntToStr(AnsArr[High(AnsArr)]);
  358.  
  359.         lbOut.Visible := True;
  360.         lbLast.Visible := True;
  361.         miSaveToFile.Enabled := True;
  362.         sdbtSaveToFile.Enabled := True;
  363.     End;
  364. End;
  365.  
  366. Procedure TfrmMain.sdbtStartClick(Sender: TObject);
  367. Begin
  368.     btStartClick(Sender);
  369. End;
  370.  
  371. Procedure TfrmMain.miSaveToFileClick(Sender: TObject);
  372. Var
  373.   OutputFile: TextFile;
  374. Begin
  375.     If svdSaveToFileDialog.Execute() And FileExists(svdSaveToFileDialog.FileName) Then
  376.     Begin
  377.         AssignFile(OutputFile, svdSaveToFileDialog.FileName);
  378.  
  379.         Try
  380.             Try
  381.                 Rewrite(OutputFile);
  382.  
  383.                 Writeln(OutputFile, 'Входные данные: ');
  384.                 Writeln(OutputFile, lbePatrisipants.Text + #13#10 + lbeOut.Text);
  385.                 Writeln(OutputFile, 'Ответ: ');
  386.                 Writeln(OutputFile, 'Выбывшие: ' + lbOut.Caption + #13#10 + 'Последний: ' + lbLast.Caption);
  387.  
  388.                 Application.MessageBox('Данные успешно записаны в файл!', 'Сохранение', MB_ICONINFORMATION);
  389.             Finally
  390.                 CloseFile(OutputFile);
  391.             End;
  392.         Except
  393.             Application.MessageBox('Отказано в доступе! Измените параметры файла! ', 'Ошибка!', MB_ICONERROR);
  394.         End;
  395.     End
  396.     Else
  397.         Application.MessageBox('Введено некорректное имя файла или закрыто окно сохранения!', 'Ошибка!', MB_ICONERROR);
  398. End;
  399.  
  400. Procedure TfrmMain.sdbtSaveToFileClick(Sender: TObject);
  401. begin
  402.     miSaveToFileClick(Sender);
  403. end;
  404.  
  405. End.
  406.  
  407. Unit UnitData;
  408.  
  409. Interface
  410.  
  411. Uses
  412.   System.SysUtils, System.Classes, Vcl.BaseImageCollection, Vcl.ImageCollection,
  413.   System.ImageList, Vcl.ImgList, Vcl.Controls;
  414.  
  415. Type
  416.   TdtmdForImages = Class(TDataModule)
  417.     imcImages: TImageCollection;
  418.     imlIcons: TImageList;
  419.   End;
  420.  
  421. Var
  422.   dtmdForImages: TdtmdForImages;
  423.  
  424. Implementation
  425.  
  426. {%CLASSGROUP 'Vcl.Controls.TControl'}
  427.  
  428. {$R *.dfm}
  429.  
  430. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement