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,
- Clipbrd,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.StdCtrls,
- Vcl.NumberBox,
- Vcl.ComCtrls,
- Vcl.Grids,
- Vcl.Imaging.Pngimage,
- Vcl.ExtCtrls,
- Vcl.Menus;
- Type
- TMain = Class(TForm)
- UpDown1: TUpDown;
- Edit1: TEdit;
- StringGrid1: TStringGrid;
- Memo1: TMemo;
- Button1: TButton;
- BalloonHint1: TBalloonHint;
- MainMenu1: TMainMenu;
- N1: TMenuItem;
- N2: TMenuItem;
- N3: TMenuItem;
- N4: TMenuItem;
- N5: TMenuItem;
- OpenDialog1: TOpenDialog;
- SaveDialog1: TSaveDialog;
- Label1: TLabel;
- Label2: TLabel;
- Edit2: TEdit;
- UpDown2: TUpDown;
- Procedure FormActivate(Sender: TObject);
- Procedure StringGrid1KeyPress(Sender: TObject; Var Key: Char);
- Procedure Edit1Change(Sender: TObject);
- Procedure Checker(Var IsCorrect: Boolean);
- Procedure GetPath(Var Path: String);
- Procedure N4Click(Sender: TObject);
- Procedure N5Click(Sender: TObject);
- Procedure N1Click(Sender: TObject);
- Procedure N2Click(Sender: TObject);
- Procedure N3Click(Sender: TObject);
- Procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
- Procedure StringGrid1Resize();
- Procedure StringGrid1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
- Var MouseActivate: TMouseActivate);
- Procedure StringGrid1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
- Procedure Edit1KeyPress(Sender: TObject; Var Key: Char);
- Procedure Edit1ContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
- Procedure Edit1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
- Var MouseActivate: TMouseActivate);
- Procedure Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
- Procedure Button1Click(Sender: TObject);
- procedure Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure Edit2KeyPress(Sender: TObject; var Key: Char);
- procedure Edit2MouseActivate(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y, HitTest: Integer;
- var MouseActivate: TMouseActivate);
- procedure Edit2Change(Sender: TObject);
- Private
- iscorrect: boolean;
- { Private declarations }
- Public
- { Public declarations }
- End;
- Const
- E: Double = 1.0E-3;
- NumSet = ['1', '2', '3', '4', '5', '6', '7', '8', '9', #8, #44, #45, #46];
- Var
- Main: TMain;
- Implementation
- {$R *.dfm}
- Uses
- Instruction,
- Information;
- type
- TArray = array of array of Integer;
- function SearchForGoodStudents(Arr: TArray): Integer;
- var
- Rows, EightGradeCounter, SixGradeCounter, CheckGradeCounter, Sum, I, J: Integer;
- begin
- Sum := 0;
- for I := 0 to High(Arr) do
- begin
- EightGradeCounter := 0;
- SixGradeCounter := 0;
- CheckGradeCounter := 0;
- for J := 0 to High(Arr[I]) do
- begin
- if (Arr[I][J] > 5) then
- Inc(SixGradeCounter);
- if (Arr[I][J] <= 8) then
- Inc(EightGradeCounter);
- if (Arr[I][J] <= 5) then
- Inc(CheckGradeCounter);
- end;
- if (SixGradeCounter > 0) and (EightGradeCounter > 0) and (CheckGradeCounter = 0) then
- Inc(Sum);
- end;
- Result := Sum;
- end;
- procedure TMain.Button1Click(Sender: TObject);
- var
- Cols, I, J: Integer;
- Matrix: TArray;
- GoodStudentsCount: Integer;
- begin
- Checker(IsCorrect);
- try
- Cols := StrToInt(Edit1.Text);
- except
- Cols := 1;
- end;
- SetLength(Matrix, Cols);
- for I := 0 to Cols - 1 do
- begin
- SetLength(Matrix[I], StringGrid1.ColCount);
- for J := 0 to StringGrid1.ColCount - 1 do
- begin
- Matrix[I][J] := StrToInt(StringGrid1.Cells[J, I]);
- if Matrix[I][J] = 0 then
- begin
- ShowMessage('Найдена пустая ячейка');
- Abort;
- end;
- if (Matrix[I][J] < 0) or (Matrix[I][J] > 10) then
- begin
- ShowMessage('Ошибка!');
- Abort;
- end;
- end;
- end;
- if IsCorrect then
- begin
- GoodStudentsCount := SearchForGoodStudents(Matrix);
- Memo1.Lines.Clear;
- Memo1.Lines.Add(Format('Количество хорошистов: %d', [GoodStudentsCount]));
- end
- else
- ShowMessage('Заполните все поля');
- end;
- Procedure TMain.Checker(Var IsCorrect: Boolean);
- Var
- Length, I: Integer;
- Begin
- Try
- Length := StrToInt(Edit1.Text);
- IsCorrect := True;
- Except
- Length := 0;
- IsCorrect := False;
- End;
- Dec(Length);
- For I := 0 To Length Do
- Begin
- If (StringGrid1.Cells[I, 0] = '') Or (StringGrid1.Cells[I, 0] = '-') Then
- Begin
- IsCorrect := False;
- End;
- End;
- End;
- Procedure TMain.GetPath(Var Path: String);
- Begin
- If OpenDialog1.Execute Then
- Begin
- Path := OpenDialog1.FileName;
- End
- Else
- Begin
- ShowMessage('Открытие файла отменено.');
- End;
- End;
- Procedure TMain.N1Click(Sender: TObject);
- Begin
- If Memo1.Lines.Count = 0 Then
- Begin
- N5.Enabled := False;
- End
- Else
- Begin
- N5.Enabled := True;
- End;
- End;
- Procedure TMain.N2Click(Sender: TObject);
- Begin
- Instruction.InstructionForm.ShowModal;
- End;
- Procedure TMain.N3Click(Sender: TObject);
- Begin
- Information.InformationForm.ShowModal;
- End;
- procedure TMain.N4Click(Sender: TObject);
- var
- IsCorrect, Fail: Boolean;
- Path: String;
- FileElem: TextFile;
- I, Count: Integer;
- Str: String;
- Values: TStringList;
- begin
- GetPath(Path);
- AssignFile(FileElem, Path);
- IsCorrect := True;
- Fail := False;
- if Path = '' then
- IsCorrect := False;
- if IsCorrect then
- begin
- try
- Reset(FileElem);
- ShowMessage('Файл успешно открыт.');
- except
- on E: EInOutError do
- begin
- if E.ErrorCode = 103 then
- begin
- IsCorrect := False;
- ShowMessage('Ошибка I/O (код 103): Файл занят или недоступен.' + #13#10 + 'Проверьте файл и повторите попытку');
- end
- else
- begin
- IsCorrect := False;
- ShowMessage('Ошибка I/O: ' + E.Message);
- if E.Message = 'I/O error 32' then
- ShowMessage('Файл используется в нескольких процессах' + #13#10 + 'Проверьте файл и повторите попытку');
- end;
- end;
- on E: Exception do
- begin
- ShowMessage('Ошибка: ' + E.Message + #13#10 + 'Проверьте файл и повторите попытку');
- IsCorrect := False;
- end;
- end;
- if IsCorrect then
- begin
- try
- Count := 0;
- while not Eof(FileElem) do
- begin
- ReadLn(FileElem, Str);
- Inc(Count);
- end;
- CloseFile(FileElem);
- if not Fail then
- begin
- Reset(FileElem);
- StringGrid1.RowCount := Count;
- Values := TStringList.Create;
- try
- for I := 0 to Count - 1 do
- begin
- ReadLn(FileElem, Str);
- Values.DelimitedText := Str;
- if Values.Count > StringGrid1.ColCount then
- StringGrid1.ColCount := Values.Count; // Увеличиваем количество столбцов, если необходимо
- for var J := 0 to Values.Count - 1 do
- StringGrid1.Cells[J, I] := Values[J]; // Записываем значение в соответствующую ячейку
- end;
- finally
- Values.Free;
- end;
- CloseFile(FileElem);
- end;
- if not Fail then
- ShowMessage('Открытие завершено.')
- else
- ShowMessage('Некорректные данные файла! Проверьте данные и повторите попытку.');
- except
- CloseFile(FileElem);
- IsCorrect := False;
- ShowMessage('Ошибка открытия файла.');
- end;
- end;
- end;
- end;
- Procedure TMain.StringGrid1Resize();
- Var
- NewRowCount, NewColCount, I, J: Integer;
- Begin
- Try
- NewRowCount := StrToInt(Edit1.Text);
- Except
- NewRowCount := 1;
- End;
- For I := 0 To 10 Do
- If I >= NewRowCount Then
- Begin
- StringGrid1.Cells[I, 0] := '';
- End;
- End;
- Procedure TMain.N5Click(Sender: TObject);
- Begin
- If SaveDialog1.Execute Then
- Begin
- Memo1.Lines.SaveToFile(SaveDialog1.FileName);
- End
- Else
- Begin
- ShowMessage('Сохранение в файл отменено.');
- End;
- End;
- Procedure TMain.Edit1Change(Sender: TObject);
- Begin
- If Edit1.Text = '' Then
- Begin
- StringGrid1.ColCount := 1;
- End
- Else
- Begin
- StringGrid1.ColCount := StrToInt(Edit1.Text);
- End;
- StringGrid1Resize
- End;
- Procedure TMain.Edit1ContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
- Begin
- Handled := True;
- End;
- Procedure TMain.Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
- Begin
- Clipboard.Clear;
- End;
- Procedure TMain.Edit1KeyPress(Sender: TObject; Var Key: Char);
- Begin
- //Проверяем, является ли введенный символ цифрой
- If Not(Key In ['1' .. '9', #8]) Then
- Begin
- BalloonHint1.Title := 'Недопустимый символ.';
- BalloonHint1.Description := 'Введите число от 1 до 9.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(Edit1);
- Key := #0;
- End;
- End;
- Procedure TMain.Edit1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
- Var MouseActivate: TMouseActivate);
- Begin
- Clipboard.Clear;
- End;
- Procedure TMain.Edit2Change(Sender: TObject);
- Begin
- If Edit2.Text = '' Then
- Begin
- StringGrid1.RowCount := 1;
- End
- Else
- Begin
- StringGrid1.RowCount := StrToInt(Edit2.Text);
- End;
- StringGrid1Resize
- End;
- procedure TMain.Edit2KeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- Clipboard.Clear;
- end;
- procedure TMain.Edit2KeyPress(Sender: TObject; var Key: Char);
- begin
- //Проверяем, является ли введенный символ цифрой
- If Not(Key In ['1' .. '9', #8]) Then
- Begin
- BalloonHint1.Title := 'Недопустимый символ.';
- BalloonHint1.Description := 'Введите число от 1 до 9.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(Edit1);
- Key := #0;
- End;
- end;
- procedure TMain.Edit2MouseActivate(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y, HitTest: Integer;
- var MouseActivate: TMouseActivate);
- begin
- Clipboard.Clear;
- end;
- Procedure TMain.FormActivate(Sender: TObject);
- Begin
- UpDown1.Associate := Edit1;
- UpDown1.Max := 10;
- UpDown1.Min := 1;
- UpDown2.Associate := Edit2;
- UpDown2.Max := 10;
- UpDown2.Min := 1;
- End;
- Procedure TMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
- Var
- Confirmation: Integer;
- Begin
- Confirmation := Application.MessageBox('Вы уверены, что хотите выйти?', 'Выход', MB_YESNO);
- CanClose := Confirmation = IDYES;
- End;
- Procedure TMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- Var
- Rows, Cols, I, J: Integer;
- Begin
- Try
- Cols := StrToInt(Edit1.Text);
- Except
- Cols := 1;
- End;
- Rows := 1;
- For I := 0 To Rows - 1 Do
- Begin
- For J := 0 To Cols - 1 Do
- If (StringGrid1.Cells[J, I] <> '') Then
- Button1.Enabled := True
- Else
- Button1.Enabled := False;
- End;
- End;
- Procedure TMain.StringGrid1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
- Begin
- Clipboard.Clear;
- End;
- Procedure TMain.StringGrid1KeyPress(Sender: TObject; Var Key: Char);
- Var
- C, R: Integer;
- CellValue: String;
- Num: Integer;
- Begin
- C := (Sender As TStringGrid).Col;
- R := (Sender As TStringGrid).Row;
- CellValue := StringGrid1.Cells[C, R];
- If Not(Key In ['0' .. '9', '-', #8]) Then
- Begin
- BalloonHint1.Title := 'Недопустимый символ.';
- BalloonHint1.Description := 'Здесь можно ввести только целое число.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(StringGrid1);
- Key := #0;
- End
- Else
- If (Key = '-') And (CellValue.IndexOf('-') >= 0) Then
- Begin
- BalloonHint1.Title := 'Недопустимый символ.';
- BalloonHint1.Description := 'Минус уже присутствует в числе.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(StringGrid1);
- Key := #0;
- End
- Else
- If TryStrToInt(CellValue + Key, Num) Then
- Begin
- If (Num < 1) Or (Num > 10) Then
- Begin
- BalloonHint1.Title := 'Ограничение диапазона.';
- BalloonHint1.Description := 'Допустимые значения от 1 до 10.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(StringGrid1);
- Key := #0;
- End;
- End
- Else
- If Key = '.' Then
- Begin
- BalloonHint1.Title := 'Недопустимый символ.';
- BalloonHint1.Description := 'Дробные числа не разрешены.';
- BalloonHint1.ImageIndex := 1;
- BalloonHint1.ShowHint(StringGrid1);
- Key := #0;
- End;
- End;
- Procedure TMain.StringGrid1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
- Var MouseActivate: TMouseActivate);
- Begin
- Clipboard.Clear;
- End;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement