Запись в типизированный файл delphi.

Delphi 7. Занятие 2_1.

Запись в типизированный файл в delphi

Типизированный файл delphi

Как мы говорили в занятии 10, в delphi запись в файл может осуществляться в трёх вариантах: запись строк, запись однотипных данных, запись цепочки байт (блоков).

Типизированные файлы содержат данные одного типа. Поэтому каждая запись в типизированном файле имеет одну и туже длину.

Работу с типизированными файлами рассмотрим на примерах.

Файл для хранения целых чисел.

В delphi запись на диск типизированного файла аналогична процедуре создания и сохранения текстового файла.

Сначала объявляется файловая переменная:

var vFileInt:File of Integer;

Затем файловая переменная связывается с путём доступа к файлу с помощью процедуры AssignFile( vFileInt, путь_доступа), после чего сам файл создаётся процедурой ReWrite(vFileInt).

Например, создадим на диске D: файл vMyFile.int. Расширение int ничего не говорит файловой системе, но удобно для программиста. Это расширение указывает на то, что в файле хранятся целые числа.

Как говорилось ранее, в delphi запись на диск осуществляется процедурой write(vFileInt,i), где i – целочисленная переменная.

Так как за один вызов процедуры можно записать только одно значение, то, по возможности, следует организовывать запись через цикл.

В предыдущем занятии 10 был использован цикл с постусловием. Теперь воспользуемся циклом с предусловием.

while логическое_выражение do

begin

end;

Прежде чем начнётся выполнение тела цикла, проверяется значение, вырабатываемое логическим выражением. Цикл выполняется, если значение логического выражения равно true.

По мере продвижения мы будем знакомиться с различными типами логических выражений и функций, возвращающих логическое значение. Как мы помним, самих логических значений всего два — true и false.

В нашем конкретном случае цикл будет иметь вид:

while not EOF(vFileInt) do

begin

end;

Пока конец файла не достигнут, функция EOF(vFileInt) возвращает значение false и цикл выполнен не будет. Логическое отрицание not «переворачивает» логический результат, меняя false на true (и наоборот).

После внесения изменений файл надо закрыть:

CloseFile(vFileInt)

Глобальные описания и инициализация программы.

При запуске программы начинается процесс создания форм.

Но, прежде чем появиться на экране, процесс создания формы порождает три события.

Первое событие происходит перед созданием формы, когда управление передаётся в обработчик события FormCreate . В обработчие можно настроить некоторые свойства формы — размер, положение на экране и так далее. Кроме того, в обработчике этого события можно настроить свойства компонентов, которыми она владеет.

Воспользуемся этим, и в обработчике события OnCreate в процедуре FormCreate зададим названия столбцам для размещённой на форме таблицы.

Второе событие происходит перед отрисовкой формы на экране. Это событие FormShow.

Третье событие FormActivate — форма становится активной, то есть с компонентами на форме можно взаимодействовать. Это событие происходит как при запуске программы, так и при передаче фокуса форме. Например, щелчком по заголовку формы, если обе формы видны на экране, или программным методом.

В простых программах, как правило, надобность в этих обработчиках событий невелика. Но по мере усложнения программ ими пользуются всё чаще.

Для работы программы нам понадобится определить глобальные типы, переменные и константы.

Если в программе некоторое значение используется неоднократно, то гораздо удобнее вместо конкретного значения употребить его символьное обозначение. Кроме того, если по каким-либо причинам надо изменить это значение, то достаточно изменить его в определении константы.

type

tArr=array[1..3] of char;

var vFileInt:file of integer;

tRec=record i:integer; d:double; s:string[30]; vArr:tArr end;

var vFileRec:file of tRec;

const vArrLen=22;

Тип данных «char» хранит в переменной ровно один символ (например, букву).

Здесь же мы использовали новый, ранее не применявшийся тип данных — запись. Во многих случаях это очень удобный тип группировки данных.

По отношению к массиву или файлу он выступает как единое целое. В то время как внутри себя может содержать данные разных типов. В нашем примере в записи сочетаются данные целого, вещественного (десятичного), строкового (тип «короткая строка», в которой может содержаться не более 255 символов) типа и тип «массив».

Так как в типизированный файл можно записывать данные только одного типа, то просто сочетать, например, запись чисел и строк одновременно невозможно.

Но указав тип tRec, мы тем самым создаем файл с записями одного типа, не нарушая тем самым принципа создания типизированного файла.

Новые рассмотренные компоненты, операторы и функции.

Таблица. Этот компонент находится на вкладке компонентов Additional и имеет имя «StringGrid» — сетка строк.

В инспекторе объектов задаём свойства «ColCount» (количество колонок) равное 3; «RowCount» — количество строк равное 9 (включая заголовок); «FixedRows» оставляем 1 (это строки вверху таблицы, выделенные серым цветом); «FixedCols» выставляем в 0 (выделенный слева серым цветом столбец).

Для заполнения ячеек таблицы целыми числами воспользуемся генератором случайных целых чисел «random(n)». Эта функция выдаёт каждый раз при обращении к ней новое случайное число, лежащее в диапазоне от 0 до n.

К сожалению, у этой функции есть недостаток. Если генерировать большое количество чисел, то последовательности начинают повторяться. Чтобы этого не происходило, предварительно вызывают процедуру «randomize», или используют искусственный прием, имитирующий её работу.
s:=formatDateTime(‘z’,now);
k:=strToInt(s);
ii:=k div 10;
jj:=random(ii);

Здесь мы использовали функцию formatdatetime(‘z’,now), которая по заданному формату «’z’» возвращает число миллисекунд. Это число выделяется из результата работы функции now, которая возвращает текущее системное время как набор значений часы/минуты/секунды/миллисекунды.

Затем число миллисекунд подвергается целочисленному делению на 10 с помощью операнда div.

Операция целочисленного деления происходит в два этапа. Сначала вычисляется десятичный результат операции деления. Затем отбрасывается десятичная часть и как результат возвращается целая часть.

Наконец, функции random(ii) передаётся вычисленное значение, тем самым изменяя диапазон случайных чисел.

Далее производим чтение созданного файла и заполнение ячеек таблицы прочитанными значениями.
ii:=1; //номер строки j:=0; //номер столбца reset(vFileInt);
while not eof(vFileInt) do
begin read(vFileInt,i);
form1.StringGrid1.Cells[j,ii]:=inttostr(i);
inc(j);
if j=3 then
begin
j:=0;
inc(ii);
end;
end;
Каждая ячейка таблицы позиционируется: StringGrid1.Cells[номер_столбца, номер_строки].

Сначала заполняем ячейку [0,1] (ячейка [0,0] — это шапка таблицы).

Далее увеличиваем на единицу j с помощью процедуры inc(j) (inc(j,3) увеличит j на 3).

Потом проверяем j с помощью логического оператора if логическое_выражение then.

Здесь логическое выражение проверяет, стало ли j равно 3. Если да (логическая конструкция j=3 возвращаетttue), то выполняется код между begin и end.

Обнуляем номер столбца j и увеличиваем номер строки ii.
И так ряд за рядом.

Формируем запись для delphi record.
Type tRec=record i:integer; d:double; s:string[30]; vArr:tArr end;
var vRec:tRec;
vRec.i:=10;
vRec.d:=12.67;
vRec.s:=’предложение < 31 символа’;
vRec.vArr[1]:=’*’; vRec.vArr[2]:=’#’; vRec.vArr[3]:=’$’;

Как видно, чтобы записать/прочитать поле записи, необходимо указать имя переменной и через точку имя поля записи (не правда ли, это очень напоминает обращение к объекту: form1.Edit1.text).

Объекты — это усовершенствованные записи. Только к ним добавлен механизм хранения и выполнения процедур.

В объекте предусмотрено каскадное хранение других объектов (в объекте form1 находится объект Edit1, к свойству text которого можно обратиться для чтения или записи).

Объекты наделены механизмом самокопирования и дополнения копии новыми свойствами (этот механизм называется наследованием).

Объекты являются образцом, по которому в программе создаются экземпляры объекта. Механизм создания экземпляра объекта называется конструктором объекта. Именно экземпляр объекта выполняет все действия и хранит все характерные для него данные.

Образец называется типом объекта (например, TForm). У компонент Delphi, которые суть объекты, механизм создания экземпляра объекта скрыт внутри IDE.

Поэтому достаточно написать Form1: TForm, чтобы экземпляр объекта «Form1» был создан, то есть конструктор объекта программист явно не вызывает (а вот экземпляры объектов, созданные самим программистом, необходимо создавать с помощью конструктора!).

Впрочем, об объектах речь пойдет позднее.

Видео. Подготовка формы.

Видео. Запись в типизированный файл в delphi.

Видео. Чтение из типизированного файла delphi.

Видео. Запись и чтение «записей» в типизированный файл.

Заключение.

В занятии рассмотрено создание и чтение типизированного файла.

Рассмотрен новый компонент «таблица».

Оператор цикла с предусловием. Новый логический оператор.

Тип данных «константа» и «запись».

Функции и процедуры: процедура инкримента (увеличения) целочисленной переменной; функция создания случайного числа; функция работы с типом данных «дата/время».

Рассмотрены новые обработчики событий.

Глоссарий.

  • Типизированный файл file of тип_файла.
  • Оператор цикла с предусловием while … do.
  • Логическое отрицание not.
  • Обработчик события формы formCreate.
  • Обработчик события формы formShow.
  • Обработчик события формы formActivate.
  • Тип данных const «константа» .
  • Тип данных record «запись».
  • Тип данных сhar «символ».
  • Компонент SrtingGrid «таблица».
  • Генератор случайных чисел random.
  • Функция для работы с типом «дата/время» formatDateTime.
Обновлено: 07.01.2021 — 15:27

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *