Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit F_1_1;
- interface
- uses
- Math, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.Grids;
- type
- TMyForm = class(TForm)
- btShowResult: TButton;
- MainMenu: TMainMenu;
- FileMenu: TMenuItem;
- OpenMenu: TMenuItem;
- SaveMenu: TMenuItem;
- N1: TMenuItem;
- AboutMenu: TMenuItem;
- OpenFile: TOpenDialog;
- SaveFile: TSaveDialog;
- PopupMenu: TPopupMenu;
- TaskMenu: TMenuItem;
- edArrSize: TEdit;
- lbArrSize: TLabel;
- sgArrayA: TStringGrid;
- lbArrayA: TLabel;
- sgArrayB: TStringGrid;
- lbArrayB: TLabel;
- sgNewArrayA: TStringGrid;
- lbNewArrayA: TLabel;
- sgNewArrayB: TStringGrid;
- lbNewArrayB: TLabel;
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure OpenMenuClick(Sender: TObject);
- procedure SaveMenuClick(Sender: TObject);
- procedure AboutMenuClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure TaskMenuClick(Sender: TObject);
- function IsValidInput(Acontrol: TEdit; Key: Char): Boolean;
- procedure OnEdit(Sender: TObject);
- procedure edArrSizeKeyPress(Sender: TObject; var Key: Char);
- procedure edArrSizeChange(Sender: TObject);
- procedure FillHeadlines(Table: TStringGrid);
- procedure SetSize(Table: TStringGrid);
- procedure sgArrayAKeyPress(Sender: TObject; var Key: Char);
- function IsValidInputSG(Acontrol: TStringGrid; Key: Char): Boolean;
- function NotEmptyTable(Table: TStringGrid): Boolean;
- procedure sgArrayBKeyPress(Sender: TObject; var Key: Char);
- procedure sgArrayAKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure sgArrayBKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure btShowResultClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- var
- IsFilledArrA, IsFilledArrB: Boolean;
- end;
- var
- MyForm: TMyForm;
- implementation
- {$R *.dfm}
- procedure TMyForm.FormCreate(Sender: TObject);
- begin
- IsFilledArrA := False;
- IsFilledArrB := False;
- btShowResult.Caption := 'Показать' + #10#13 + 'результат';
- sgArrayA.Cells[0, 0] := '[1]';
- sgArrayB.Cells[0, 0] := '[1]';
- end;
- procedure TMyForm.SetSize(Table: TStringGrid);
- var
- Column: Integer;
- begin
- Column := Table.ColCount;
- if Column < 5 then
- begin
- Table.Width := 65 * Column + 3;
- Table.ScrollBars := ssNone;
- Table.Height := 52;
- end
- else
- begin
- Table.Width := 264;
- Table.ScrollBars := ssHorizontal;
- Table.Height := 70;
- end;
- end;
- procedure TMyForm.FillHeadlines(Table: TStringGrid);
- var
- i, Len: Integer;
- begin
- Len := Table.ColCount - 1;
- with Table do
- for i := 0 to Len do
- Cells[i, 0] := Format('[%d]', [i + 1]);
- end;
- function TMyForm.NotEmptyTable(Table: TStringGrid): Boolean;
- var
- i, Len: Integer;
- IsValidInput: Boolean;
- begin
- Len := Table.ColCount - 1;
- IsValidInput := True;
- with Table do
- for i := 0 to Len do
- if Cells[i, 1] = '' then
- IsValidInput := False;
- NotEmptyTable := IsValidInput;
- end;
- function CheckSize(Text: string; Symbol: Char): Boolean;
- const
- Digits = ['0'..'9'];
- MinSize = 1;
- MaxSize = 30;
- var
- IsValidInput: Boolean;
- InputText: Integer;
- begin
- IsValidInput := True;
- if Symbol in Digits then
- begin
- InputText := StrToInt(Text + Symbol);
- if (InputText > MaxSize) or (InputText <= MinSize) then
- IsValidInput := False;
- end
- else
- IsValidInput := True;
- CheckSize := IsValidInput;
- end;
- function CheckSGSize(Text: string; Symbol: Char): Boolean;
- const
- Digits = ['0'..'9'];
- MinSize = -100000;
- MaxSize = 100000;
- var
- IsValidInput: Boolean;
- InputText, Len: Integer;
- begin
- IsValidInput := True;
- if Symbol in Digits then
- begin
- Len := Length(Text + Symbol);
- InputText := StrToInt(Text + Symbol);
- if (InputText > MaxSize) or (InputText < MinSize) or (Len > 6) then
- IsValidInput := False;
- end;
- CheckSGSize := IsValidInput;
- end;
- function TMyForm.IsValidInput(Acontrol: TEdit; Key: Char): Boolean;
- const
- ValidInput = ['0'..'9', #8];
- var
- IsValidKey: Boolean;
- begin
- IsValidKey := False;
- if Key in ValidInput then
- if not CheckSize(Acontrol.Text, Key) then
- begin
- IsValidKey := False;
- MessageBox(Handle, PChar('Допустимы значения от 2 до 30'),
- PChar('Ошибка!'), MB_ICONINFORMATION + MB_OK)
- end
- else
- IsValidKey := True;
- IsValidInput := IsValidKey;
- end;
- function TMyForm.IsValidInputSG(Acontrol: TStringGrid; Key: Char): Boolean;
- const
- ValidInput = ['0'..'9', #8];
- var
- IsValidKey: Boolean;
- begin
- IsValidKey := False;
- if Key = '-' then
- begin
- if Length(Acontrol.Cells[Acontrol.Col, Acontrol.Row]) = 0 then
- IsValidKey := True
- end
- else
- if Key in ValidInput then
- if not CheckSGSize(Acontrol.Cells[Acontrol.Col, Acontrol.Row], Key) then
- begin
- IsValidKey := False;
- MessageBox(Handle, PChar('Допустимы значения от -100000 до 100000'),
- PChar('Ошибка!'), MB_ICONINFORMATION + MB_OK)
- end
- else
- IsValidKey := True;
- IsValidInputSG := IsValidKey;
- end;
- procedure TMyForm.OnEdit(Sender: TObject);
- begin
- btShowResult.Enabled := False;
- SaveMenu.Enabled := False;
- lbNewArrayA.Visible := False;
- sgNewArrayA.Visible := False;
- lbNewArrayB.Visible := False;
- sgNewArrayB.Visible := False;
- end;
- procedure TMyForm.btShowResultClick(Sender: TObject);
- var
- i, Len: Integer;
- A, B: array of Integer;
- begin
- Len := sgArrayA.ColCount;
- SetLength(A, Len);
- SetLength(B, Len);
- sgNewArrayA.ColCount := Len;
- sgNewArrayB.ColCount := Len;
- Dec(Len);
- with sgArrayA do
- for i := 0 to Len do
- A[i] := StrToInt(Cells[i, 1]);
- with sgArrayB do
- for i := 0 to Len do
- B[i] := StrToInt(Cells[i, 1]);
- SetSize(sgNewArrayA);
- SetSize(sgNewArrayB);
- FillHeadlines(sgNewArrayA);
- FillHeadlines(sgNewArrayB);
- lbNewArrayA.Visible := True;
- sgNewArrayA.Visible := True;
- lbNewArrayB.Visible := True;
- sgNewArrayB.Visible := True;
- with sgNewArrayA do
- for i := 0 to Len do
- Cells[i, 1] := IntToStr(A[i] + B[i]);
- with sgNewArrayB do
- for i := 0 to Len do
- Cells[i, 1] := IntToStr(A[i] - B[i]);
- SaveMenu.Enabled := True;
- end;
- procedure TMyForm.edArrSizeChange(Sender: TObject);
- begin
- OnEdit(Sender);
- if edArrSize.Text <> '' then
- begin
- sgArrayA.ColCount := StrToInt(edArrSize.Text);
- sgArrayB.ColCount := StrToInt(edArrSize.Text);
- sgArrayA.Enabled := True;
- sgArrayB.Enabled := True;
- SetSize(sgArrayA);
- SetSize(sgArrayB);
- FillHeadlines(sgArrayA);
- FillHeadlines(sgArrayB);
- end
- else
- begin
- sgArrayA.Enabled := False;
- sgArrayB.Enabled := False;
- sgArrayA.Rows[1].Clear;
- sgArrayB.Rows[1].Clear;
- end;
- end;
- procedure TMyForm.edArrSizeKeyPress(Sender: TObject; var Key: Char);
- begin
- if not IsValidInput(edArrSize, Key) then
- Key := #0;
- end;
- procedure TMyForm.sgArrayAKeyPress(Sender: TObject; var Key: Char);
- begin
- if not IsValidInputSG(sgArrayA, Key) then
- Key := #0;
- end;
- procedure TMyForm.sgArrayAKeyUp(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- OnEdit(Sender);
- IsFilledArrA := NotEmptyTable(sgArrayA);
- if IsFilledArrA and IsFilledArrB then
- btShowResult.Enabled := True;
- end;
- procedure TMyForm.sgArrayBKeyUp(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- OnEdit(Sender);
- IsFilledArrB := NotEmptyTable(sgArrayB);
- if IsFilledArrA and IsFilledArrB then
- btShowResult.Enabled := True;
- end;
- procedure TMyForm.sgArrayBKeyPress(Sender: TObject; var Key: Char);
- begin
- if not IsValidInputSG(sgArrayA, Key) then
- Key := #0;
- end;
- procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- if MessageBox(Handle, PChar('Вы уверены?'), PChar('Выйти?'), MB_ICONSTOP +
- MB_YESNO + MB_DEFBUTTON2) = mrNo then
- Action := TCloseAction.caNone;
- end;
- procedure TMyForm.AboutMenuClick(Sender: TObject);
- begin
- MessageBox(Handle, PChar('Автор этой программы Трапашко Илья (851001)'),
- PChar('Автор'), MB_ICONINFORMATION + MB_OK);
- end;
- procedure TMyForm.TaskMenuClick(Sender: TObject);
- begin
- MessageBox(Handle, PChar('Данная программа получает новые массивы, элементы которых вычисляются по правилу: a(i)=a(i)+b(i), b(i)=a(i)-b(i)'),
- PChar('О программе'), MB_ICONINFORMATION + MB_OK);
- end;
- function SafeRead(var MyFile: TextFile; var Number: Integer): Boolean;
- const
- MaxSize = 100000;
- MinSize = -100000;
- begin
- try
- Read(MyFile, Number);
- if (Number <= MaxSize) and (Number >= MinSize) then
- SafeRead := True
- else
- SafeRead := False;
- except
- SafeRead := False;
- end;
- end;
- function CountNumbers(Line: string): Integer;
- var
- k, Counter: Integer;
- begin
- Line := Line + ' ';
- Counter := 0;
- for k := 2 to length(Line) do
- if (Line[k] = ' ') and (Line[k - 1] <> ' ') then
- Inc(Counter);
- if Counter > 1 then
- CountNumbers := Counter
- else
- CountNumbers := -1;
- end;
- procedure TMyForm.OpenMenuClick(Sender: TObject);
- var
- InputFile: TextFile;
- Temp, FirstLen, Secondlen, i: Integer;
- IsValidInput: Boolean;
- Line: string;
- begin
- if OpenFile.Execute then
- begin
- OnEdit(Sender);
- try
- AssignFile(InputFile, OpenFile.FileName);
- Reset(InputFile);
- if SeekEof(inputFile) then
- MessageDlg('Похоже, файл пустой. Повторите попытку', mtError, [mbOk], 0)
- else
- begin
- IsValidInput := True;
- Readln(InputFile, Line);
- FirstLen := CountNumbers(Line);
- Read(InputFile, Line);
- SecondLen := CountNumbers(Line);
- if FirstLen = SecondLen then
- begin
- Reset(InputFile);
- while not Eoln(InputFile) and IsValidInput do
- IsValidInput := SafeRead(InputFile, Temp);
- if IsValidInput then
- begin
- Readln(InputFile);
- while not Eoln(InputFile) and IsValidInput do
- IsValidInput := SafeRead(InputFile, Temp);
- if IsValidInput then
- begin
- sgArrayA.Enabled := True;
- sgArrayB.Enabled := True;
- Reset(InputFile);
- edArrSize.Text := IntToStr(FirstLen);
- Dec(FirstLen);
- with sgArrayA do
- for i := 0 to FirstLen do
- begin
- Read(InputFile, Temp);
- Cells[i, 1] := IntToStr(Temp);
- end;
- Readln(InputFile);
- with sgArrayB do
- for i := 0 to FirstLen do
- begin
- Read(InputFile, Temp);
- Cells[i, 1] := IntToStr(Temp);
- end;
- btShowResult.Enabled := True;
- SaveMenu.Enabled := True;
- end
- else
- MessageDlg('Ошибка ввода данных. Для числителя и знаменателя'
- + #10#13 + 'допустимы значения, в промежутке от -100000 до 10000', mtError, [mbOk], 0);
- end
- else
- MessageDlg('Ошибка ввода данных. Для числителя и знаменателя'
- + #10#13 + 'допустимы значения, в промежутке от -100000 до 10000', mtError, [mbOk], 0);
- end
- else
- MessageDlg('Ошибка ввода данных. Массивы должны иметь одинаковое количество элементов', mtError, [mbOk], 0);
- CloseFile(InputFile);
- end;
- except
- MessageDlg('Ошибка ввода данных. Повторите попытку', mtError, [mbOk], 0);
- CloseFile(InputFile);
- end;
- end;
- end;
- function CheckFileName(MyFile: string): string;
- var
- IsValidInput: boolean;
- begin
- IsValidInput := False;
- if AnsiCompareStr(Copy(MyFile, Length(MyFile) - 3, 4), '.txt') <> 0 then
- MyFile := MyFile + '.txt';
- CheckFileName := MyFile;
- end;
- procedure TMyForm.SaveMenuClick(Sender: TObject);
- var
- OutputFile: TextFile;
- i, Len: Integer;
- MyFile: string;
- begin
- if SaveFile.Execute then
- begin
- MyFile := SaveFile.FileName;
- MyFile := CheckFileName(MyFile);
- if FileExists(MyFile) then
- begin
- if MessageDlg('Перезаписать файл?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
- begin
- AssignFile(outputFile, MyFile);
- Rewrite(OutputFile);
- Len := sgNewArrayA.ColCount;
- with sgNewArrayA do
- for i := 0 to Len do
- Write(OutputFile, Cells[i, 1], ' ');
- Writeln(OutputFile);
- with sgNewArrayB do
- for i := 0 to Len do
- Write(OutputFile, Cells[i, 1], ' ');
- CloseFile(outputFile);
- end
- else
- SaveMenuClick(Sender);
- end
- else
- begin
- AssignFile(outputFile, MyFile);
- Rewrite(OutputFile);
- Len := sgNewArrayA.ColCount;
- with sgNewArrayA do
- for i := 0 to Len do
- Write(OutputFile, Cells[i, 1], ' ');
- Writeln(OutputFile);
- with sgNewArrayB do
- for i := 0 to Len do
- Write(OutputFile, Cells[i, 1], ' ');
- CloseFile(outputFile);
- end;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement