Advertisement
Vladislav8653

V

Feb 26th, 2023
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 15.63 KB | None | 0 0
  1. unit Unit1;
  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.StdCtrls, Vcl.Menus, ShellApi;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Label1: TLabel;
  12.     Edit1: TEdit;
  13.     Edit2: TEdit;
  14.     Label2: TLabel;
  15.     Label3: TLabel;
  16.     Button1: TButton;
  17.     Edit3: TEdit;
  18.     Label4: TLabel;
  19.     Label5: TLabel;
  20.     Button2: TButton;
  21.     Label6: TLabel;
  22.     PopupMenu1: TPopupMenu;
  23.     SaveDialog1: TSaveDialog;
  24.     OpenDialog1: TOpenDialog;
  25.     MainMenu1: TMainMenu;
  26.     N1: TMenuItem;
  27.     N2: TMenuItem;
  28.     N3: TMenuItem;
  29.     N4: TMenuItem;
  30.     N5: TMenuItem;
  31.     N6: TMenuItem;
  32.     procedure Button1Click(Sender: TObject);
  33.     procedure Button2Click(Sender: TObject);
  34.     procedure N4Click(Sender: TObject);
  35.     procedure N5Click(Sender: TObject);
  36.     procedure Edit3KeyPress(Sender: TObject; var Key: Char);
  37.     procedure Edit3Change(Sender: TObject);
  38.     procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  39.     procedure Edit1Change(Sender: TObject);
  40.     procedure Edit2Change(Sender: TObject);
  41.     procedure Edit2KeyPress(Sender: TObject; var Key: Char);
  42.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  43.     procedure N2Click(Sender: TObject);
  44.     procedure N3Click(Sender: TObject);
  45.     procedure N6Click(Sender: TObject);
  46.   private
  47.     { Private declarations }
  48.   public
  49.     { Public declarations }
  50.   end;
  51.  
  52. var
  53.   Form1: TForm1;
  54.   SizeOfArrays, Counter : Integer;
  55.   ArrX, ArrY : Array of Integer;
  56.   Path, Result : String;
  57.   IsFileOpen: Boolean;
  58.  
  59. implementation
  60.  
  61. {$R *.dfm}
  62.  
  63. procedure TForm1.Button1Click(Sender: TObject);
  64. const
  65.     NEW_LEFT = 15;
  66. var
  67.     IsCorrect : Boolean;
  68. begin
  69.     IsCorrect := True;
  70.     Try
  71.         SizeOfArrays := StrToInt (Edit3.Text);
  72.     Except
  73.         IsCorrect := False;
  74.         Edit3.Text := '';
  75.         MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  76.     End;
  77.     if IsCorrect then
  78.     Begin
  79.         SetLength (ArrX, SizeOfArrays);
  80.         SetLength (ArrY, SizeOfArrays);
  81.         Counter := 0;
  82.         Edit1.Visible := True;
  83.         Edit2.Visible := True;
  84.         Label2.Visible := True;
  85.         Label3.Visible := True;
  86.         Edit3.Visible := False;
  87.         Label4.Visible := False;
  88.         Label1.Caption := 'Введите координаты вершины'; // отрегулировать left
  89.         Label1.Left := Label1.Left + NEW_LEFT;
  90.         Label5.Caption := '1';  // тут тоже, чтобы красиво было
  91.         Button1.Visible := False;
  92.         Button2.Visible := True;
  93.         Label6.Visible := True;
  94.     End;
  95. end;
  96.  
  97.  
  98.  
  99. procedure TForm1.Button2Click(Sender: TObject);
  100. var
  101.     X, Y, J, I: Integer;
  102.     GotInto, IsCorrect, IsCorrect2  : Boolean;
  103. const
  104.     NEW_LEFT = 23;
  105.     YES_LEFT = 16;
  106.     NO_LEFT = 10;
  107. begin
  108.     IsCorrect := True;
  109.     Try
  110.         X := StrToInt (Edit1.Text);
  111.     Except
  112.         IsCorrect := False;
  113.          Edit2.Text := '';
  114.          Edit1.Text := '';
  115.         MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  116.     End;
  117.    
  118.     if IsCorrect then
  119.     Begin
  120.    
  121.         IsCorrect2 := true;
  122.         Try
  123.             Y := StrToInt (Edit2.Text);
  124.         Except
  125.             IsCorrect2 := False;
  126.             Edit2.Text := '';
  127.             Edit1.Text := '';
  128.             MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  129.         End;
  130.  
  131.         if IsCorrect2 then
  132.         Begin
  133.             if Button2.Caption = 'Результат' then
  134.             Begin
  135.                 GotInto := False;
  136.                 J := SizeOfArrays - 1;
  137.                 for I := 0 to SizeOfArrays do
  138.                 Begin
  139.                     If ((((ArrY[I] <= Y) and (Y <= ArrY[J])) or ((ArrY[J] <= Y) and (Y <= ArrY[I]))) and (((ArrY[J] - ArrY[I]) <> 0) and
  140.                     (X >= ((ArrX[J] - ArrX[I]) * (Y - ArrY[I]) / (ArrY[J] - ArrY[I]) + ArrX[I])))) then
  141.                         GotInto := Not (GotInto);
  142.                     Inc (J);
  143.                     If (J = SizeOfArrays) then
  144.                         J := 0;
  145.                 End;
  146.                 if GotInto then
  147.                 Begin
  148.                     Label1.Caption := 'Точка в многоугольнике!';
  149.                     Label1.Left := Label1.left + YES_LEFT;
  150.  
  151.                 End
  152.                 else
  153.                 Begin
  154.                     Label1.Caption := 'Точка не в многоугольнике.';
  155.                 End;
  156.                 Result := Label1.Caption;
  157.                 N3.Enabled := True;
  158.                 Label6.Visible := False;
  159.                 Label3.Visible := False;
  160.                 Label4.Visible := False;
  161.                 Label2.Visible := False;
  162.                 Edit1.Visible := False;
  163.                 Edit2.Visible := False;
  164.                 Button2.Visible := False;
  165.             End;
  166.        
  167.             if Counter < SizeOfArrays  then
  168.             Begin
  169.                 Label6.Caption := Label6.Caption + '(' + Edit1.Text + ',' + Edit2.Text + ')' ;
  170.                 ArrX[Counter] := X;
  171.                 ArrY[Counter] := Y;
  172.                 Inc(Counter);
  173.                 if Counter < SizeOfArrays then
  174.                 begin
  175.                     Label5.Caption := IntToStr (Counter + 1);
  176.                     Label6.Caption := Label6.Caption + ', ';
  177.                 end
  178.                 else
  179.                 begin
  180.                     Label1.Left := Label1.Left + NEW_LEFT;
  181.                     Label1.Caption := 'Введите координаты точки:';
  182.                     Label5.Caption := '';
  183.                     Button2.Caption := 'Результат';
  184.                 end;
  185.             End;
  186.             Edit1.Text := '';
  187.             Edit2.Text := '';
  188.         End;
  189.     End;
  190. end;
  191.  
  192.  
  193. procedure TForm1.Edit1Change(Sender: TObject);
  194. begin
  195.     //N3.Enabled := False;
  196.     If (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or ((Length(Edit2.Text) = 1) and (Edit2.Text = '-')) or ((Length(Edit1.Text) = 1) and (Edit1.Text = '-')) then
  197.         Button2.Enabled := False
  198.     else
  199.         Button2.Enabled := True;
  200. end;
  201.  
  202. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  203. begin
  204.     If ((Key = #13) And (Button2.Enabled)) Then
  205.         Button2.Click;
  206.     If (Not(Key In ['0'..'9', #08, #46, '-'])) Then
  207.         Key := #0;
  208.     If (Key = '-') and (Length(Edit1.Text) <> 0) then
  209.         Key := #0;
  210.     If Key = '-' then
  211.         Edit1.MaxLength := 3;
  212.     if (Key = #08) and (Length(Edit1.Text) = 1) then
  213.         Edit1.MaxLength := 2;
  214.     if key = '.' then
  215.         key := #0;
  216. end;
  217.  
  218. procedure TForm1.Edit2Change(Sender: TObject);
  219. begin
  220.     //N3.Enabled := False;
  221.     If (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or ((Length(Edit2.Text) = 1) and (Edit2.Text = '-')) or ((Length(Edit1.Text) = 1) and (Edit1.Text = '-')) then
  222.         Button2.Enabled := False
  223.     else
  224.         Button2.Enabled := True;
  225. end;
  226.  
  227. procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
  228. begin
  229.     If ((Key = #13) And (Button2.Enabled)) Then
  230.         Button2.Click;
  231.     If (Not(Key In ['0'..'9', #08, #46, '-'])) Then
  232.         Key := #0;
  233.     If (Key = '-') and (Length(Edit2.Text) <> 0) then
  234.         Key := #0;
  235.     If Key = '-' then
  236.         Edit2.MaxLength := 3;
  237.     if (Key = #08) and (Length(Edit2.Text) = 1) then
  238.         Edit2.MaxLength := 2;
  239.     if key = '.' then
  240.         key := #0;
  241. end;
  242.  
  243. procedure TForm1.Edit3Change(Sender: TObject);
  244. begin
  245.     if Length(Edit3.Text) <> 0 then
  246.         Button1.Enabled := True
  247.     else
  248.         Button1.Enabled := False;
  249.      //N3.Enabled := False;
  250. end;
  251.  
  252. procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
  253. begin
  254.     if Key in ['0'..'2'] then
  255.         key := #0;
  256.     If ((Key = #13) And (Button1.Enabled)) Then
  257.         Button1.Click;
  258.     If (Not(Key In ['0'..'9', #08, #46])) Then
  259.         Key := #0;
  260. end;
  261.  
  262. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  263. begin
  264.     CanClose := MessageBox(Form1.Handle, 'Вы уверены, что хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION)=ID_YES;
  265. end;
  266.  
  267. procedure TForm1.N4Click(Sender: TObject);
  268. begin
  269.       Application.MessageBox('Программа вычисляет, входит ли точка, заданная двумя координатами, в многоугольник, заданный двумя координатами.'#13#10'Диапазон N (кол-ва сторон): 3..9'#13#10'Диапазон координат: -99..99', 'Инструкция', 0);
  270. end;
  271.  
  272. procedure TForm1.N5Click(Sender: TObject);
  273. begin
  274.      Application.MessageBox('Арефин Владислав гр.251004', 'Разрабочик', 0);
  275. end;
  276.  
  277. procedure TForm1.N6Click(Sender: TObject);
  278. begin
  279.     Application.MessageBox('Пример заполнения файла:'#13#10'3 - количество вершин (для примера)'#13#10'3 2 - координаты X и Y вершины 1'#13#10'6 -9 - координаты X и Y вершины 2'#13#10'5 72 - координаты X и Y вершины 3'#13#10'5 3 - координаты X и Y точки', 'Инструкция', 0);
  280. end;
  281.  
  282. Function Open (): String;
  283. Begin
  284.     With Form1 Do
  285.     Begin
  286.         If OpenDialog1.Execute Then
  287.         Begin
  288.             Path := OpenDialog1.FileName;
  289.             IsFileOpen := True;
  290.         End
  291.         Else
  292.             IsFileOpen := False;
  293.     End;
  294.     Open := Path;
  295. End;
  296.  
  297. function CheckN (N : String): Boolean;
  298. Const
  299.     MIN = 3;
  300.     MAX = 9;
  301. Var
  302.     IsCorrect : Boolean;
  303.     Temp : Integer;
  304. Begin
  305.     IsCorrect := True;
  306.     try
  307.         Temp := StrToInt(N);
  308.     except
  309.         IsCorrect := False;
  310.         MessageBox(Form1.Handle, Pchar('Не получилось считать количество вершин. Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  311.     end;
  312.     If (IsCorrect And ((Temp > MAX) Or (Temp < MIN)))  then
  313.     Begin
  314.         MessageBox(Form1.Handle, Pchar('Количество вершин вне разрешенного диапазона! Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  315.         IsCorrect := False;
  316.     End;
  317.     CheckN := IsCorrect;
  318. End;
  319.  
  320. function TakeN (Var FileOutput: TextFile) : String;
  321. Var
  322.     N : String;
  323.     IsRight: Boolean;
  324. Begin
  325.     IsRight := True;
  326.     Try
  327.         Readln(FileOutput, N);
  328.         N := Trim (N);
  329.         IsRight := CheckN(N);
  330.     Except
  331.     End;
  332.     If(Not(IsRight)) Then
  333.         TakeN := ''
  334.     Else
  335.         TakeN := N;
  336. End;
  337.  
  338. function CheckCoordinates (Coordinates : String): Boolean;
  339. Var
  340.     IsCorrect : Boolean;
  341.     Temp, I : Integer;
  342.     TempStr : String;
  343. Begin
  344.     IsCorrect := True;
  345.     I := 1;
  346.     While (I <= Coordinates.Length) and (IsCorrect) Do
  347.     Begin
  348.         While (Coordinates[I] <> ' ') and (I <= Coordinates.Length) Do
  349.         Begin
  350.             TempStr := TempStr + Coordinates[I];
  351.             Inc(I);
  352.         End;
  353.         If (Coordinates[I] = ' ') and (I <= Coordinates.Length) then
  354.             Inc(I);
  355.         try
  356.             Temp := StrToInt(TempStr);
  357.         except
  358.             IsCorrect := False;
  359.             MessageBox(Form1.Handle, Pchar('Не получилось считать координаты вершин. Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
  360.         end;
  361.         TempStr := '';
  362.     End;
  363.     CheckCoordinates := IsCorrect;
  364. End;
  365.  
  366. function TakeCoordinates (Var FileOutput: TextFile) : String;
  367. Var
  368.     Coordinates : String;
  369.     IsRight: Boolean;
  370. Begin
  371.     IsRight := True;
  372.     Try
  373.         Readln(FileOutput, Coordinates );
  374.         Coordinates := Trim (Coordinates);
  375.         IsRight := CheckCoordinates(Coordinates);
  376.     Except
  377.     End;
  378.     If(Not(IsRight)) Then
  379.         TakeCoordinates := ''
  380.     Else
  381.         TakeCoordinates := Coordinates;
  382. End;
  383.  
  384. function TakeX (Var FileOutput: TextFile; Coordinates : String) : String;
  385. Var
  386.     X : String;
  387.     I : Integer;
  388. Const
  389.     MIN = -99;
  390.     MAX = 99;
  391. Begin
  392.     I := 1;
  393.     While Coordinates[I] <> ' ' Do
  394.     Begin
  395.         X := X + Coordinates[I];
  396.         Inc(I);
  397.     End;
  398.     I := StrToInt(X);
  399.     If (I < MIN) or (I > MAX) then
  400.     Begin
  401.         X := '';
  402.         MessageBox(Form1.Handle, Pchar('Координата X выходят за границы допустимого значения. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  403.     End;
  404.     TakeX := X;
  405. End;
  406.  
  407. function TakeY (Var FileOutput: TextFile; Coordinates : String) : String;
  408. Var
  409.     I : Integer;
  410. Const
  411.     MIN = -99;
  412.     MAX = 99;
  413. Begin
  414.     I := 1;
  415.     While Coordinates[I] <> ' ' Do
  416.     Begin
  417.         Coordinates[I] := ' ';
  418.         Inc(I);
  419.     End;
  420.     Coordinates := Trim (Coordinates);
  421.     I := StrToInt(Coordinates);
  422.     If (I < MIN) or (I > MAX) then
  423.     Begin
  424.         Coordinates := '';
  425.         MessageBox(Form1.Handle, Pchar('Координата Y выходят за границы допустимого значения. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  426.     End;
  427.     TakeY := Coordinates;
  428. End;
  429.  
  430. procedure TForm1.N2Click(Sender: TObject);
  431. Var
  432.     FileInput: TextFile;
  433.     N, Coordinates, Text1, Text2 : String;
  434.     I : Integer;
  435.     IsCorrect : Boolean;
  436. begin
  437.     Path := Open;
  438.     AssignFile(FileInput, Path);
  439.     Reset(FileInput);
  440.     If(IsFileOpen) Then
  441.     Begin
  442.         N := TakeN(FileInput);
  443.     End;
  444.     If Not(N = '') then
  445.     begin
  446.         Edit3.Text := N;
  447.         Button1Click(Sender);
  448.     end;
  449.     I := 0;
  450.     IsCorrect := True;
  451.     If N <> '' then
  452.     begin
  453.         While (I <= StrToInt(N)) and (IsCorrect) Do
  454.         begin
  455.             try
  456.                 Coordinates := TakeCoordinates(FileInput);
  457.                 Text1 := TakeX(FileInput, Coordinates);
  458.                 Edit1.Text := Text1;
  459.                 Text2 := TakeY(FileInput, Coordinates);
  460.                 Edit2.Text := Text2;
  461.                 If (Text1 = '') or (Text2 = '') then
  462.                     I := StrToInt(Text1);  // это сделано специально, чтобы попасть на ветку except.
  463.                 Button2Click(Sender);
  464.                 Inc(I);
  465.             except
  466.                 IsCorrect := False;
  467.                 MessageBox(Form1.Handle, Pchar('Из-за неверных исходных данных в файле программа будет перезапущена. Проверьте исходные данные.'), 'Перезапуск', MB_ICONSTOP);
  468.                 SHELLEXECUTE(0, 'Open', PWideChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
  469.                 CloseFile(FileInput);
  470.                 Application.Terminate;
  471.             end;
  472.         end;
  473.     end;
  474.     CloseFile(FileInput);
  475. end;
  476.  
  477. procedure TForm1.N3Click(Sender: TObject);
  478. Var
  479.     FileOutput: TextFile;
  480.     IsCorrect : Boolean;
  481. begin
  482.     IsCorrect := True;
  483.     Path := Open;
  484.     If (IsFileOpen) Then
  485.     Begin
  486.         try
  487.             AssignFile(FileOutput, Path);
  488.             Rewrite(FileOutput);
  489.             Write(FileOutput, Result);
  490.         except
  491.             IsCorrect := False;
  492.             Application.MessageBox('Запись в файл не удалась.', 'Ошибка', MB_ICONSTOP);
  493.         end;
  494.         if IsCorrect then
  495.         Begin
  496.             Application.MessageBox('Запись файла выполнена успешно.', 'Результат', 0);
  497.             CloseFile(FileOutput);
  498.         End;
  499.     End;
  500. end;
  501.  
  502. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement