Delphi 7. Занятие 2_1.
Содержание
- 1 Типизированный файл delphi
- 2 Файл для хранения целых чисел.
- 3 Глобальные описания и инициализация программы.
- 4 Новые рассмотренные компоненты, операторы и функции.
- 5 Видео. Подготовка формы.
- 6 Видео. Запись в типизированный файл в delphi.
- 7 Видео. Чтение из типизированного файла delphi.
- 8 Видео. Запись и чтение «записей» в типизированный файл.
- 9 Заключение.
- 10 Глоссарий.
Типизированный файл 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.