TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

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

Странности

FAQ

Ссылки

Форум

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

Рассылка

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

Об авторе

 

 

Задание функции чтения оверлея 

             Переменная OvrReadBuf  позволяет  вам перехватывать операции
        загрузки оверлеев. Например, вы можете реализовать обработку оши-
        бок или  проверку  наличия  сменного диска.  Когда администратору
        оверлеев требуется считать оверлей,  он вызывает  функцию,  адрес
        которой записан  в  OverReadBuf.  Если функция возвращает нулевое
        значение, то администратор оверлеев  предполагает,  что  операция
        была  успешной.  Если функция возвращает ненулевой результат,  то
        компилятор  генерирует  ошибку  этапа  выполнения  209.  Параметр
        OvrSeg указывает,  какой именно оверлей требуется загрузить,  но,
        как вы далее увидите, вам эта информация не потребуется.

             Чтобы установить свою собственную  функцию  чтения  оверлея,
        вам нужно  сначала сохранить предыдущее значение OvrReadBuf в пе-
        ременной типа OvrReadFunc,  а  затем  присвоить  OvrReadBuf  вашу
        функцию чтения  оверлея.  В  своей функции чтения вам следует для
        выполнения фактической  операции  загрузки  вызвать   сохраненную
        функцию чтения  оверлея.  Любые  нужные вам проверки допустимости
        (такие как проверка наличия сменного диска) следует выполнять пе-
        ред вызовом сохраненной функции чтения,  а все проверки на ошибки
        следует выполнять после вызова.

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

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

             Если вы  также  вызываете  OvrInitEMS,  она  использует вашу
        функцию чтения для чтения оверлеев с диска в память EMS, и в слу-
        чае отсутствия  ошибок  сохраняет адрес используемой по умолчанию
        функции чтения в EMS в OvrReadBuf. Если вы хотите также переопре-
        делить функцию  чтения  в  EMS,  просто  повторите  после  вызова
        OvrInitEMS процесс установки.

             Используемая по умолчанию функция чтения с  диска  в  случае
        успешного выполнения возвращает 0. В противном случае возвращает-
        ся код ошибки DOS.  Аналогично, используемая по умолчанию функция
        чтения из EMS в случае успешного выполнения возвращает 0.  В про-
        тивном случае возвращается код ошибки EMS (от $80 до  $FF).  Под-
        робно коды ошибок DOS описываются в "Справочном руководстве прог-
        раммиста". Коды ошибок EMS можно найти в документации по EMS.

             Следующий фрагмент программы показывает,  как написать и ус-
        тановить функцию  чтения  оверлея.  Новая  функция чтения оверлея
        повторно вызывает сохраненные функции  чтения  оверлея,  пока  не
        возникает ошибка.


         B.Pascal 7 & Objects/LR     - 346 -

             Все ошибки  передаются процедурам DOSError или EMSError (ко-
        торые здесь не показаны),  которые могут вывести ошибку пользова-
        телю. Заметим,  что параметр OvrSeg просто передается сохраненной
        функции чтения оверлея и не обрабатывается непосредственно  новой
        функцией чтения оверлея.

             uses Overlay;
             var
                SaveOvrRead: OvrReadFunc;
                UsingEMS: Boolean;

             function MyOvrRead(OvrSeg: Word): Integer: far;
             var
               E: Integer;
             begin
                repeat
                  E := SaveOvrRead(OvrSeg);
                     if E <> 0 then
                         if UsingEMS then
                            EMSError(E) else DOSError(E);
                until E = 0;
                MyOvrRead := 0;
             end;

             begin
                OvrInit('MYPROG.OVR');
                SaveOvrRead := OvrReadBuf;  { сохранить }
                OvrReadBuf := MyOvrRead;    { установить свою }
                UsingEMS := False;
                OvrInitEMS;
                if OvrResult = OvrOK then
                   begin
                     SaveOvrRead := OvrReadBuf   { сохранение }
                     OvrReadBuf := MyOvrRead;    { установить свою }
                     UsingEMS := True;
                   end;
                    .
                    .
                    .
             end.




Содержание

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

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

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

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

Hosted by uCoz