Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Unit BackUnit;
- Interface
- Uses
- SysUtils,
- LinkedListUnit;
- Type
- ERRORS_CODE = (SUCCESS, INCORRECT_DATA_FILE, A_LOT_OF_DATA_FILE,
- OUT_OF_BORDER, OUT_OF_BORDER_SIZE);
- IntArr = Array Of Integer;
- Matrix = Array Of IntArr;
- TFileStatus = (FsGood, FsNotFound, FsNotTxt, FsNotReadable, FsNotWritable,
- FsEmpty, FsWrongData, FsUnexpected);
- TArrayOfMessages = Array [TFileStatus] Of PWideChar;
- Const
- DIGITS = ['0' .. '9'];
- VOID = #0;
- BACKSPACE = #8;
- MAX_NUMB = 100000;
- MIN_NUMB = 0;
- MAX_SIZE = 9;
- MIN_SIZE = 1;
- ERRORS: Array [ERRORS_CODE] Of String = ('Успешно',
- 'Данные в файле некорректные',
- 'В файле неверное количество элементов или стоит лишний пробел',
- 'Числа должны быть в диапазоне [0, 100000]',
- 'Размер должен быть в диапазоне [1, 6]');
- ListOfMessages: TArrayOfMessages = ('Информация записана!',
- 'Файл не найден! Повторите ещё раз.',
- 'Файл не текстовый! Повторите ещё раз.',
- 'Файл не доступен для чтения! Повторите ещё раз.',
- 'Файл не доступен для записи! Повторите ещё раз.',
- 'Файл пустой! Повторите ещё раз.',
- 'Неверные данные в файле! Повторите ещё раз.',
- 'Что-то пошло не так. Потворите ещё раз.');
- Procedure TotalKeyPress(Var Key: Char; SelStart, SelLength: Integer;
- Const MIN, MAX: Integer; Text: String);
- Function CountOfSymbolInt(Num: Integer): Integer;
- Function InsertKey(Index: Integer; SubStr: Char; SelLen: Integer;
- Text: String): String;
- Function CheckFile(FileName: String): TFileStatus;
- Function ReadSize(FileName: String; Const NumberOfList: Integer;
- Var FileStatus: TFileStatus): Integer;
- Function ReadList(FileName: String; Const SIZE, NumberOfList: Integer;
- Var FileStatus: TFileStatus): ListPointer;
- Implementation
- Function InsertKey(Index: Integer; SubStr: Char; SelLen: Integer;
- Text: String): String;
- Var
- ResultText: String;
- Begin
- ResultText := Text;
- If (SubStr = BACKSPACE) And (SelLen = 0) Then
- Delete(ResultText, Index, 1)
- Else
- Begin
- Delete(ResultText, Index + 1, SelLen);
- If Substr <> BACKSPACE Then
- ResultText.Insert(Index, String(SubStr));
- End;
- InsertKey := ResultText;
- End;
- Function CountOfSymbolInt(Num: Integer): Integer;
- Var
- NumLen: Integer;
- Begin
- NumLen := 0;
- If Num < 0 Then
- Inc(NumLen);
- Repeat
- Inc(NumLen);
- Num := Num Div 10;
- Until (Num = 0);
- CountOfSymbolInt := NumLen;
- End;
- Procedure TotalKeyPress(Var Key: Char; SelStart, SelLength: Integer;
- Const MIN, MAX: Integer; Text: String);
- Var
- ResultNum, RBorder, NumLen: Integer;
- Buffer, Output: String;
- Begin
- Output := InsertKey(SelStart, Key, SelLength, Text);
- If (Length(Output) <> 0) And (Output <> '-') Then
- Begin
- Try
- ResultNum := StrToInt(Output);
- Except
- Key := VOID;
- End;
- If Key <> VOID Then
- Begin
- NumLen := CountOfSymbolInt(ResultNum);
- If NumLen <> Length(Output) Then
- Key := VOID;
- If (ResultNum > MAX) Or (ResultNum < MIN) Then
- Key := VOID;
- End;
- End
- Else
- If (Output = '-') And (MIN >= 0) Then
- Key := VOID;
- End;
- Function IsFileTxt(Var FileName: String): Boolean;
- Var
- FileType: String;
- Status: Boolean;
- Begin
- FileType := FileName.Substring(FileName.Length - 4);
- If FileType = '.txt' Then
- Status := True
- Else
- Status := False;
- IsFileTxt := Status;
- End;
- Function IsFileReadable(Var FileName: String): Boolean;
- Var
- Status: Boolean;
- InFIle: TextFile;
- Begin
- Try
- Assign(InFile, FileName);
- Reset(InFile);
- Status := True;
- Except
- Status := False;
- End;
- CloseFile(InFile);
- IsFileReadable := Status;
- End;
- Function IsEmpty(FileName: String): Boolean;
- Var
- Status: Boolean;
- InFIle: TextFile;
- Begin
- Try
- Assign(InFile, FileName);
- Reset(InFile);
- Status := Eof(InFile);
- CloseFile(InFile);
- Except
- End;
- IsEmpty := Status;
- End;
- Function CheckFile(FileName: String): TFileStatus;
- Var
- FileStatus: TFileStatus;
- Begin
- If Not FileExists(FileName) Then
- FileStatus := FsNotFound
- Else
- If Not IsFileTxt(FileName) Then
- FileStatus := FsNotTxt
- Else
- If Not IsFileReadable(FileName) Then
- FileStatus := FsNotReadable
- Else
- If IsEmpty(FileName) Then
- FileStatus := FsEmpty
- Else
- FileStatus := FsGood;
- CheckFile := FileStatus;
- End;
- Function ReadList(FileName: String; Const SIZE, NumberOfList: Integer;
- Var FileStatus: TFileStatus): ListPointer;
- Var
- List: ListPointer;
- I: Integer;
- Num: Integer;
- InFile: TextFile;
- Begin
- New(List);
- List^.Next := nil;
- Try
- Assign(InFile, FileName);
- ReSet(InFile);
- If NumberOfList = 2 Then
- Begin
- Readln(InFile);
- Readln(InFile);
- End;
- Readln(InFile);
- For I := 1 To SIZE Do
- Begin
- If EOF(InFile) Then
- FileStatus := FsWrongData;
- Read(InFile, Num);
- Add(List, Num);
- End;
- CloseFile(InFile);
- Except
- FileStatus := FsUnexpected;
- End;
- ReadList := List;
- End;
- Function ReadSize(FileName: String; Const NumberOfList: Integer;
- Var FileStatus: TFileStatus): Integer;
- Var
- Size: Integer;
- InFile: TextFile;
- Begin
- Size := 0;
- Try
- Assign(InFile, FileName);
- ReSet(InFile);
- If (NumberOfList = 2) Then
- Begin
- Readln(InFile);
- Readln(InFile);
- End;
- Readln(InFile, Size);
- CloseFile(InFile);
- Except
- FileStatus := FsUnexpected;
- End;
- If Size < 1 Then
- FileStatus := FsWrongData;
- ReadSize := Size;
- End;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement