Опубликован: 06.09.2005 | Уровень: для всех | Доступ: платный
Лекция 7:

Записи. Бинарные файлы

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Доступ к полям

Обратиться к полю записи можно следующим способом:

<имя_записи>.<имя_поля>

Например:

month:= my_birthday.month +1;

Как уже было упомянуто, коллизий между переменной с именем month и полем записи my_birthday.month не возникает.

Доступ к полю двумерной таблицы осуществляется аналогичным образом (жирные скобки являются обязательным элементом синтаксиса):

<имя_таблицы>[<индекс>].<имя_поля>

Эту запись можно трактовать так:

(<имя_таблицы>[<индекс>]).<имя_поля>

Например:

birthdays[mother].day := 9;

Оперирование несколькими полями

Если программе предстоит несколько раз подряд обращаться к полям одной и той же записи, может оказаться неудобным записывать это обращение полностью:

my_birthday.day:= 17;
my_birthday.month:= 3;
my_birthday.year:= 2004;

Для сокращения таких участков служит оператор with, позволяющий обращаться к полям, не указывая каждый раз имя всей записи:

with <имя_записи> do
	begin <операторы>
			{имена полей здесь используются как <имя_поля>, 
			а не как <имя_записи>.<имя_поля>}
	end;

Например:

with my_birthday do 
		begin day:= 17;
			month:= 3;
			year:= 2004;
		end;

Замечание. Для того чтобы внутри оператора with можно было обратиться не к полю записи, а к глобальной переменной с таким же именем, перед этой переменной нужно указать (через точку) имя программы: <имя_программы>.<имя_переменной>.

Например:

with my_birthday do 
	begin day:= 17;
			month:= 3; 				{поле записи birthday.month}
			year:= 2004;
			programma.month:= 5; {глобальная переменная month}
	end;
Вложенные операторы with

Если возникает необходимость расположить один оператор with внутри другого, то любую переменную (если перед ней явно не указано имя записи ), находящуюся под внутренним оператором with, компилятор пытается интерпретировать в такой последовательности:

  1. если во внутренней записи есть поле с искомым именем, то поиск заканчивается;
  2. если во внутренней записи поля с таким именем нет, то поиск производится среди полей внешней записи (если вложенных операторов with больше, чем два, то поиск ведется последовательно во всех задействованных записях в направлении "изнутри наружу");
  3. если среди полей всех вложенных записей нет искомого идентификатора, компилятор считает его глобальной переменной.

Например:

type date = record day: 1..31;
							 month: 1..12;
							 year: 1900..2005;
				  end;
		student = record name: string[100];
								 year: 1950..2005; {год поступления}
								 gruppa: string[5];
								 birth: date;
						end;
var ivanov: student;

begin
	...
	with ivanov do
	begin
			...
			with birth do
			 begin
				...
				year:= 2001; 						{birth.year}
				gruppa:= 'IT01';				{ivanov.gruppa}
				...
			 end;
			...
	end;
end;
< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Евгения Поздеева
Евгения Поздеева
Ольга Стебакова
Ольга Стебакова

Вот фрагмент лекции 5 (статья 4):

Проверка множества на пустоту может быть осуществлена довольно просто:

pusto:= true;   for i:= 1 to N do 

if set_arr[i] then begin pusto:= false; break end; {мне кажется здесь должно быть так:

if set_arr[i]<>0 then begin pusto:= false; break end;}

Хотелось бы знать это ошибка в теории или я просто не поняла лекцию?

Капиталина Кузьмина
Капиталина Кузьмина
Россия
Надежда Щербакова
Надежда Щербакова
Россия