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.ExtCtrls, Vcl.StdCtrls, Vcl.Menus,
- Vcl.ExtDlgs, Vcl.Imaging.pngimage, RegularExpressions, Vcl.Grids;
- type
- TMainForm = class(TForm)
- MainMenu: TMainMenu;
- FileTab: TMenuItem;
- InfoTab: TMenuItem;
- AboutTab: TMenuItem;
- OpenOption: TMenuItem;
- SaveOption: TMenuItem;
- TaskLabel: TLabel;
- InputNLabel: TLabel;
- InputNEdit: TEdit;
- ResultButton: TButton;
- OpenTextFileDialog: TOpenTextFileDialog;
- SaveTextFileDialog: TSaveTextFileDialog;
- Label1: TLabel;
- Label2: TLabel;
- StringGridResultElements: TStringGrid;
- ButtonUserElements: TButton;
- PopupMenu1: TPopupMenu;
- StringGridA: TStringGrid;
- procedure ResultButtonOnClick(Sender: TObject);
- procedure AboutDeveloperButton(Sender: TObject);
- // procedure InputNEditChange(Sender: TObject);
- // procedure InputYEditChange(Sender: TObject);
- procedure OpenOptionClick(Sender: TObject);
- // procedure InfoAboutProgramButton(Sender: TObject);
- // procedure InputXEditKeyDown(Sender: TObject; var Key: Char);
- // procedure InputYEditKeyDown(Sender: TObject; var Key: Char);
- procedure CloseButtonClick(Sender: TObject);
- procedure InfoAboutProgramButton(Sender: TObject);
- procedure SureCloseProgramButton(Sender: TObject;
- var CanClose: Boolean);
- procedure CheckCanSave;
- procedure SaveOptionClick(Sender: TObject);
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure InputNEditOnKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure ButtonUserElementsOnClick(Sender: TObject);
- procedure InputNEditChange(Sender: TObject);
- procedure StringGridUserElementsKeyPress(Sender: TObject;
- var Key: Char);
- procedure StringGridAOnKeyPress(Sender: TObject; var Key: Char);
- procedure StringGridAOnSetEditText(Sender: TObject; ACol, ARow: Integer;
- const Value: string);
- // Добавьте эту строку
- private
- { Private declarations }
- ResultObtained: Boolean;
- public
- { Public declarations }
- published
- end;
- type
- matriza = array [0 .. 100, 0 .. 100] of Double;
- var
- MainForm: TMainForm;
- a: matriza;
- implementation
- {$R *.dfm}
- procedure TMainForm.CloseButtonClick(Sender: TObject);
- begin
- if Sender is TForm then
- begin
- (Sender as TForm).Close;
- end;
- end;
- procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if (Key = VK_RETURN) and ResultButton.Enabled then
- begin
- ResultButton.Click; // Вызываем событие "нажатия" кнопки
- Key := 0;
- end;
- end;
- procedure TMainForm.CheckCanSave;
- begin
- // Проверяем, что поля не пусты и результат получен
- if (InputNEdit.Text <> '') and ResultButton.Enabled then
- SaveOption.Enabled := True
- else
- SaveOption.Enabled := False;
- end;
- procedure TMainForm.InfoAboutProgramButton(Sender: TObject);
- begin
- Application.MessageBox
- ('1. Введите количество элементов (больше 2) массива А соответсвующие поле.' + #13#10
- + '2. Заполните соответсвующие ячейки элементами массива А.' + #13#10 +
- '3. Нажмите кнопку Результат, и вы получите новый массив соответсвующий условию задания.'
- + #13#10 + 'Файл ввода данных должен выглядеть так:' + #13#10 + '3' +
- #13#10 + '3 4 5' + #13#10, 'Инструкция', MB_ICONINFORMATION or MB_OK);
- end;
- procedure TMainForm.InputNEditOnKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- var
- N: Integer;
- begin
- if Key = VK_RETURN then
- begin
- Key := 0; // Это предотвращает звуковой сигнал
- ButtonUserElements.Enabled := True; // Открываем ButtonUserElements
- ButtonUserElements.SetFocus;
- ButtonUserElements.Click;
- // Перенаправляем фокус на StringGridUserElements
- end;
- end;
- procedure TMainForm.InputNEditChange(Sender: TObject);
- var
- N, i: Integer;
- begin
- if InputNEdit.Text <> '' then // Проверяем, не пустая ли строка
- begin
- N := StrToInt(InputNEdit.Text); // Получаем количество элементов
- StringGridA.ColCount := N; // Устанавливаем количество столбцов в StringGridUserElements
- end;
- ButtonUserElements.Enabled := (InputNEdit.Text <> '');
- end;
- procedure TMainForm.StringGridAOnKeyPress(Sender: TObject; var Key: Char);
- begin
- if not(Key in ['0' .. '9', ',', '.', '-', #8, #13]) then
- Key := #0;
- end;
- procedure TMainForm.StringGridAOnSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
- var
- i, N: Integer;
- flag: Boolean;
- MaxLength: Integer;
- begin
- ACol := StringGridA.Col; // Get the current column
- ARow := StringGridA.Row;
- if (Value <> '') and (Value[1] = '0') then
- Begin
- StringGridA.Cells[ACol, ARow] := Copy(Value, 2, Length(Value) - 1);
- End;
- MaxLength := 10; // Установите максимальную длину ввода
- if Length(Value) > MaxLength then
- StringGridA.Cells[ACol, ARow] := Copy(Value, 1, MaxLength);
- N := StrToInt(InputNEdit.Text); // Получаем количество элементов
- // Проверка на заполненность таблицы
- flag := True; // Инициализируем флаг как True
- for i := 0 to N - 1 do
- begin
- if StringGridA.Cells[i, 0] = '' then // Если ячейка пустая
- begin
- flag := False; // Устанавливаем флаг как False
- Break; // Выходим из цикла
- end;
- end;
- // Установка свойства Enabled кнопки ResultButton
- if flag then // Если флаг истинный
- begin
- ResultButton.Enabled := True; // Делаем кнопку доступной
- // StringGridB.SetFocus;
- end
- else // Если флаг ложный
- ResultButton.Enabled := False; // Делаем кнопку недоступной
- end;
- procedure TMainForm.StringGridUserElementsKeyPress(Sender: TObject;
- var Key: Char);
- begin
- if not(Key in ['0' .. '9', ',', '.', '-', #8, #13]) then
- Key := #0;
- end;
- procedure TMainForm.ButtonUserElementsOnClick(Sender: TObject);
- var
- N: Integer;
- i: Integer;
- flag: Boolean;
- begin
- if InputNEdit.Text <> '' then // Если InputNEdit не пустое
- begin
- N := StrToInt(InputNEdit.Text); // Преобразуем текст в число
- if N > 2 then // Проверяем условие N > 2
- begin
- StringGridA.ColCount := N;
- // Устанавливаем количество столбцов в StringGridUserElements
- StringGridA.Enabled := True;
- // Открываем StringGridUserElements
- end
- else
- begin
- ShowMessage('Значение N должно быть больше 2.'); // Выводим сообщение об ошибке
- Exit;
- end;
- end;
- StringGridA.SetFocus;
- end;
- procedure TMainForm.ResultButtonOnClick(Sender: TObject);
- var
- i, N: Integer;
- sum: Double;
- begin
- N := StrToInt(InputNEdit.Text);
- sum := 0;
- StringGridResultElements.ColCount := N - 2; // Уменьшаем количество столбцов на 2
- for i := 0 to N - 3 do // Изменяем диапазон цикла
- begin
- try
- sum := (StrToFloat(StringGridA.Cells[i, 0]) + StrToFloat(StringGridA.Cells[i + 1, 0]) +
- StrToFloat(StringGridA.Cells[i + 2, 0])) / 3;
- StringGridResultElements.Cells[i, 0] := FormatFloat('0.00', sum);
- SaveOption.Enabled := True;
- except
- on E: Exception do
- begin
- Application.MessageBox(PChar('Неверный ввод в ' + IntToStr(i + 1) + ' ячейке.'), 'Ошибка',
- MB_ICONERROR or MB_OK);
- Exit;
- end;
- end;
- end;
- if StringGridResultElements.ColCount > 0 then
- begin
- if MessageDlg('Вы хотите сохранить текущие результаты?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
- begin
- SaveOptionClick(Sender);
- end;
- end;
- end;
- procedure TMainForm.SaveOptionClick(Sender: TObject);
- var
- FileLines: TStringList;
- N: Integer;
- i: Integer;
- Value: Double;
- begin
- // Устанавливаем имя файла и расширение по умолчанию
- SaveTextFileDialog.FileName := 'output.txt';
- SaveTextFileDialog.Filter := 'Текстовые файлы|*.txt|Все файлы|*.*';
- if SaveTextFileDialog.Execute(Self.Handle) then
- begin
- // Создаем TStringList для хранения строк
- FileLines := TStringList.Create;
- try
- N := StrToInt(InputNEdit.Text);
- FileLines.Add('Длина массива: ' + IntToStr(N));
- FileLines.Add('Массив:');
- for i := 0 to N - 1 do
- begin
- Value := StrToFloat(StringGridA.Cells[i, 0]);
- FileLines.Add('Элемент ' + IntToStr(i + 1) + ': ' + FloatToStr(Value));
- end;
- FileLines.Add('Итоговый массив:');
- for i := 0 to N - 3 do
- begin
- Value := StrToFloat(StringGridResultElements.Cells[i, 0]);
- FileLines.Add('Элемент ' + IntToStr(i + 1) + ': ' + FloatToStr(Value));
- end;
- // Сохраняем строки в файл
- FileLines.SaveToFile(SaveTextFileDialog.FileName);
- finally
- FileLines.Free;
- end;
- end;
- end;
- procedure TMainForm.OpenOptionClick(Sender: TObject);
- var
- Encoding: TEncoding;
- FileName: String;
- FileLines: TStringList;
- N: Integer;
- P: String;
- Data1: TArray<String>;
- begin
- OpenTextFileDialog.Filter := 'Текстовые файлы|*.txt|Все файлы|*.*';
- if OpenTextFileDialog.Execute(Self.Handle) then
- begin
- FileName := OpenTextFileDialog.FileName;
- Encoding := OpenTextFileDialog.Encodings.Objects
- [OpenTextFileDialog.EncodingIndex] as TEncoding;
- try
- FileLines := TStringList.Create;
- FileLines.LoadFromFile(FileName, Encoding);
- if FileLines.Count <> 2 then
- raise Exception.Create('Файл должен содержать ровно 2 строки');
- if not TryStrToInt(FileLines[0], N) then
- raise Exception.Create('Первая строка должна быть числом');
- Data1 := FileLines[1].Split([' ']);
- if Length(Data1) <> N then
- raise Exception.Create
- ('Вторая строка должна содержать N элементов, разделенных пробелами');
- StringGridA.ColCount := N;
- for var i := 0 to N - 1 do
- begin
- StringGridA.Cells[i, 0] := Data1[i];
- end;
- InputNEdit.Text := IntToStr(N);
- ResultButton.Click;
- // SaveOptionClick(Sender);
- finally
- FileLines.Free;
- end;
- end;
- end;
- procedure TMainForm.SureCloseProgramButton(Sender: TObject;
- var CanClose: Boolean);
- begin
- CanClose := MessageBox(0, 'Вы действительно хотите выйти?', 'Выход',
- MB_ICONQUESTION + MB_YESNO) = IDYES;
- end;
- procedure TMainForm.AboutDeveloperButton(Sender: TObject);
- begin
- Application.MessageBox
- ('Выполнила студентка группы 351003 Пулиш Виктория Александровна',
- 'О разработчике', MB_ICONINFORMATION or MB_OK);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement