TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

1.3.2. Драйверы текстовых устройств

Для упрощения текстового ввода/вывода в модуль F_GrText включен собственный драйвер текстовых устройств, позволяющий использовать стандартные процедуры Write/WriteLn и Read/RedaLn в графическом режиме. В этом разделе рассматриваются вопросы создания драйверой текстовых устройств.

С каждым текстовым файлом Турбо Паскаль связывает переменную типа Text, которая определена как запись следующего типа:

type

TextBuf = array [O..127] of Char;

TextRec = record

Handle Word; {Дескриптор файла}

Mode Word; {Режим использования файла}

BufSize Word; {Длина буфера}

Private Word; {He используется}

BufPos Word; {Индекс следующего символа в буфере}

BufEnd Word; {Количество необработанных символов}

BufPtr -^TextBuf; {Адрес буфера}

OpenFunc Pointer;

InOutFunc Pointer;

FlushFunc Pointer;

CloseFunc Pointer;

UserData array [1..16] of Byte;

Name array [0..'?9] of Char;

Buffer TextBuf end;

Поле Handle содержит дескриптор файла и используется при работе с дисковым файлом средствами ДОС.

Поле Mode может принимать одно из следующих значений:

const

fmClosed = $D7BO; {Файл закрыт} fmlnput = $D7B1; {Файл - в режиме чтения данных} fmOutput = $D7B2; {Файл - в режиме записи данных} fmInOut = $D7B3; {Файл - в режиме чтения/записи}

Любые другие значения этого поля означают, что файл не был открыт. Поле UserData никогда не используется Турбо Паскалем и зарезервировано для внутренних нужд вызывающей программы.

В поле Name содержится полный путь к файлу в формате ASCIIZ. В этом формате строка определяется как цепочка символов, заканчивающаяся символом #0.

Четыре поля типа Pointer в записи TextRec имеют следующий смысл:

Open.Fu.nc — адрес функции, получающей управление при открытии текстового файла;

CloseFunc — адрес функции, вызываемой при закрытии текстового файла;

InOutFunc — адрес функции, активизируемой в момент физического обращения к устройству для записи или чтения информации;

FlushFunc — адрес функции, осуществляющей «выталкивание»

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

type

FuncType = Function (var F: TextRec): Integer;

Значение, возвращаемое функцией, зависит от успешности выполнения соответствующей операции и равно нулю, если операция прошла успешно.

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

Назначение стандартным файлам Input и Output пользовательского драйвера заключается в установке соответствующих адресов в поля-указатели записей TextRec. Если Вы захотите назначить свой драйвер произвольному текстовому файлу, Вам понадобится разработать свою процедуру Assign. В ходе ее выполнения помимо установки адресов функций в поля—указатели, Вам нужно будет также обнулить имя файла, присвоив Name [0] := #0. Кроме того, в поле Mode необходимо поместить значение fmClosed, в BufSize — размер буфера, а в BufPtr — его адрес.

OpenFunc

Функция OpenFunc вызывается стандартными процедурами Reset, Rewrite и Append и предназначена для осуществления всех необходимых подготовительных действий для работы с конкретным файлом. Эта функция всегда вызывается первой, до вызова любой другой функции драйвера. Анализируя поле Mode, она может определить режим работы открытого файла и соответствующим образом установить значение поля InOutFunc, связав его с процедурой чтения или записи информации. Если функция вызывается из процедуры Append, т.е. файл открывается одновременно /ууя чтения и записи данных, поле Mode содержит значение fmInOut. В этом случае процедура должна изменить значение этого поля на fmOutput перед передачей управления в вызывающую программу.

InOutFunc

Функция InOutFunc вызывается стандартными процедурами Read, ReadLn, Write, WriteLn, EOF, EOLn, SeekEOF, SeekEOLn и Close.

Если Mode = fmlnput, функция должна прочитать не более BufSize символов в буфер BufPtr и возвратить число фактически прочитанных символов в поле BufEnd. Кроме того, в поле BufPos функция должна поместить 0. Если функция возвращает 0 в поле BufEnd, Турбо Паскаль рассматривает это как признак конца файла.

Если Mode = fmOutput, функция InOut должна вывести на устройство BufPos символов из буфера BufPtr и поместить 0 в поле BufPos.

FlushFunc

Функция FlushFunc вызывается в конце работы процедур Read, ReadLn, Write, WriteLn. Если Mode = fmlnput, функция должна поместить в поля BufPos и BufEnd значения 0. Если Mode = fmOutput, функция может «вытолкнуть» буфер, т.е. записать остаток буфера в файл. Если Flush ничего не делает, текст будет передаваться на устройство до тех пор, пока не заполнится буфер или пока не закроется файл.

CloseFunc

Функция CloseFunc вызывается стандартной функцией Close для физического завершения работы с файлом.

 

Глава1

Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz