Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, ShellApi;
- type
- TForm1 = class(TForm)
- Label1: TLabel;
- Edit1: TEdit;
- Edit2: TEdit;
- Label2: TLabel;
- Label3: TLabel;
- Button1: TButton;
- Edit3: TEdit;
- Label4: TLabel;
- Label5: TLabel;
- Button2: TButton;
- Label6: TLabel;
- PopupMenu1: TPopupMenu;
- SaveDialog1: TSaveDialog;
- OpenDialog1: TOpenDialog;
- MainMenu1: TMainMenu;
- N1: TMenuItem;
- N2: TMenuItem;
- N3: TMenuItem;
- N4: TMenuItem;
- N5: TMenuItem;
- N6: TMenuItem;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure N4Click(Sender: TObject);
- procedure N5Click(Sender: TObject);
- procedure Edit3KeyPress(Sender: TObject; var Key: Char);
- procedure Edit3Change(Sender: TObject);
- procedure Edit1KeyPress(Sender: TObject; var Key: Char);
- procedure Edit1Change(Sender: TObject);
- procedure Edit2Change(Sender: TObject);
- procedure Edit2KeyPress(Sender: TObject; var Key: Char);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure N2Click(Sender: TObject);
- procedure N3Click(Sender: TObject);
- procedure N6Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- SizeOfArrays, Counter : Integer;
- ArrX, ArrY : Array of Integer;
- Path, Result : String;
- IsFileOpen: Boolean;
- implementation
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- const
- NEW_LEFT = 15;
- var
- IsCorrect : Boolean;
- begin
- IsCorrect := True;
- Try
- SizeOfArrays := StrToInt (Edit3.Text);
- Except
- IsCorrect := False;
- Edit3.Text := '';
- MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
- End;
- if IsCorrect then
- Begin
- SetLength (ArrX, SizeOfArrays);
- SetLength (ArrY, SizeOfArrays);
- Counter := 0;
- Edit1.Visible := True;
- Edit2.Visible := True;
- Label2.Visible := True;
- Label3.Visible := True;
- Edit3.Visible := False;
- Label4.Visible := False;
- Label1.Caption := 'Введите координаты вершины'; // отрегулировать left
- Label1.Left := Label1.Left + NEW_LEFT;
- Label5.Caption := '1'; // тут тоже, чтобы красиво было
- Button1.Visible := False;
- Button2.Visible := True;
- Label6.Visible := True;
- End;
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- var
- X, Y, J, I: Integer;
- GotInto, IsCorrect, IsCorrect2 : Boolean;
- const
- NEW_LEFT = 23;
- YES_LEFT = 16;
- NO_LEFT = 10;
- begin
- IsCorrect := True;
- Try
- X := StrToInt (Edit1.Text);
- Except
- IsCorrect := False;
- Edit2.Text := '';
- Edit1.Text := '';
- MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
- End;
- if IsCorrect then
- Begin
- IsCorrect2 := true;
- Try
- Y := StrToInt (Edit2.Text);
- Except
- IsCorrect2 := False;
- Edit2.Text := '';
- Edit1.Text := '';
- MessageBox(Form1.Handle, Pchar('Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
- End;
- if IsCorrect2 then
- Begin
- if Button2.Caption = 'Результат' then
- Begin
- GotInto := False;
- J := SizeOfArrays - 1;
- for I := 0 to SizeOfArrays do
- Begin
- If ((((ArrY[I] <= Y) and (Y <= ArrY[J])) or ((ArrY[J] <= Y) and (Y <= ArrY[I]))) and (((ArrY[J] - ArrY[I]) <> 0) and
- (X >= ((ArrX[J] - ArrX[I]) * (Y - ArrY[I]) / (ArrY[J] - ArrY[I]) + ArrX[I])))) then
- GotInto := Not (GotInto);
- Inc (J);
- If (J = SizeOfArrays) then
- J := 0;
- End;
- if GotInto then
- Begin
- Label1.Caption := 'Точка в многоугольнике!';
- Label1.Left := Label1.left + YES_LEFT;
- End
- else
- Begin
- Label1.Caption := 'Точка не в многоугольнике.';
- End;
- Result := Label1.Caption;
- N3.Enabled := True;
- Label6.Visible := False;
- Label3.Visible := False;
- Label4.Visible := False;
- Label2.Visible := False;
- Edit1.Visible := False;
- Edit2.Visible := False;
- Button2.Visible := False;
- End;
- if Counter < SizeOfArrays then
- Begin
- Label6.Caption := Label6.Caption + '(' + Edit1.Text + ',' + Edit2.Text + ')' ;
- ArrX[Counter] := X;
- ArrY[Counter] := Y;
- Inc(Counter);
- if Counter < SizeOfArrays then
- begin
- Label5.Caption := IntToStr (Counter + 1);
- Label6.Caption := Label6.Caption + ', ';
- end
- else
- begin
- Label1.Left := Label1.Left + NEW_LEFT;
- Label1.Caption := 'Введите координаты точки:';
- Label5.Caption := '';
- Button2.Caption := 'Результат';
- end;
- End;
- Edit1.Text := '';
- Edit2.Text := '';
- End;
- End;
- end;
- procedure TForm1.Edit1Change(Sender: TObject);
- begin
- //N3.Enabled := False;
- 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
- Button2.Enabled := False
- else
- Button2.Enabled := True;
- end;
- procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
- begin
- If ((Key = #13) And (Button2.Enabled)) Then
- Button2.Click;
- If (Not(Key In ['0'..'9', #08, #46, '-'])) Then
- Key := #0;
- If (Key = '-') and (Length(Edit1.Text) <> 0) then
- Key := #0;
- If Key = '-' then
- Edit1.MaxLength := 3;
- if (Key = #08) and (Length(Edit1.Text) = 1) then
- Edit1.MaxLength := 2;
- if key = '.' then
- key := #0;
- end;
- procedure TForm1.Edit2Change(Sender: TObject);
- begin
- //N3.Enabled := False;
- 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
- Button2.Enabled := False
- else
- Button2.Enabled := True;
- end;
- procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
- begin
- If ((Key = #13) And (Button2.Enabled)) Then
- Button2.Click;
- If (Not(Key In ['0'..'9', #08, #46, '-'])) Then
- Key := #0;
- If (Key = '-') and (Length(Edit2.Text) <> 0) then
- Key := #0;
- If Key = '-' then
- Edit2.MaxLength := 3;
- if (Key = #08) and (Length(Edit2.Text) = 1) then
- Edit2.MaxLength := 2;
- if key = '.' then
- key := #0;
- end;
- procedure TForm1.Edit3Change(Sender: TObject);
- begin
- if Length(Edit3.Text) <> 0 then
- Button1.Enabled := True
- else
- Button1.Enabled := False;
- //N3.Enabled := False;
- end;
- procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
- begin
- if Key in ['0'..'2'] then
- key := #0;
- If ((Key = #13) And (Button1.Enabled)) Then
- Button1.Click;
- If (Not(Key In ['0'..'9', #08, #46])) Then
- Key := #0;
- end;
- procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- CanClose := MessageBox(Form1.Handle, 'Вы уверены, что хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION)=ID_YES;
- end;
- procedure TForm1.N4Click(Sender: TObject);
- begin
- Application.MessageBox('Программа вычисляет, входит ли точка, заданная двумя координатами, в многоугольник, заданный двумя координатами.'#13#10'Диапазон N (кол-ва сторон): 3..9'#13#10'Диапазон координат: -99..99', 'Инструкция', 0);
- end;
- procedure TForm1.N5Click(Sender: TObject);
- begin
- Application.MessageBox('Арефин Владислав гр.251004', 'Разрабочик', 0);
- end;
- procedure TForm1.N6Click(Sender: TObject);
- begin
- 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);
- end;
- Function Open (): String;
- Begin
- With Form1 Do
- Begin
- If OpenDialog1.Execute Then
- Begin
- Path := OpenDialog1.FileName;
- IsFileOpen := True;
- End
- Else
- IsFileOpen := False;
- End;
- Open := Path;
- End;
- function CheckN (N : String): Boolean;
- Const
- MIN = 3;
- MAX = 9;
- Var
- IsCorrect : Boolean;
- Temp : Integer;
- Begin
- IsCorrect := True;
- try
- Temp := StrToInt(N);
- except
- IsCorrect := False;
- MessageBox(Form1.Handle, Pchar('Не получилось считать количество вершин. Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
- end;
- If (IsCorrect And ((Temp > MAX) Or (Temp < MIN))) then
- Begin
- MessageBox(Form1.Handle, Pchar('Количество вершин вне разрешенного диапазона! Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
- IsCorrect := False;
- End;
- CheckN := IsCorrect;
- End;
- function TakeN (Var FileOutput: TextFile) : String;
- Var
- N : String;
- IsRight: Boolean;
- Begin
- IsRight := True;
- Try
- Readln(FileOutput, N);
- N := Trim (N);
- IsRight := CheckN(N);
- Except
- End;
- If(Not(IsRight)) Then
- TakeN := ''
- Else
- TakeN := N;
- End;
- function CheckCoordinates (Coordinates : String): Boolean;
- Var
- IsCorrect : Boolean;
- Temp, I : Integer;
- TempStr : String;
- Begin
- IsCorrect := True;
- I := 1;
- While (I <= Coordinates.Length) and (IsCorrect) Do
- Begin
- While (Coordinates[I] <> ' ') and (I <= Coordinates.Length) Do
- Begin
- TempStr := TempStr + Coordinates[I];
- Inc(I);
- End;
- If (Coordinates[I] = ' ') and (I <= Coordinates.Length) then
- Inc(I);
- try
- Temp := StrToInt(TempStr);
- except
- IsCorrect := False;
- MessageBox(Form1.Handle, Pchar('Не получилось считать координаты вершин. Проверьте корректность данных.'), 'Ошибка', MB_ICONSTOP);
- end;
- TempStr := '';
- End;
- CheckCoordinates := IsCorrect;
- End;
- function TakeCoordinates (Var FileOutput: TextFile) : String;
- Var
- Coordinates : String;
- IsRight: Boolean;
- Begin
- IsRight := True;
- Try
- Readln(FileOutput, Coordinates );
- Coordinates := Trim (Coordinates);
- IsRight := CheckCoordinates(Coordinates);
- Except
- End;
- If(Not(IsRight)) Then
- TakeCoordinates := ''
- Else
- TakeCoordinates := Coordinates;
- End;
- function TakeX (Var FileOutput: TextFile; Coordinates : String) : String;
- Var
- X : String;
- I : Integer;
- Const
- MIN = -99;
- MAX = 99;
- Begin
- I := 1;
- While Coordinates[I] <> ' ' Do
- Begin
- X := X + Coordinates[I];
- Inc(I);
- End;
- I := StrToInt(X);
- If (I < MIN) or (I > MAX) then
- Begin
- X := '';
- MessageBox(Form1.Handle, Pchar('Координата X выходят за границы допустимого значения. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
- End;
- TakeX := X;
- End;
- function TakeY (Var FileOutput: TextFile; Coordinates : String) : String;
- Var
- I : Integer;
- Const
- MIN = -99;
- MAX = 99;
- Begin
- I := 1;
- While Coordinates[I] <> ' ' Do
- Begin
- Coordinates[I] := ' ';
- Inc(I);
- End;
- Coordinates := Trim (Coordinates);
- I := StrToInt(Coordinates);
- If (I < MIN) or (I > MAX) then
- Begin
- Coordinates := '';
- MessageBox(Form1.Handle, Pchar('Координата Y выходят за границы допустимого значения. Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
- End;
- TakeY := Coordinates;
- End;
- procedure TForm1.N2Click(Sender: TObject);
- Var
- FileInput: TextFile;
- N, Coordinates, Text1, Text2 : String;
- I : Integer;
- IsCorrect : Boolean;
- begin
- Path := Open;
- AssignFile(FileInput, Path);
- Reset(FileInput);
- If(IsFileOpen) Then
- Begin
- N := TakeN(FileInput);
- End;
- If Not(N = '') then
- begin
- Edit3.Text := N;
- Button1Click(Sender);
- end;
- I := 0;
- IsCorrect := True;
- If N <> '' then
- begin
- While (I <= StrToInt(N)) and (IsCorrect) Do
- begin
- try
- Coordinates := TakeCoordinates(FileInput);
- Text1 := TakeX(FileInput, Coordinates);
- Edit1.Text := Text1;
- Text2 := TakeY(FileInput, Coordinates);
- Edit2.Text := Text2;
- If (Text1 = '') or (Text2 = '') then
- I := StrToInt(Text1); // это сделано специально, чтобы попасть на ветку except.
- Button2Click(Sender);
- Inc(I);
- except
- IsCorrect := False;
- MessageBox(Form1.Handle, Pchar('Из-за неверных исходных данных в файле программа будет перезапущена. Проверьте исходные данные.'), 'Перезапуск', MB_ICONSTOP);
- SHELLEXECUTE(0, 'Open', PWideChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
- CloseFile(FileInput);
- Application.Terminate;
- end;
- end;
- end;
- CloseFile(FileInput);
- end;
- procedure TForm1.N3Click(Sender: TObject);
- Var
- FileOutput: TextFile;
- IsCorrect : Boolean;
- begin
- IsCorrect := True;
- Path := Open;
- If (IsFileOpen) Then
- Begin
- try
- AssignFile(FileOutput, Path);
- Rewrite(FileOutput);
- Write(FileOutput, Result);
- except
- IsCorrect := False;
- Application.MessageBox('Запись в файл не удалась.', 'Ошибка', MB_ICONSTOP);
- end;
- if IsCorrect then
- Begin
- Application.MessageBox('Запись файла выполнена успешно.', 'Результат', 0);
- CloseFile(FileOutput);
- End;
- End;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement