S:= FSearch ('EDIT. EXE','C:\DOS;C:\NC;C:\NU');
В текущем каталоге поиск производится автоматически. В случае удачного поиска переменной присваивается строка, содержащая составное имя файла, в случае неудачи – пустая строка.
Список каталогов используется аналогично принятым правилам в DOS. Обычно в файле автозапуска AUTOEXEC. BAT содержится команда PATH, присваивающая этой переменной окружения имена каталогов, в которых находятся наиболее часто используемые файлы. В этом случае поиск файлов из среды DOS производится не только в текущем и корневом каталогах, но и в каталогах, указанных в этой команде.
Чтобы воспользоваться этой переменной, в модуле DOS введена функция
GetEnv (EnvVar:String):String;
где в качестве аргумента используется имя переменной окружения. Так, если в файле автозапуска указана команда
PATH C:\DOS;C:\WINDOWS;C:\NC,
то после выполнения
S := GetEnv ('PATH');
S примет значение
C:\DOS;C:\WINDOWS;C:\NC,
что может являться аргументом функции FSearch.
Из составного имени файла можно отдельно выделить полный путь, чисто имя и расширение процедурой
FSplit (Path:PathStr; Var Dir:DirStr; Var Name:NameStr; Var Ext:ExtStr);
Типы определены как
DirStr = String [67];
NameStr = String [8];
ExtStr = String [4];
Пример поиска файла.
Program PoiskFile;
{ Пример программы поиска файла }
Uses Dos;
Var
NameIn, NameFul:PathStr; { входное и составное имя файла }
Dir:DirStr;
Name:NameStr;
Ext:ExtStr;
Begin
Writeln(' Введите имя искомого файла: ');
Readln(NameIn);
NameFul:=FSearch(NameIn, GetEnv('PATH'));
If NameFul='' then
Writeln('Файл ',NameIn,' не найден')
else
Begin
FSplit(NameFul, Dir, Name, Ext);
Writeln('файл ',Name,' с расширением ',Ext,
' найден в каталоге ',Dir)
end
end.
При создании новых файлов часто необходимо знать, достаточно ли места на диске. Для этого можно воспользоваться функциями
DiskSize (Drive:Byte):LongInt;
– определение общего объема указанного логического устройства (диска) в байтах;
DiskFree (Drive:Byte):LongInt;
– определение количества свободных байт на диске.
Номер диска задается как: 0 – текущий, 1 – А, 2 – С и т. д.
Для работы с текущей датой и временем используются процедуры:
GetDate ( Var Year, Month, Day, Day_of_week: Word);
– определяет текущую системную дату. Здесь Day_of_week определяет порядковый день недели от 0 до 6, причем 0 означает воскресенье.
Аналогично для установки новой даты:
SetDate (Year, Mount, Day:Word);
Процедура для определения системного времени:
GetTime ( Var Hour, Minute, Second, Hund:Word);
Здесь Hund — сотые доли секунды со значением от 0 до 99. Они определяются приблизительно, так как внутренний генератор переключается 18,2 раза в секунду.
Для установки системного времени применяется процедура
SetTime (Hour, Minute, Second, Hund:Word);
Но бо́льшие возможности дает работа непосредственно с процедурами операционной системы и внешними устройствами.
Для работы с прерываниями в модуле DOS предусмотрены две процедуры вызова прерываний.
Intr (IntNo:Byte; Var Regs: Registers);
Здесь:
IntNo – номер прерывания;
Regs – содержимое регистров процессора следующего типа:
Registers = Record
Case integer of
0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags:Word);
1: (AL, AH, BL, BH, CL, CH, DL, DH:Byte);
end;
То есть поля записи соответствуют либо шестнадцатиразрядным, либо восьмиразрядным регистрам процессора. Например, установка графического режима 640х480 точек, 16 цветов:
Var R:Registers;
... ...
R. AH:=0; R. AL:=$12;
Intr ($10,R);
Так как очень часто используется вектор прерывания DOS 21H, то добавлена специальная процедура для работы только с этим прерыванием:
MSDos ( Var Regs:Registers);
полностью эквивалентная
Intr ($21,Regs);
Например, определение версии DOS:
Uses Dos;
Var R:Registers;
... ...
R. AH:=$30;
MSDos ( R );
Writeln ('MS-DOS ',R. AL,'.',R. AH);
... ...
§9.6. Графический режим монитора
Для создания графических изображений, то есть для работы монитора в графическом режиме, предназначен модуль GRAPH, хранящийся в соответствующем файле.
В настоящее время используются самые разнообразные видеоадаптеры, поддерживающие несколько режимов работы монитора, стандартными из которых считаются:
VGA (Video Graphics Array) с максимальным разрешением 640х480 точек (пикселов);
SVGA (Super VGA) – 800x600;
XGA (eXtended Graphics Array) – 1024x768:
SXGA (Super XGA) – 1280x1024;
UXGA (Ultra XGA) – 1600x1200 и другие.
Более того, в каждом режиме можно отображать разное количество цветов, что существенно зависит от объема видеопамяти. При работе с 16-ю цветами каждая точка занимает полбайта, с 256 – 1 байт, в режиме High Color (более 65 тыс. цветов) – 2 байта, в режиме True Color (более 16 млн. цветов) – 3 байта.
В модуле Graph поддерживается только режим VGA. Здесь можно задавать всего 16 цветов, но три варианта точек по вертикали: 200, 350 и 480, которые задаются режимами: VGALo=0, VGAMed=1, VGAHi=2. Для управления режимом VGA необходимо подключать специальный драйвер, находящийся в файле EGAVGA. BGI (Borland Graphic Interface).
Если программа запускается из DOS, то графический режим надо инициализировать, задав драйвер и его режим в процедуре инициализации:
InitGraph (< драйвер >,< режим >,< путь к драйверу >);
например:
D:=VGA;
R:=VGAHi;
InitGraph (D, R,’’);
Аналогично для восстановления текстового режима используется процедура
CloseGraph;
Удобнее автоматически распознавать используемый адаптер процедурой
DetectGraph (<драйвер>,<режим>);
например
DetectGraph (D, R);
InitGraph (D, R,’’);
В графическом режиме курсор отсутствует. Его функции выполняет невидимый текущий указатель CP (Current Pointer), выполняющий аналогичные функции. Для его перемещения используется процедура
MoveTo (X, Y:Integer);
причем Х для режима Hi может изменяться в диапазоне от 1 до 640, а Y – от 1 до 480.
Для перемещения указателя относительно его последнего положения используется процедура
MoveRel (dX, dY:Integer);
Аналогично текстовому режиму, здесь используется цвет переднего плана и цвет фона, которые устанавливаются процедурами
SetColor (Color:Word);
SetBkColor (Color:Word);
Дополнительно используется процедура заливки для закрашивания фигур и замкнутых областей
SetFillStyle (Pattern:Word; Color:Word);
где Pattern определяет стиль заполнения.
Модуль включает множество простейших процедур рисования: отображение точки, прямой, прямоугольников, окружностей и т. п. Для вывода текста используются специальные процедуры.
Пример построения столбцовой диаграммы двух функций.
Program Diagram;
{ Демонстрационный пример на использование модуля Graph: столбцовая диаграмма функций F1 и F2 }
Uses Crt, Graph;
Const
xmin:real=0.05; { Начальные значения аргумента }
xmax:real=1;
step:real=0.05;
Var x, { текущее значение аргумента }
Fmin, Fmax:real;
stdiag, { ширина большого прямоугольника }
xdiag, { текущая точка диаграммы }
rezim, razm:integer; { режим и разрешение монитора }
stng:string; { временная переменная для преобразования числовых данных при выводе }
Function F1(x:real):real;
Begin
F1:=exp(-x)*sin(x)
end;
Function F2(x:real):real;
Begin
F2:=exp(-sqrt(x))*cos(x);
end;
Begin
{ Поиск экстремумов функции }
x:=xmin;
Fmin:=F1(x);
Fmax:=Fmin;
Repeat
if F1(x)>Fmax then Fmax:=F1(x);
if F2(x)>Fmax then Fmax:=F2(x);
if F1(x)<Fmin then Fmin:=F1(x);
if F2(x)<Fmin then Fmin:=F2(x);
x:=x+step;
until x>xmax;
{ Контроль за масштабом шкалы ординат }
Writeln('min=',Fmin:8:5,' max=',Fmax:8:5);
Read(Fmin, Fmax);
{ Установка графического режима и цветов }
DetectGraph(rezim, razm);
InitGraph(rezim, razm,'');
SetBkColor(Black);
SetColor(White);
{ Заголовок диаграммы }
OutTextXY(220,20,'Диаграмма двух функций');
{ Координатные линии }
Line(44,50,44,451);
Line(44,451,595,451);
{ Масштабы по X и Y - числовые значения }
Str(xmin:4:2,stng);
OutTextXY(44,460,stng);
Str(xmax:4:2,stng);
OutTextXY(570,460,stng);
Str(Fmax:4:2,stng);
OutTextXY(1,50,stng);
Str(Fmin:4:2,stng);
OutTextXY(1,445,stng);
{ Определение расстояния между столбцами }
stdiag:=round(500/((xmax-xmin)/step));
x:=xmin;
xdiag:=45;
{ Вывод в цикле по два столбца }
Repeat
{ F1 - широкий и зеленый столбец }
SetFillStyle(SolidFill, Green);
Bar(xdiag,450,xdiag+stdiag-2,round(450-400*(F1(x)-Fmin)/(Fmax-Fmin)));
{ F2 - красный и узкий столбец }
SetFillStyle(SolidFill, Red);
Bar(xdiag+round(stdiag/4),450,
xdiag+round(stdiag/4*3)-2,round(450-400*(F2(x)-Fmin)/(Fmax-Fmin)));
x:=x+step;
xdiag:=xdiag+stdiag;
until x>xmax;
{ Индицируем результат, пока не будет нажата какая либо клавиша }
Repeat
until KeyPressed;
{ Выход из графического режима }
CloseGraph
end.
Контрольные вопросы
1. Что такое «модуль»?
2. Что такое «ресурсы модуля»?
3. Чем отличается программа от модуля?
4. Что находится в интерфейсе модуля?
5. Что находится в реализации модуля?
6. Для чего предназначен и когда выполняется раздел инициализации модуля?
7. Какова общая структура модуля?
8. Как выглядят заголовки подпрограмм в интерфейсной части и в разделе реализации?
9. Как выполняется подключение модулей к программе?
10. Как получить доступ к именам модулей при их совпадении?
11. Что такое «косвенное использование модулей»?
12. Может ли модуль обращаться сам к себе (рекурсивное обращение)?
13. Что необходимо предпринять, если имя модуля и имя содержащего его файла не совпадают?
14. В каком файле находятся стандартные используемые модули?
15. Какие 5 модулей находятся в стандартном библиотечном файле?
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Основные порталы (построено редакторами)
