pattern – образец для вида линии, определяемого пользователем. Этот параметр вступает в действие лишь тогда, когда в предыдущем указано UserBitLn. Образец – это фрагмент линии, заданный в виде числа. Переход от конкретного фрагмента к числу выполняется, например, так:
Удобнее всего переводить полученное число в шестнадцатеричный вид, в нашем примере получится $999C. При изображении линии закодированный нами фрагмент будет повторяться столько раз, сколько нужно.
width – толщина линии. Можно использовать числа, однако определены 2 константы: NormWidth и ThickWidth (нормальная и толстая линии).
Перейдём теперь к рисованию закрашенных фигур. По умолчанию внутренняя область фигуры будет закрашиваться белым цветом, причём закраска будет сплошной. Для управления цветом и видом закраски используется процедура SetFillStyle(style, color: word); Также как и для стиля линии, для style предусмотрены константы: EmptyFill, SolidFill, LineFill, LtSlashFill, SlashFill, BkSlashFill, LtBkSlashFill, HatchFill, XHatchFill, InterleaveFill, WideDotFill, CloseDotFill, UserFill. Первая обозначает отсутствие закраски, вторая – сплошную, последующие – различные специфические виды закраски, самая последняя – закраску, задаваемую пользователем. Чтобы задать пользовательский образец закраски, нужно использовать процедуру SetFillPattern(Pattern: FillPatternType; Color: Word); FillPatternType определяется как array[1..8] of byte, каждый элемент массива кодирует одну строчку образца закраски (как и для линий), а всего таких строчек 8. В результате закраска выполняется с помощью одинаковых квадратиков 8x8.
Ниже приводятся процедуры рисования закрашенных фигур.
Название | Назначение |
Bar(x1,y1,x2,y2: integer); | Рисует закрашенный прямоугольник. |
FillEllipse(x,y: integer; xr,yr: word); | Закрашенный эллипс. |
FillPoly(n: word; P); | Закрашенный многоугольник. |
PieSlice(x,y: integer; a1,a2,r: word); | Закрашенный круговой сектор. |
Sector (x,y: integer; a1,a2,xr,yr: word); | Закрашивает эллиптический сектор. |
FloodFill(x,y: integer; Cborder: word); | Выливает краску в точку (x,y), откуда она растекается во все стороны, пока не достигнет границы цвета Cborder. Если такой границы нет или она незамкнута, то краска может залить весь экран. |
3. Вывод текстовой информации.
Для вывода текста на экран используются две процедуры:
OutText(s: string). Эта процедура выводит строку s начиная с текущей позиции, то есть левый верхний угол выводимой строки находится в текущей позиции (по умолчанию это так). Текущая позиция задаётся, например, с помощью MoveTo.
OutTextXY(x,y: integer; s: string). Используется для вывода строки в конкретной позиции.
Если требуется вывести какие либо числа, то предварительно требуется преобразовать их в строку, например, с помощью процедуры Str.
Пример:
var r: integer;
s: string;
...............
Str(r,s);
OutTextXY(100,200,’Результат=’+s);
Турбо Паскаль позволяет использовать несколько различных шрифтов для вывода текста. Кроме того, можно менять направление вывода текста, а также размер символов. В этих целях используется процедура SetTextStyle(Font, Direction, CharSize : word). Перечислим возможные константы и значения для параметров этой процедуры.
Font (шрифт):
DefaultFont – шрифт 8x8 (по умолчанию)
TriplexFont – полужирный шрифт
SmallFont – тонкий шрифт
SansSerifFont – шрифт без засечек
GothicFont – готический шрифт.
Direction (ориентация и направление вывода символов):
0 – привычный вывод слева направо
1 – снизу вверх (надпись «положена на бок»)
2 – слева направо, но «лежачими» буквами.
Size – размер шрифта (целые числа от 0 до 10).
Другая возможность при работе с текстом – это выравнивание его относительно задаваемых координат вывода. Для этого используется процедура SetTextJustify(horiz,wert: word). Horiz указывет как текст расположен относительно заданной позиции по горизонтали, а vert – по вертикали. Возможные константы:
для horiz:
LeftText – указанная позиция является левым краем строки
CenterText – позиция является серединой выводимой строки
RightText – правым краем строки;
для vert:
BottomText – позиция находится на нижнем крае изображения
CenterText – по центру
TopText – позиция является верхним краем изображения.
Лекция 12. Текстовые файлы
Ниже будут обсуждаться способы взаимодействия программы на Паскале с текстовыми файлами, записанными на каком-либо диске. Примерами текстовых файлов могут служить тексты программ на Паскале, простые текстовые документы и т.п.
Любой текст в файле хранится в виде последовательности символов (char), для разбиения текста на строки используются невидимые при просмотре символы конца строки.
1. Îáúÿâëåíèå ôàéëîâîé ïåðåìåííîé è ïðèâÿçêà ê ôàéëó íà äèñêå
Для того чтобы программа могла работать с текстовым файлом, нам потребуется переменная специального файлового типа text:
var f: text;
Эта переменная не содержит в себе весь текст из файла, она служит для чтения данных из файла и для записи новых данных в него.
Прежде чем работать с конкретным файлом на диске, файловую переменную следует связать с этим файлом, используя такую процедуру:
assign(TxtFile: text, name: string);
Первый параметр (TxtFile) — файловая переменная, второй — строка, содержащая имя файла на диске. Если файл лежит в текущем каталоге, то достаточно указать только его имя и расширение, если в каком-либо другом, то потребуется указывать путь к этому файлу, например:
assign(f,'Z:\SCHOOL\text1.txt');
2. ×òåíèå äàííûõ èç ôàéëà
Перед тем как рассматривать процедуры чтения, заметим что файл можно обходить только последовательно. Хорошей аналогией файла может послужить магнитная лента, с которой головка может читать информацию только по порядку, а для возврата к началу блока данных требуется дополнительное усилие (перемотка).
Чтобы открыть для чтения файл, который был указан при вызове assign, нужно использовать процедуру
reset(TxtFile: text);
После такого действия «читающая головка» будет установлена на начало файла. Разумеется, указанный файл должен существовать на диске, в противном случае в программе возникнет ошибка.
После открытия файла можно начинать чтение данных. Для этого используются процедуры read и readln, которые используются в следующем формате:
read(TxtFile: text, v1: type1, v2: type2, ... vN: typeN);
readln(TxtFile: text, v1: type1, v2: type2, ... vN: typeN);
Первая процедура читает последовательно из файла значения и помещает их в переменные v1, v2, ... vN. После каждого прочитанного значения указатель файла («читающая головка») смещается к началу следующего значения. Процедура readln делает то же самое, после чего перемещает указатель на начало следующей строки; readln с одним лишь первым параметром переводит указатель на начало новой строки. В качестве параметров для процедур read и readln можно использовать переменные следующих типов:
целые: integer, byte, shortint, word, longint;
вещественные: real, single, double, extended, comp;
строковые (string);
символьные (char).
При чтении строковых значений из файла берётся вся последовательность символов от позиции указателя до конца строки. Если после этого попытаться вновь прочитать строку, то результат будет пустой строкой ( ' ' ). Если попытаться прочитать число, когда указатель файла стоит в конце строки, то будет прочитан 0.
При чтении чисел read и readln работают так: сначала указатель пропускает все пробелы и символы табуляции, а затем, найдя первый значащий символ, пытается прочитать число. Если это невозможно (встретилась буква или число записано неверно), то произойдёт ошибка.
Пример использования процедуры чтения:
var f: text; s: string; n: integer;
...
readln(f,n,s);
Необходимо помнить, что если файл не был открыт для чтения с помощью reset, то любая попытка прочитать из него данные приведёт к ошибке.
Довольно часто в программе бывает необходимо определить, дошёл ли указатель файла до конца строки или до конца файла. В этом случае полезно использовать такие функции:
eoln(TxtFile: text): boolean;
eof(TxtFile: text): boolean;
Первая принимает значение true (истина), если указатель стоит на конце строки, вторая — то же самое для конца файла.
После того как все операции чтения закончены, файл необходимо закрыть с помощью процедуры
close(TxtFile: text);
если этого не сделать, то содержимое файла может оказаться испорченным после выполнения нашей программы.
Пример 1 (процедуры чтения). Пусть имеется текстовый файл, например программа на Паскале. Требуется распечатать его содержимое на экране:
program ShowFile;
var f: text;
c: char;
begin
assign(f,'showfile.pas');
reset(f);
while not eof(f) do begin
while not eoln(f) do begin read(f,c); write(c); end;
readln(f);
writeln;
end;
close(f);
readln;
end.
3. Зàïèñü данных â ôàéë
А теперь перейдём к процедурам записи в файл. Перед тем как что-либо записывать, нужно создать новый (пустой) файл или стереть содержимое существующего. Для этого используется процедура
rewrite(TxtFile: text);
До её вызова файловая должна быть привязана к имени файла на диске с помощью assign. Если файл не существовал, то rewrite создаст его, если существовал, то содержимое будет стёрто. В любом случае файл будет пустым, а указатель записи стоит на начале файла.
Для записи используются процедуры
write(TxtFile: text, p1: type1, p2: type2, ... pN: typeN);
writeln(TxtFile: text, p1: type1, p2: type2, ... pN: typeN);
Здесь в качестве параметров p1, p2, ... pN можно использовать не только переменные, но и выражения: числовых типов, строковые, символьные и логические (boolean). В отличие от write, writeln после записи в файл значений p1, p2, ... pN переводит указатель записи на начало новой строки; writeln с одним параметром (текстовый файл) лишь переводит указатель на новую строку.