TURBO PASCAL |
Новости
|
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 для физического завершения работы с файлом.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |