pascalabcnet/InstallerSamples/BlockFileOfT/Основы.pas

61 lines
3.2 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

uses BlockFileOfT;
type
r1=record
i:integer;
r:real;
constructor(i:integer; r:real);
begin
self.i := i;
self.r := r;
end;
///Переопределение того - как объекты типа r1 будет выписывать writeln
function ToString:string; override :=
$'r1({i}, {r})';
end;
begin
//var f: BlockFileOf<r1>;
//f := new BlockFileOf<r1>;//В отличии от file of T - всегда надо инициализировать перед тем как использовать
//f.Assign('temp.bin');
var f := new BlockFileOf<r1>('temp.bin');//эта строчка заменяет предыдущие 3
f.Rewrite;//Если навести мышку на метод (в данном случае Rewrite) - показывает описание
f.Write(new r1(123,123.456));
f.Write(new r1(456,456.789));
//f.Flush;//не обязательно - Close делает то же самое перед тем как закрыть файл
f.Close;//После работы с файлом - надо его закрыть.
//f.Assign('temp.bin');//Не обязательно, файл остаётся привязан после закрытия
f.Reset;
writeln($'Read#1: {f.Read}');//r1(123,123.456)
writeln($'Pos#1: {f.Pos}');//1, потому что мы открыли файл через "Reset" (курсор вначале файла) и затем прочитали 1 элемент
f.Write(new r1(0,0));//В отличии от file of T, у BlockFileOf<T> нету режима чтения и режима записи
//Они объеденены, поэтому не надо закрывать файл чтоб записать что то после чтения
writeln($'Size#1: {f.Size}');//2, потому что r1(0,0) не втиснуло между первыми 2 элементами, а записало поверх второго
writeln($'EOF: {f.EOF}');//True, потому что у нас всего было 2 элемента, и курсор сейчас стоит на позиции 2 (1 чтение + 1 запись)
//f.Seek(1);
f.Pos := 1;//то же самое что и Seek(1)
writeln($'Read#2: {f.Read}');//r1(0,0), то, что мы только что записали
f.Pos := 5;//Можно ставить за границей файла
//f.Read;//Ошибка: Нельзя читать за пределами файла. Можно только записывать
f.Write(new r1);
writeln($'Size#2: {f.Size}');//6, потому что мы записали +1 элемент после позиции 5
f.Size := 10;//Можно и так, в этом случае не надо ничего записывать
writeln($'Size#3: {f.Size}');//10
writeln($'Pos#2: {f.Pos}');//6, как и была после того как мы последний раз вызвали f.Write
f.Flush;//Программа сейчас завершится, поэтому файл закроется сам
//Но если не вызвать хотя бы Flush - изменения могут не сохранится
end.