     E.OPDIR - СПИСКИ ДИРЕКТОРИЙ И ПУТЕЙ ДОСТУПА

     Модуль OPDIR  вводит  два объекта,  которые получают из PickList:
один DirList,  для выбора названий файлов  операционной  системы  DOS;
другой, PathList,  для выбора названий поддиректорий. Эти объекты нас-
ледуют всю гибкость окна и объектов выбранных из перечня  и  добавляют
много новых свойств для рассмотрения структуры директория DOS:
     - универсальный поиск для файлов;
     - выбор файлов по атрибуту;
     - выбор файлов по критерию определяемому пользователем;
     - порядок сортировки определяемый пользователем
     - формат имени, определяемый пользователем, который включает раз-
мер, дату, время и атрибут;
     - специализированная "шапка" для маски, использующейся при поиске
имени файла;
     - средства обеспечения для многократного обозначения файла;
     - графический формат дерева для демонстрации перечня пути доступа.
     Этот раздел  подразделяется на две части.  Первая часть посвящена
команде DirList, вторая часть - объекту PathList.

     1. DirList: Выбор имени файла
     DirList может выбирать одиночный файл по одному или  может  выби-
рать одиночный файл, основываясь на PickList многочисленных возможнос-
тях выбора,  а также может отмечать много файлов для выполнения после-
дующих сообщений.  Демонстрационная  программа  DESKPOP показывает оба
эти способа:  всякий раз, когда появляется приглашение, чтобы отредак-
тировать или просмотреть имя файла, вы можете использовать универсаль-
ные средства, чтобы получить DirList окно для единичного выбора; окно,
управляющее файлом,  использует выделение многочисленного выбора,  так
что вы можете скопировать,  переслать или удалить группу файлов  одним
нажатием клавиши.
     Не у кого не возникает необходимости записать DOS  программу  уп-
равления файлом,  но всегда для всех необходимо получить приглашение к
имени файла. Давайте начнем с работающей демонстрации того, что требу-
ется для использования DirList в этом случае.



                                - 2 -
     program DirectoryListExample;  { EXDIR.PAS }
     uses
       DOS, OpString, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick,
       OpDir;
     var
       Dir : DirList;
       Finished : Boolean;
     begin
       if not Dir.InitCustom(25, 5, 55, 20,  {Координаты окна}
                           DefaultColorSet,  {Цветовой набор}
             DefWindowOptions or wBordered,  {Опции окна}
                           MaxAvail,         {Пространство динамически
                                              распределяемой области
                                              памяти для файлов}
                           PickVertical,     {Ориентация указания}
                           Singlefile )      {Манипулятор команды}
       then begin
         Writeln ('Failed to Init DirList, Status = ', InitStatus);
         Halt;
       end;
     {Установить желаемые особенности DirList}
     Dir.SetPosLimits(1, 1, ScreenWidth, ScreenHeight-1);
     Dir.SetPadSize(1, 1);
     Dir.diOptionsOn(diOptimizeSize);
     Dir.AddMaskHeader(True, 1, 30, heTC);
     Dir.SetSortOrder(SortName);
     Dir.SetNameSizeTimeFormat('<dir>', 'Mm/dd/yy', 'Hh:mmt');
     Dir.SetMask('*.*', AnyFile);
     {Указать файл}
       Finished := False;
      repeat
         Dir.Process;
         case Dir.GetLastCommand of
          ccSelect :
           FastWrite(Pad('Selected: '+Dir.GetSelectedPath,

                                - 3 -
                     ScreenWidth),
                       ScreenHeight, 1, TextAttr);
          ccError :
           FastWrite('Error'+ Long2Str ( Dir.GetLastError),
                      ScreenHeight, 1, TextAttr);
          ccQuit :
           Finished := True;
        {Выполнить другие команды выхода}
       end;
     until Finished;
     Dir.Done;
   end.

     Прежде всего обратимся к конструкции  DirList,  чтобы  установить
координаты окна,  цветность и опции. Три эти конструкционных параметра
являются особенными для DirList.
     Мы  должны определить, как много пространства динамически распре-
деляемой  области  памяти  используется  для  сохранения   имен   фай-
лов.DirList  не может предсказать, как много файлов потребуется сохра-
нить, таким образом он точно распределяет порцию фиксированного разме-
ра динамически распределяемой области памяти и использует ее.Количест-
во пространства динамически распределяемой области памяти, необходимое
для каждого файла зависит от формата воспроизведения, но в этом приме-
ре оно составляет до 80 байт на файл ( это наихудший случай). Хотя  мы
делаем  запрос для самого большого одиночного блока пространства дина-
мически распределенной области памяти (MaxAvial),  DirList  будет  ис-
пользовать  самый большой блок размером 64К.Если такая большая динами-
чески распределенная область памяти доступна, пример  может  управлять
до 813 файлами по одному.
     Так  же  как  и  с PickList, мы должны выбрать ориентацию списка.
Только один столбец имен помещается в окне, так что ориентация  обсуж-
дается  в  этом случае. Мы можем также обеспечить одиночный или много-
численный выбор файлов, здесь мы хотим только осуществить выбор по од-
ному, таким образом мы определяем SingleFile.
     Мы имеем богатый набор изготовленных опций, чтобы выбрать из это-

                                - 4 -
го перечня. Этот  пример  использует  SetPosLimits,(унаследованный  от
RawWindow) чтобы предотвратить DirList от распространения на последнюю
строку экрана, которую мы будем использовать в качестве строки состоя-
ния.  SetPadSize  (из  PickList) заполняет каждое имя файла пробелами.
diOptionsOn разрешает опцию diOptimizeSize из DirList, которая  распа-
хивает   окно   директория,   чтобы   соответствовать   ряду   файлов.
AddMaskHeader разрешает специализированную "шапку" рамки, которая по-
казывает  текущую  маску  поиска  директория.  SetSortOrder   сообщает
DirList,  чтобы  отсортировать  имена  файлов  в  алфавитном  порядке.
SetNameSizeTimeFormat  инициирует  подробный  формат  воспроизведения,
включающий  название и расширение, размер, дату и время. Обратите вни-
мание на то, что мы можем определить маски шаблона для данных и време-
ни, создавая внутреннюю поддержку более легко. В заключении мы опреде-
ляем маску поиска, "*.*", и атрибуты файла, AnyFile. Конечно, в реаль-
ном применении мы не обращаемся к пользователю за именем, но это  есть
нечто, что мы хотим показать здесь.
     После  этого  мы используем DirList точно также, как PickList при
обращении к Process и затем к GetLastCommand. Если выбор  был  сделан,
мы  показываем выбранное имя пути доступа с помощью использования спо-
соба GetSelectedPath. Когда рассматриваются файлы, очень важно прокон-
тролировать на ошибки, случайно расставленная Error делает это здесь.
     DirList обеспечивают способ,  который  даже  более  удобный,  чем
Process для  получения  имен  файлов.  Он называется GetFileName,  для
большей уверенности можно прочитать об этом в способах, которые заклю-
чены в следующем.

     УСЛОВНЫЕ ОБОЗНАЧЕНИЯ
     На модуль  ORDIR  вызывается  одинаковыми условными обозначениями
как на предшествующие модули, а также еще одним . Обозначениями, кото-
рые мы    уже   рассматривали,   являются   UseMouse,   UseScrollBars,
UseHotSpots, UseShadows и UseAdjustableWindows.
     Новым обозначением  является  UseDates и оно использует OPDIR мо-
дуль OPDATE.  Если Вы хотите использовать любые форматы, которые вклю-
чают строки данных и времени, Вам потребуется инициировать это обозна-
чение при условии, что OPDEFINE.INC имеет строку подобную следующей:

                                - 5 -

     {$DEFINE UseDates}

     Если Вам не требуются данные и время в OPDIR ( или в любых других
модулях, подобных OPENTRY,  которые использует Ваша программа ), кото-
рые деинициализируются, это обозначение будет сокращать используемость
памяти компилятора и Вашей программы.

     КОМАНДЫ ДЛЯ ДИРЕКТОРИЯ
     Команды в   DirList  функционируют  точно  также  как  команды  в
PickList за исключением пары ситуаций. Когда команда ccSelect выполня-
ется при DirList и текущем элементом является имя поддиректория, метод
Process не работает.  Вместо этого DirList настраивает свои внутренние
маски, которые будут указывать на новую директорию,  находит соответс-
твующие файлы и показывает новый перечень соответствующих файлов.  По-
добным образом,  в DirList для многочисленного выбора, Process не раз-
решает обозначить имя  поддиректория  как  при  выборе,  Process  либо
игнорирует попытку выбрать это имя, либо показывает новые файлы подди-
ректория.
     Существует другой  способ,  по которому должны создаваться много-
файловые выборки в DirList: только выбранный набор способен к сохране-
нию отмеченных файлов в одном директории по одному.  Если вы отмечаете
группу файлов и затем нажимаете клавишу < Enter >, в то время как ярко
подсвеченный штрих находится на поддиректории,  DirList будет устанав-
ливать в исходное положение выбранный набор и будет показывать неотме-
ченный перечень файлов в новом поддиректории.  Возвращаясь немного на-
зад следует   сказать,   что   предыдущая    директория    не    будет
восстанавливать отмеченный список.  Управляя выбранными наборами,  для
многочисленных директорий требуется слишком  много  непроизводительных
издержек, которые  будут  иметь место,  и кроме того,  поднимается ряд
вопросов о том какие применения должны действовать,  когда  они  имеют
эти выбранные наборы, чтобы работать с ними.
     При установлении по умолчанию,  DirList указывает на тот же самый
экземпляр CommandProcessor  что и PickList.  Важно помнить,  если ваша
программа использует DirList и PickList независимо друг от друга и не-

                                - 6 -
обходимо видоизменить  команду установить соответствие либо с DirList,
либо с PickList.  В этом случае самый лучший подход заключается в том,
чтобы определить  отдельный  CommandProcessor  и  ключевой  массив для
DirList. Вы можете начать с копирования константы KeySet для PickList,
которую вы найдете в OPPICK.ICD, и переименования нескольких идентифи-
каторов:
     const
       {Ключевая строка для отображения команды}
       DirKeyMax = 160 ;
       DirKeyID   : string [10]='opdir keyes';
       DirKeySet  : array [0..DirKeyMax] of Byte= (
       {длина ключей      тип команды     ключевая последовательность}
       3      $00, $48,   ccUp,           {Up}
       3      $00, $50,   ccDown,         {Down}
       ...
       0,0,0,0,0,0,0,0,0,0
       );

     Если вы не собираетесь использовать некоторые  команды,  подобные
командам для  многократного  выбора  файла,  вы можете исключить их из
списка, чтобы сберечь некоторое пространство памяти.
     Далее вам  необходимо  описать переменную типа CommandProcessor и
инициализировать ее ( прежде чем инициализировать DirList):

     var
       DirCommands : CommandProcessor;
     ...
     DirCommands.Init(@DirKeySet, DirKeyMax);

     Если вы  хотите  динамически  дополнить или видоизменить команды,
вы будете обращаться к

     DirCommands.AddCommand(...);

                                - 7 -
     В конце,  после инициализации каждого DirList,  Вы устанавливаете
ее CommandProcessor:

     Dir.SetCommandProcessor(DirCommands);

     ФИЛЬТРАЦИЯ ИМЕНИ ФАЙЛА
     Всякий раз,  когда Ваша прикладная задача определяет новую  маску
поиска и вызывает DirListProcessor, DirList выполняет ряд шагов, кото-
рые можно кратко охарактеризовать  следующим образом:
     - вызвать DOS.FindFirst и DOS.FindNext, чтобы найти файлы;
     - отфильтровать ненужные файлы;
     - отсортировать оставшиеся файлы;
     - создать отформатированную информационную строку показа для каж-
дого файла;
     - произвольно выбрать начальную выборку для PickList;
     - произвольно оптимизировать размер окна;
     - произвольно откорректировать "шапку" маски для окна.
     В этом разделе мы опишем второй шаг, фильтрацию ненужных файлов.
     В действительности, реализации DirList, первый и второй шаги объ-
единяются. Каждый раз, когда FindFirst (или FindNext) возвращают файл,
он проверяется на возможность быть принятым,  до того как он будет до-
бавлен во внутренний массив.
     Как Вам, вероятно, известно обычная процедура FindNext возвращает
информацию о каждом файле в запись, DOS модуль обращается к SearchRec.
OPDIR копирует подмножество этой информации в другую  запись,  которая
обращается к DirRec, который имеет следующее описание:

     DirRec    =            {Данные из DOS SearchRec}
      record
       Attr    :  Byte ;    {Атрибут файла}
       Time    :  LongInt;  {Штамп дата/время}
       Size    :  LongInt;  {Размер файла}
       Name    :  FileStr;  {Имя и расширение файла, максимум
                             12 символов}
     end;

                                - 8 -

     Чтобы проверить частичный DirRec, OPDIR обращается к фактическому
методу Reject:
     функция Reject(var X : DirRec) : Boolean; virtual;
     {-Возвратить значение "верно", чтобы исключить особый вход из
      указания}

     Когда эта функция возвращает значение "верно", DirList игнорирует
относящийся к нему файл,  как если бы он не существовал. Функция может
использовать любую информацию в DirRec,  чтобы сформировать свое реше-
ние: например, является ли расширение файла приемлемым или попадают ли
его данные в определенный диапазон.
     Функция Reject для DirList передает свои полномочия при обращении
к другой обычной процедуре, определенной пользователем через указатель
процедуры (следовательно,  следуя такой же методологии,  описанной  во
введении к OPPICK). Вы можете определить обычную процедуру, чтобы про-
вести изменение с помощью метода SetRejectFunc из DirList:

     процедура SetRejectFunc(RF : diRejectFunc);
     {-Установить изменяющуюся функцию отказа для выбора файла}

     Параметром для SetRejectFunc является сама функция,  которая ско-
мпилирована, используя FAR модель;  этот параметр глобальный  и  соот-
ветствует следующему описанию прототипа:

     {$F+}
     функция MyRejectFunc(var X : DirRec; D : DirListPtr) : Boolean;

     Экстра параметр D,  переданный для этой функции, является адресом
DirList объекта,  который обращается к нему, таким образом разрешается
функция отказа,  чтобы использовать объектные методы и внутренние дан-
ные, если возникает необходимость.
     Модуль OPDIR сопрягает три предварительно записанные функции  от-
каза, которые полезны в общих ситуациях:


                                - 9 -
     функция RejectNone(var D : DirRec; DirPtr: DirListPtr) : Boolean;
     {-Не давать отказа любому файлу}

     функция RejectExtensions(var D: DirRec;DirPtr: DirListPtr):
Boolean;
     {-Отклонить файлы с расширениями в RejectSet}

     функция RejectFiles(var D: DirRec; DirPtr:  DirListPtr):Boolean;
     {-Отклонить все, кроме поддиректорий}

     Первая функция,  RejectNome, является установленной по умолчанию.
Эта функция возвращает значение "ложно"  в  двух  случаях:  во-первых,
когда файл назван ".",  что является DOS-ским способом обозначения те-
кущей директории,  но не очень полезным в выбранном списке,  и во-вто-
рых, когда атрибутом файла является VolumelD, так как мы не хотим ког-
да-либо выбирать этот специальный "файл".
     RejectExtensions блокирует дополнительно любые файлы,  расширения
которых имеют место в предварительно определенном наборе. Например, вы
можете  отказаться  показывать  файлы  с расширением EXE, СOM или BAK.
DirList предоставляет метод для определения расширений:

     процедура AddRejectString(S : String);
     {-Добавить строку к набору для отказа}

     Обращайтесь к этому методу один раз,  чтобы заблокировать файлы с
расширением EXE, COM и BAK для предварительного примера,  нам  следует
добавить следующие  строки  к "изготовленному" по техническим условиям
заказчика разделу кода:

     {Установить желаемые особенности DirList}
     ...
     Dir.AddRejectString('EXE');
     Dir.AddRejectString('COM');
     Dir.AddRejectString('BAK');
     Dir.SetRejectFunc(RejectExtensions);

                                - 10 -

     Обратите  внимание  на  то, что AddRejectString не ограничивается
только сохранением только файловых расширений. Эта команда  использует
объект  команды StringSet для сохранения произвольно выбранного набора
последовательностей и она годится для функции блокирования, чтобы  ре-
шить  как их представить. Если Вам необходимо заблокировать файлы, ко-
торые базируются на чем-то кроме их расширения, ознакомьтесь с функци-
ей RejectExtensions (в OPDIR.IN1) и вы можете иметь возможность  запи-
сать подобную обычную процедуру.
     RejectFiles используется  внутренне  ChangeDirectory  методом  из
DirList. Она  вызывает список директория для показа только имен подди-
ректория: совсем нерегулярных файлов.  Эта функция необходима, так как про-
верка DOS-ского  атрибута файла не обеспечивает способа непосредствен-
ного получения одинакового результата.

     СОРТИРОВКА СПИСКА
     FindFirst, FindNext  и  Reject  функции  создают  массив  файлов,
которые будут показываться. Этот массив располагается в порядке, кото-
рый обеспечила ему операционная система DOS.  Прежде всего, этот поря-
док соответствует последовательности,  в которой эти файлы были созда-
ны. Однако  как  только  файлы  удаляются,  операционная  система  DOS
многократно использует освободившееся от директория слоты. Выбор файла
из такого списка является неэффективным.
     Следовательно, DirList  предоставляет  возможность  отсортировать
список файлов.  Он обращается к обычному методу SortList. SortList ис-
пользует стандартную  методику Object Professional :  она обращается к
процедуре, определенной пользователем, через указатель процедуры, что-
бы сделать  реальную  работу.  Вы определите такую процедуру с помощью
метода SetSortOrder из DirList:

     процедура SetSortOrder(SP : diSortProc);
     {-Установить изменяющуюся программу для сортировки}

     Параметром для  SetSortOrder  является  сама  процедура,  которая
скомпилирована, используя FAR модель, этот параметр глобальный и соот-

                                - 11 -
ветствует следующему описанию прототипа:

     {$F+}
     процедура MySortProc(D : DirListPtr);

     Параметр D,  переданный  для  этой  процедуры,  является  адресом
DirList объекта,  который обращается к нему, таким образом разрешается
процедура сортировки, чтобы использовать объектные методы и внутренние
данные, как необходимые.
     Модуль OPDIR спрягает ряд процедур сортировки, которые будут при-
меняться для большинства ситуаций:

     процедура SortNone(DirPtr : DirListPtr);
       {-Запрет сортировки}

     процедура SortName(DirPtr : DirListPtr);
       {-Сортировать в алфавитном порядке по имени, затем расширению}

     процедура SortDirName(DirPtr : DirListPtr);
       {-Сортировать прежде всего директории, затем в алфавитном порядке
по имени и расширению}

     процедура SortSize(DirPtr : DirListPtr);
       {-Сортировать по размеру, затем по имени и расширению)

     процедура SortTIme(DirPtr : DirListPtr);
       {-Сортировать по дате, затем по имени/расширению}

     SortNone является процедурой,  установленной по умолчанию, она не
несет на себе никакой функциональной нагрузки.  Результирующий  список
директории будет появляться в таком же порядке, что и после применения
команды DOS DIR.
     SortName сортирует  файлы  и директории в алфавитном порядке.  Вы
можете проследить примеры этой сортировки в приведенном  примере.  Она
активизирована из постановки:

                                - 12 -

     Dir.SetSortOder(SortName);

     SortDirName ставит файлы в порядке,  который мы представляем:  на
первом месте поддиректории в алфавитном порядке.  DirList имеет другой
вариант, по  которому объединяется с этой сортировкой: diSetFirstFile,
когда разрешена,  вызывает DirList к положению  начального  первичного
курсора точно после директорий.
     SortSize ставит файлы в порядке возрастания  размера  и  SortTime
ставит файлы в порядке возрастания даты/времени образования файла.
     Все эти сортировки обладают общим рекурсивным  механизмом быстрой
сортировки, который эффективен.  OPDIR разрешает пакетную проверку при
быстрой сортировке. Если даже рекурсивная сортировка осуществлялась бы
из стекового пространства ( что невозможно практически ),  Вы бы полу-
чили 202 ошибку из-за  времени  прогона  в  пределах  файла  источника
OPDIR.IN1.
     Если Вам требуется записать процедуру сортировки, изучите обычные
процедуры сортировки в OPDIR.IN1.  Для большей эффективности,  они ис-
пользуют внутренние структуры данных объекта и методы, но они остаются
тем не менее простыми.

     ФОРМАТИЗИРОВАНИЕ ИМЕНИ ФАЙЛА
     После создания и сортировки массива DirRec, DirList инициализиру-
ет отдельный массив,  содержащий готовые к воспроизведению строки  для
каждого файла. Вы можете предположить, что строки могли быть определе-
ны моментально,  как OPPICK,  запрашиваемый для них.  Опыт доказывает,
что этот подход приводит к очень медленному выполнению,  главным обра-
зом когда отформатированные строки для даты и времени образования фай-
ла являются частью этого результата.  Следовательно, мы решили, что он
наиболее предпочтителен по затратам памяти для предварительного форма-
тирования каждой строки.
     Кроме того OPDIR использует действительную методику указателя ме-
тода / процедуры,  чтобы предложить всем гибкость, которая потребуется
для форматирования этих строк.  Действительный метод обращается к про-
цедуре Format:

                                - 13 -

     процедура Format(var X : DirRec; var pkCat : Byte;
                      var S : String); virtual;
     {-Возвратить отформатированную строку и категорию для входа в ди-
      ректорию}

     DirList обращается к этому методу для каждого элемента  в массиве
DirRec. Процедура  Format возвращает к строке S,  которую показывает и
выбирает категорию pkCat,  которую OPPICK использует чтобы  определить
цвет этого    элемента.   pkCat   должен   соответствовать   pkNormal<
pkAlternate или pkProtected, как было определено модулем OPPICK.
     Процедура Format в свою очередь, обращается к глобальной FAR про-
цедуре, описание которой соответствует следующему:
     { $ F+}
     процедура MyFormatProc(var X : DirRec; var pkCat : Byte;
                            var S : String; D : DirListPtr);

     Как и до этого,  параметр D разрешает, чтобы процедуре определить
объект, к которому она обращалась, и использовать данные и методы это-
го объекта,  если необходимо. О единственном методе MyFormatProc можно
навести справки в GetSelectedDir,  который возвращает драйвер и дирек-
торию, где файлы были обнаружены.
     OPDIR сопрягается с рядом  стандартных  процедур  форматирования.
Однако, вместо  обращения  к ним непосредственно,  Вы сообщите DirList
свои требования по форматированию при обращению к одному  из следующих
методов:

     процедура SetNameFormat;
       {-Инициализировать для плотного формата nnnnnnnn.xxx}

     процедура SetNameSizeFormat(DirStr : String);
       {-Инициализировать для формата nnnnnnn.xxx sssssssss}

     процедура SetNameSizeKFormat(DirStr : String);
       {-Инициализировать для формата nnnnnnn.xxx ssssssk}

                                - 14 -

     {$IFDEF UseDates}

     процедура SetNameTimeFormat(DatePicture, TimePicture : String);
       {-Инициализировать для формата с именем, датой, временем}

     процедура SetNameSizeTimeFormat(DirStr, DatePicture,
                                     TimePicture : String);
       {-Инициализировать для формата с именем,  размером, датой,
        временем}

     процедура SetNameSizeKTimeFormat(DirStr, DatePicture,
                                     TimePicture : String);
       {-Инициализировать для формата с именем, размером, датой,
        временем}

     процедура SetAllFormat(DirStr, DatePicture, TimePicture: String);
       {-Инициализировать для формата с именем, размером, датой,
        временем, атрибутом}
     {$ENDIF}

     процедура SetUserFormat(MaxFmatLen : Byte; FF : diFormatProc);
       {-Установить для определенной пользователем функции формата}

     Эти методы сохраняют не только соответствующую переменную  проце-
дуры для  Format  метода,  чтобы обращаться к этому методу,  но так же
сохраняют определенное изображение строк, так что даты и времена обра-
зования файлов могут быть отформатированы верно.
     DirStr является строкой для показа в списочной  колонке  размера,
когда элементом списка является поддиректория.  Хотя этот параметр пе-
редается как строка,  DirList сохраняет по  крайней  мере  9  символов
достаточных  для  фиксации " директория" или "< dir>".  Также обратите
внимание на то,  что эта строка может соответствовать такой же колонке
с  размерами.  В  "К" (килобайты) формате колонка размера имеет ширину
только 7 символов.

                                - 15 -
     DatePicture и TimePicture следуют за правилами для масок шаблона,
которые описаны в модуле OPDATE.  Здесь имеется несколько примеров со-
ответствующих для перечней директорий.

     Шаблон            Результат
     ────────────────────────────────
     `mm/dd/yy`        `01/02/80`
     `MM/dd/yy`        ` 1/02/80`
     `DD/mm/yyyy`      ` 2/01/1980`
     `dd-NNN-yyyy`     `02-JAN-1980`
     `hh:mm:ss`        `13:02:00`
     `hh:mm`           `13:02`
     `hh:mm te`        `01:02 pm`
     `Hh:mmt`          ` 1:02p`

     Метод SetUserFormat содержит полностью формат, определенный поль-
зователем. MaxFnatLen определяет максимальную  длину  строки,  которая
возвращается процедурой форматирования. Существенно, что эта процедура
никогда не возвращает строку длиннее, чем эта. Перезапись в памяти эта
процедура сама  не выполняет,  так как это может вызвать сторонние ги-
бельные эффекты. FF является процедурой формата, к которой DirList бу-
дет обращаться для каждого входа.
     Чтобы представить пример  процедуры  определенного  пользователем
формата, предположим,  что мы хотим перечень директория, который точно
показывает имена файлов (без расширений) плюс размер в  килобайтах для
каждого файла.  Прежде  всего  мы  вычислим  максимальную длину каждой
строки:

     0         1
     12345678901234
     ──────────────
     nnnnnnnn__sssk

     Предполагая, что размеры файла никогда не превысят 999 Кбайт (или
1 Мбайт), каждая строка составит не более, чем 14 символов.

                                - 16 -
     Сейчас мы можем записать обычную процедуру для задания формата:

     {$F+}
     процедура CustomFormat(var X : DirRec; var pkCat : Byte;
                            var S : String; D : DirListPtr);
     var
       Siz : LongInt;
     begin
       if X.Attr and Directory then begin
         S := X.Name;             {Возвратить имя директории}
         pkCat := pkAlternate;    {Возвратить изменяющуюся категорию}
       end else begin
         Siz := (X.Size+1023) div 1024; {Преобразовать в Кбайты}
         if Siz > 999 then
           S := `***`             {Управлять переполнением}
         else
           Str(Siz:3, S);         {Управлять числом строк}
         S := Pad(JustName(X.Name), 8)+`  `+S+`k`; {Создать последнюю
                                                    строку}
         pkCat := pkNormal;       {Возвратить обычную катерогию}
       end;
     end;
     {$F-}

     CustomFormat выделяет директории,  которые всегда  имеют  нулевой
размер, из реальных файлов она классифицирует директории в pkAlternate
категории, так что средство управления указателя списка будет  показы-
вать их  в отличном цвете.  Для файлов CustomFormat первый преобразует
действительный размер файла (X.Size) в  килобайты,  полезно  неусекать
неполные килобайты.Она  обеспечивает защитные функции с помощью показа
звездочек, если размер превышает 999 Кбайт,  и наоборот эта  процедура
преобразует числовой  размер  к  выравненной по правой границе строке.
Затем эта процедура связывает в цепочку имя файла и размер. В заключе-
нии она устанавливает pkCat,  чтобы показать обычный элемент указания.
Вам нужно будет обратить внимание на то, что это обычная процедура ис-

                                - 17 -
пользует различные функции из OPSTRING.
     Приведите в действие эту  заказную  процедуру  форматирования  со
следующим вызовом:

     Dir.SetUserFormat(14, CustomFormat);

     Тот факт,  что мы не показали расширение каждого файла,  вероятно
означает, что мы хотим выбрать как раз специфическое расширение,  воз-
можно "DOC" или "WKS".  Чтобы сделать так,  передайте маску поиска для
"*.DOC" или "*.WKS" методу SetMask.

     КОНСТАНТЫ
     diDirsUpcase   = $0001;  {Представлять имена директорий с помощью
                               верхнего регистра}
     diFilesUpcase  = $0002;  {Представлять имена файлов с помощью
                               верхнего регистра}
     diExitIfOne    = $0004;  {Выполнять автоматический выбор в
                               GetFileName, если существует один соот-
                               ветствующий файл}
     diSetFirstFile = $0008;  {Расположить курсор выделения на первом
                               объекте, не являющимся директорией}
     diOptimizeSize = $0010;  {Оптимизировать размер окна, когда счи-
                               тывается директория}
     diUserNewHdr   = $0020;  {Установить для пользовательской проце-
                               дуры удаления, когда изменяется заголо-
                               вок}

     Существуют   варианты,   которые  влияют  на  поведение  DirList.
diDirsUpcase, заставляя имена директорий  печатать на верхнем  регист-
ре. Если этот режим недоступен, имена директорий  печатаются с помощью
нижнего регистра. Обратите внимание на то, что изменение регистра про-
исходит   непосредственно   после   того,   как   имя   получается  из
FindFirst/FindNext, процедура Format еще может переопределить регистр.
diFilesUpcase управляет регистром файлов, не входящих в директорию.
     diExitIfOne модифицирует   поведение   единственного   метода   в

                                - 18 -
DirList, GetFileName. Когда diExitIfOne доступна и маска поиска, пере-
данная из GetFileName,  не содержит безразличные символы,  GetFileName
будет выходить за пределы показа окна указания и за пределы требования
дальнейшего клавиатурного  входа,  если один файл соответствует маске.
Для получения более подробной информации смотри GetFileName.
     Если diSetFile доступен,  Process позиционирует курсив  выделения
списка указаний около первой компоненты не директория, всякий раз ког-
да он считывает перечень файлов.  В противном  случае  он  располагает
курсив на первой компоненте.
     diOptimizeSize разрешает автоматическую оценку размера окна,  так
что  окно указаний автоматически сокращается или увеличивается в зави-
симости от числа соответствующих файлов. Повторная сортировка по вели-
чине выполняется с помощью метода OptimizeSize из PickList; рассмотри-
те эту составляющую более подробно. Обратите внимание на то,  что  эта
опция выполняется только, если определенная UseAdjustableWindows явля-
ется действующей.
     diUserNewHdr устанавливается благодаря DirList, всякий раз, когда
DirList изменяет заголовок маски поиска, чтобы показать новую директо-
рию. Для большей информации смотрите метод AddMaskHeader.

     DefDirOptions     : Word = diSetFirstFile;

     Установленные по умолчанию опции для DirList.

     BadDirOptions : Word =diUpdating+diUserNewHdr+diReadDir+
                           diUpdateHdr+diResize+diReposition+diResort+
                           diReformat+diFullPathHdr;

     Опции    использовали   внутренним   объектом   DirList.   Методы
diOptionsOn и OptionsOff не будут изменять эти биты слова опции объек-
та DirList.

     diReadOnlyChar : string[1] = `R`; {Символы для изображения атри-
                                        бутов файла}
     diHiddenChar   : string[1] = `H`;

                                - 19 -
     diSystemChar   : string[1] = `S`;
     diArchiveChar  : string[1] = `A`;

     Когда SetAllFormat был обращен к тому,  чтобы разрешить подробное
изображение имен файлов,  эти строки определяют как модуль OPDIR пока-
зывает атрибуты файла.  Для того,  чтобы каждый бит установить в байте
атрибута файла, OPDIR связывает в цепочку соответствующую строку. Что-
бы блокировать изображение особого бита, точно установите соответству-
ющую стоку к пустой строке.

     ТИПЫ
     DispRec     =           {Запись  переменной  длины  для  элемента
       record                изображения}
         Cat     : Byte;     {Категория указания}
         Disp    : String;   {Строка для  изображения  частично  опре-
       end;                  деленного}
     DispRecPtr  = ^DispRec; {Указатель к DispRec}

     OPDIR управляет массивом записей DispRec; единственный для каждо-
го  разрешенного к выполнению файла. Только поле Disp использует такое
пространство, какое требуется для выделенного формата.

     FileStr     = String[12]; {Участок памяти для имени файла}
     DirRec      =             {Данные из DOS SearchRec}
       record
         Attr    : Byte;       {Атрибут файла}
         Time    : LongInt;    {Штамп даты/времени}
         Size    : LongInt;    {Размер файла}
         Name    : FileStr;    {Имя и расширение файла}
       end;
     DirRecPtr   = ^DirRec;
     DirRecArray = array[1..($FFF1 div SizeOf(DirRec))] of Dirrec;
     DirArrayPtr = ^DirRecArray;

     Модуль OPDIR также управляет массивом DirRec. Он копирует запись,

                                - 20 -
возвращенную при каждом обращении к FindFirst или FindNext  в  DirRec.
Если DirRec разрешается функцией отказа, она остается в массиве. Опре-
деленные  пользователем  процедуры отказа, сортировки и форматирования
должны относиться к областям DirRec. Эти области  эквивалентны  облас-
тям, определенным  в  типе  SearchRec модуля DOS для Turbo Pascal. Для
расширения информации смотри Borland справочное руководство  по  Turbo
Pascal.
     Обратите  внимание  на  то,  что каждый объект DirList объединяет
DirRecArray и массив DirRec в единый сегмент объемом 64К.  Этим  уста-
навливается ограничение на максимальное число файлов, которое он может
изобразить сразу. Метод FileCapacity возвращает действительное ограни-
чение  для  особой ситуации. Благодаря буферу заголовков размером 64К,
DirList управляет приблизительно 500 - 2000 файлами, в зависимости  от
формата изображения.

     diRejectFunc = function (var X : DirRec; D : DirListPtr) :
                    Boolean;
     diSortProc   = procedure (D : DirListPtr);
     diFormatProc = procedure (var X : DirRec; var pkCat : Byte;
                               var S : String; D : DirListPtr);

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

     diInitCommandProc = procedure (D : DirListPtr:
                                    var StringProc : pkGenlProc);

     Тип процедуры использовался конструкторами DirList, чтобы опреде-
лить единственный  или  многочисленный  выбранный  список  директории.
OPDIR связывает процедуры SingleFile и MultipleFile, которые соответс-
твуют этому типу.

     DirListPtr = ^DirList;
     DirList =

                                - 21 -
       object(DirList)
         ...
       end;

     Объект DirList.

     AddMaskHeader
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура AddMaskHeader(FullPath : Boolean;
                             PadSize, MaxLen : Byte;
                             Posn : HeaderPosType);

     НАЗНАЧЕНИЕ
     Добавляет конкретный заголовок для изображения маски поиска.

     ОПИСАНИЕ
     Процедура AddMaskHeader создает  обращение  к  wFrame.  AddHeader
после  этого обращения инициализует внутренние структуры данных, чтобы
отслеживать заголовок маски. DirList будет затем автоматически коррек-
тировать ее, чтобы изобразить текущую маску поиска всякий  раз,  когда
она изменяется.
     Если  FullPath находится в положении "верно", заголовок будет по-
казывать драйвер и директорию так же, как саму маску поиска.
     PadSize определяет количество пространства, которое должно добав-
ляться к каждому концу заголовка до изображения его.  MaxLen  является
общим  количеством  символов, которые должны резервироваться для заго-
ловка, включая любое дополнение пробелами. Если бы действительная мас-
ка превысила эту длину, DirList бы удалил внутренние символы из  заго-
ловка  до изображения его. Для того чтобы обеспечить достоверное изоб-
ражение, AddMaskHeader всегда убеждается в том,  что  MaxLen-2*PadSize
имеет по крайней мере 6 символов.
     Posn определяет  положение  заголовка  относительно фрейма (heTL,
heTC, heTR, heBL, heBC или heBR).

                                - 22 -
     Всякий  раз  когда DirList корректирует заголовок маски, он уста-
навливает флаг во внутреннем слове опций DirList. Определенная пользо-
вателем процедура пересылки (смотри PickList.PreMove) может воспользо-
ваться этим флагом для выполнения  специальной  операции-корректировки
над  линией  состояния, учитывающей файл и байт, например - всякий раз
когда появляется новая директория. Она является пользовательской  обя-
занностью  процедуры,  чтобы  вновь установить флаг. Здесь имеет место
последовательность кода, которая должна появляться в  процедуре  пере-
сылки, чтобы воспользоваться этим флагом:

     if DirListPtr(P)^.diOptionsAreOn(diUserNewHdr) then begin
       {Пользователь просматривает другую директорию}
       ...
       {Переустановить флаг}
       diOptionsOff(diUsernewHdr);
     end;

     ПРИМЕР
     Dir.SetMask(`*.*`,AnyFile);
     Dir.AddMaskHeader(True, 1, 20, heTC);

     Если текущая директория имела вид "C:\TEST",  тогда окно директо-
рии будет показывать заголовок "C:\TEST\*.*",  который  помещается  на
верхнем бордюре. Если  пользователь  обращения  к  другой  директории,
DirList  будет соответственно корректировать заголовок. Если пользова-
тель   извлек  директорию,  названную  C:\TEST\LONGDIR\NEXTDIR,  тогда
DirList сохранит заголовок, чтобы считать "C:...R\NEXTDIR\*.*".  Обра-
тите внимание на то, что длина заголовка составляет 20 символов.

     СМОТРИ ТАКЖЕ
     SetMask





                                - 23 -
     AddRejectString
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура AddRejectString(S : String);

     НАЗНАЧЕНИЕ
     Добавляет строку к набору, который должен отвергаться.

     ОПИСАНИЕ
     DirList  управляет  внутренним  объектом StringSet. Вы можете ис-
пользовать этот объект StringSet, чтобы отказаться от файлов, основан-
ных на их расширениях или других символах. В сочетании с функцией  от-
каза  RejectExtensions,  внутренний  объект StringSet представляется в
особых случаях как набор расширений. В этом случае параметр  S  должен
иметь особое расширение (например, "BAK"), которое вы не хотите, чтобы
появилось в списке директории.
     Так  как AddRejectString должна распределить пространство динами-
чески распределяемой области памяти для сохранения определенной строки
и обеспечивающих структуру данных, для этой процедуры это  может  быть
невозможным   из-за   ошибки   epNonFatal+ecOfMemory.   Обратитесь   к
GetLastError для того, чтобы проконтролировать это состояние.
     Для большей информации, смотрите подраздел "Фильтрация имени фай-
ла" во введении к этому разделу.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.AddRejectString(`BAK`);
     if Dir.GetLastError = 0 then
       Dir.SetRejectFunc(RejectExtenssions)
     else
       {Переполнение памяти};
     Dir.Process;


                                - 24 -
     В примере отвергаются все файлы с расширением "BAK".

     СМОТРИ ТАКЖЕ
     ClearRejectStrings                StringSetAdd

     ChangeDirectory
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура ChangeDirectory(Mask : ChangeCode : Byte);

     НАЗНАЧЕНИЕ
     Изменяет установленную  директорию  или  разрешает   пользователю
просмотреть среду вокруг установленной директории.

     ОПИСАНИЕ
     Процедура ChangeDirectory  является   оболочкой   вокруг   метода
Process из  DirList.  Предполагают,  что она создает этот метод легче,
чтобы использовать DirList как способ для изменения  директории.  Объ-
ект, который  процедуру  ChangeDirectory  снабжает ссылками уже должен
быть инициализирован при обращении своего конструктора. Любая настрой-
ка (на отказ, сортировку, формата и т.д.) уже должна быть установлена.
ChangeDirectory работает только с инициализированными списками  дирек-
тории, чтобы указывать единственный файл по одному.
     Mask является именем директория, к которому должно привести изме-
нения. Если  этот  параметр  является  не пустой строкой и не содержит
универсальных обозначений,  ChangeDirectory будет непосредственно про-
водить изменение  к  этой  директории при помощи обращения к процедуре
ChDir из Turbo Pascal, не изображая списка указания вообще. Если ChDir
не терпит  неудачу,  ChangeDirectory  передает предупредительную метку
cpWarning+ecPathNotFound, которую вы можете проверить при помощи обра-
щения к GetLastError.
     Если маска является пустой  строкой  или  содержит  универсальные
обозначения, ChangeDirectory  пытается построить список указания соот-
ветствующих директорий. Она делает так с помощью временного переключе-

                                - 25 -
ния к  функции отказа RejectFiles,  которая принуждает DirList показы-
вать только поддиректории в своем  перечне  указания.  Рассматриваемая
процедура преобразовывает пустую строку к маске поиска "*.*". Если об-
наружены не соответствующие директории,  ChangeDirectory передает пре-
дупредительную метку epWarning+ecPathNotFound и происходит выход.
     Если соответствующие директории обнаружены, ChangeDirectory обра-
щается к Process,  чтобы показать список указания этих элементов. Если
пользователь прокручивает этот список и нажимает  клавишу  <Enter>  на
определенной директории,   DirList  будет  использовать  маску  поиска
вновь, чтобы найти соответствующие директории в этом расположении.
     В эту  процедуру входит параметр ChangeCode.  ChangeCode является
кодом команды для частичного выхода DirList. Когда пользователь выпол-
няет нажатие комбинации клавиш, которая устанавливает соответствие для
этой команды выхода, Process будет завершаться и ChangeDirectory будет
изменять текущую директорию к последнему виду,  приведенному с помощью
списка указания.  Если   пользователь   выходит   из   любой   команды
ChangeCode, ChangeDirectory не изменяет текущую директорию.
     Если окно DirList было невидимое,  когда выполнялось обращение  к
ChangeDirectory, оно стирается снова до того,  как ChangeDirectory за-
вершается.

     ПРИМЕР
     uses
       Dos, OpCRT, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Dir : DirList;
     begin
       if not Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal) then
         Halt;
       Dir.ChangeDirectory(`*.*`, ccQuit);
     end.

     Этот пример  изображает список директорий и переключает выбранный
директорий, когда пользователь нажимает клавишу <Esc> (ccQuit).  Нажа-
тие клавиши <Esc>,  чтобы изменить директории,  является чем-то интуи-

                                - 26 -
тивным. Вы можете либо захотеть назначить  другой  ключ  выхода,  либо
оценить PathList.GetPathName  для  альтернативного метода переключения
директорий.

     СМОТРИ ТАКЖЕ
     PathList.GetPathName

     ClearRejectStrings / diOptionsAreOn
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура ClearRejectStrings;

     НАЗНАЧЕНИЕ
     Очищает набор строк от брака.

     ОПИСАНИЕ
     Внутренняя StringSet из DirList очищается и освобождается. Полная
директория будет вновь считываться, в следующий момент времени вызыва-
ется Process  или  PreloadDirList,  для того чтобы не пропадали файлы,
которые больше не являются бракованными.

     ПРИМЕР
     Dir.ClearRejectStrings;

     В этом примере очищаются от любых раннее определенных бракованных
строк.

     СМОТРИ ТАКЖЕ
     AddRejectString                   StringSet.Done
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция diOptionsAreOn(OptionFlags : Word) : Boolean;


                                - 27 -
     НАЗНАЧЕНИЕ
     Возвращает значение "верно", если все определенные опции "включе-
ны".

     ОПИСАНИЕ
     Эта функция проверяет опции списка директория, которые описывают-
ся при преставлении Constant в начале этого раздела.

     ПРИМЕР
     if Dir.diOptionsAreOn(diDirsUpcase) then
       {выполнить некоторое действие};

     В этом  примере  выполняется  действие,  если  опция diDirsUpcase
"включена".

     СМОТРИ ТАКЖЕ
     diOptionsOff                      diOptionsOn

     diOptionsOff / diOptionsOn
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура diOptionsOff(OptionFlags : Word);

     НАЗНАЧЕНИЕ
     Блокирует многочисленные опции.

     ОПИСАНИЕ
     Этот метод блокирует определенную опцию за исключением такой раз-
работанной опции  как BadDirOptions (смотрите раздел Constant,  приве-
денный выше).

     ПРИМЕР
     Dir.diOptionsOff(diOptimizeSize+diDirsUpcase+diFilesUpcase);

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

     ПРЕДСТАВЛЕНИЕ
     процедура diOptionsOn(OptionFlages : Word);

     НАЗНАЧЕНИЕ
     Приводит в действие многочисленные опции.

     ОПИСАНИЕ
     Этот метод приводит в действие определенную опцию(и), за исключе-
нием такой  разработанной  опции  как  BadDirOptions  (смотрите раздел
Constants, приведенный выше).

     ПРИМЕР
     Dir.diOptionsOn(diOptimizeSize+diDirsUpcase+diFilesUpcase);

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

     Done / FileCapacity
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     разрушитель информации Done; virtual;

     НАЗНАЧЕНИЕ
     Располагает список директории.

     ОПИСАНИЕ
     Этот разрушитель информации препятствует распределению пространс-
тва динамически распределяемой области памяти, которое DirList исполь-
зует, чтобы сохранить массивы директории,  располагает свой внутренний

                                - 29 -
StringSet (если таковой имеется) и затем обращается к PickList.Done.

     ПРИМЕР
     Dir.Done;

     В этом примере располагается пространство динамически распределя-
емой области памяти, которое использует Dir.

     СМОТРИ ТАКЖЕ
     PickList.Done                     StringSet.Done
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция FileCapacity : Word;

     НАЗНАЧЕНИЕ
     Возвращает максимальное  число файлов,  которое список может под-
держивать.

     ОПИСАНИЕ
     Когда DirList  инициируется,  вы  определяете  как  много  байтов
пространства динамически распределяемой области памяти  он  использует
для сохранения файла.  Это пространство разбивается между двумя масси-
вами: массивом DirRec (22 байта) и массивом DispRec (2 байта плюс мак-
симальная длина  каждой отформатированной строки файла).  FileCapacity
делит пространство динамически распределенной области памяти с помощью
байтов, которые  содержатся  в  файле  и возвращает максимальное число
файлов, которым DirList может управлять.
     Когда DirList пытается считать директорию, содержащую больше фай-
лов, чем он  может  обработать,  он  создает  предупредительную  метку
(epWarning+ecTooManyFiles), но  будет  продолжать обработку с файлами,
которые он должен сохранить.




                                - 30 -
     ПРИМЕР
     if not Dir.InitCustom(25, 5, 55, 20,   {Координаты окна}
             DefaultColorSet,               {Цветовой набор}
             DefWindowOptions or wBordered, {Опции окна}
             MaxAvail,                      {Пространство динамически
                                             распределенной области
                                             памяти для файлов}
             PickVertical,                  {Ориентация указания}
             SingleFile)                    {Манипулятор команд}
     then begin
       WriteLn(`Failed to Init DirList, Status = `, InitStatus);
       Halt;
     end;
     ...
     Dir.SetNameSizeTimeFormat(`<dir>`, `Mm/dd/yy`, `Hh:mmt`);
     WriteLn(`Maximum files: `, Dir.FileCapacity);

     Предположим, что  по крайней мере 64К смежного пространства дина-
мически распределяемой области памяти доступно,  этот пример будет по-
казывать, что 813 может управляться с помощью DirList.  Если использу-
ется более простой формат изображения,  Dir будет  способен  сохранять
соответственно больше файлов.  Например, используя более короткий фор-
мат, который активизируется с помощью SetNameFormat,  список может уп-
равлять 1477 файлами.

     СМОТРИ ТАКЖЕ
     Init

     Format / FormatMultiFile
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура Format(var X : DirRec; var pkCat : Byte;
                      var S : String); virtual;


                                - 31 -
     НАЗНАЧЕНИЕ
     Возвращает отформатированную строку и катерогию для элемента  ди-
ректории.

     ОПИСАНИЕ
     OPDIR обращается к этому эффективному методу, чтобы преобразовать
каждую неопробованную  файловую  запись (X) в отформатированную строку
(S) и категорию списка указания (pkCat).  Этот метод может переопреде-
ляться, благодаря получаемым типам, чтобы выполнить особый способ фор-
матирования. Выполнение из DirList процедуры Format  просто передается
при обращении к другой определенной пользователем процедуре управления.
     Для большей информации и для полных примеров обратите внимание на
рассуждения в  подразделе "Форматирование имени файла",  приведенном в
начале этого раздела.

     СМОТРИ ТАКЖЕ
     SetXxxFormat
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура FormatMultiFile(N : Word);

     НАЗНАЧЕНИЕ
     Перестраивает строку управления форматом для определенного файла.

     ОПИСАНИЕ
     Этот метод  обращается  к  функции  управления форматом для N-ого
файла. Он считывается внутреннюю DirRec, которая определяет свой вид в
списке указания.
     FormatMultiFile является полезной,  при печати обычной  программы
управления файлом назначения,  такой как DESKPOP окно Files. Предполо-
жим, что пользователем производится запрос,  чтобы привести отмеченный
набор файлов к состоянию чтения и,  что список устанавливается для по-
каза каждого атрибута файла.  Вместо повторного считывания  директории
после  отметки о изменениях, вы можете непосредственно скорректировать

                                - 32 -
каждую DirRec файла (используя указатель, который возвращается  с  по-
мощью  GetMultiDirPtr) и затем обратиться к FormatMultiFile, чтобы от-
корректировать ее строку изображения.

     ПРИМЕР
     {Сканировать все файлы}
     for N := 1 to Dir.GetMatchingFileCount do
       {Проверить для выбранных файлов}
       if Dir.ItemIsSelected(N) then begin
         {Привести файл к режиму только считывания}
         ...
         {Обозначить файл, как способного только к считыванию  до  тех
          пор пока имеет отношение к OPDIR}
         with Dir.GetMultiDirPtr(N)^ do
           Attr := Attr or ReadOnly;
         {Корректировать свои строки изображения}
         Dir.FormatMultiFile(N);
       end;

     Пример выполняется по сценарию,  описанному выше. Для каждого от-
меченного файла,  атрибут является набором для обеспечения только счи-
тывания и список модуля OPDIR корректируется, чтобы отразить это изме-
нение.  В следующий момент времени список составляется (наиболее веро-
ятно, при обращении к Process) и будут появляться изменения.

     СМОТРИ ТАКЖЕ
     GetMultiDirPtr

     Get FileName
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetFileName(Mask : String; FileAttr : Byte;
                         var Name : PathStr) : Word;


                                - 33 -
     НАЗНАЧЕНИЕ
     Устанавливает новую маску, указывает имя и возвращает их. Возвра-
щает состояние.

     ОПИСАНИЕ
     GetFileName  является  оболочкой  метода  Process из DirList. Она
создается при обращении к GetFileName, чтобы выбрать  одно  имя  файла
для программы. Объект, которому GetFileName относится, уже должен быть
инициализирован с помощью вызова его конструктора. Любая настройка (на
отказ,  сортировку, опции формата и т.д.) уже должна быть установлена.
GetFileName работает только с инициализированными списками директории,
чтобы указывать единстенный файл однократно.
     Mask является маской поиска для получения  файла.  Этот  параметр
обычно является неопределенной строкой, так чтобы пользователь ответил
на  приглашение "Enter filename" (введите имя файла). Прежде чем обра-
титься к GetFileName, вы должны вырезать начальный и  конечный  пустые
пробелы  из необработанной строки, вы можете также добавить устанавли-
ваемое по умолчанию расширение в нее. Строка Mask может дать  имя  су-
ществующему файлу, действительному новому файлу, драйверу или директо-
рии,  выражению  с  универсальными обозначениями или в целом ошибочным
ненужным данным. Функционирование GetFileName заключается в том, чтобы
отсортировать этот выход.
     FileAttr является атрибутом файла DOS для использования при выбо-
ре файлов. Чтобы избежать выбора, ориентированного только на  считыва-
ние, системные и скрытые файлы определяют 0 или Directory (директорию)
для FileAttr. Если вы устанавливаете бит Directory, пользователь будет
иметь  возможность увидеть элементы поддиректории и списки указания и,
при выборе таких элементов, будет иметь возможность  просматривать  на
винчестере.
     Name возвращает выбранное имя файла или пустую строку, если прои-
зошла ошибка.
     GetFileName  возвращает код состояния: нулевое значение для успе-
ха, еще код ошибки, совпадающий с кодом, описанным в Приложении D.
     Используя Mask,  GetFileName  корректирует  внутреннюю  структуру
данных из DirList и контролирует, чтобы увидеть как много соответству-

                                - 34 -
ющих файлов здесь существует. Если их нет, GetFileName завершается од-
ной из следующих комбинаций возвращаемых значений:

     GetFileName = epWarning+ecFileNotFound, Name = Mask

     Mask определяет действительное имя файла, на этот файл не сущест-
вует.

     GetFileName = epWarning+ecNoMoreFiles, Name =``

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

     GetFileName = epWarning+ecPathNotFound, Name = ``

     Mask определяет недействующий драйвер или директорию.

     Также возможно возвращение GetFileName некоторой  другой  ошибки,
подобной выходу из памяти.
     Если а) точно  существует  один файл, который соответствует Mask,
б) маска не имеет универсальных обозначений, в) окно директории уже не
видимо,  когда  обращаются  к  GetFileName и г) diExitIfOne из DirList
доступна, тогда GetFileName не показывает и не возвращает код  состоя-
ния 0 и окончательное имя пути доступа файла в параметр Name.
     И наоборот, GetFileName обращается к Process, чтобы показать спи-
сок  указания  соответствующих  файлов. Пользователь может просмотреть
список и в конечном счете выйти из него. Если  пользователь  выполняет
выбор (выходит с командой ccSelect), GetFileName возвращает код состо-
яния  0  и окончательное имя пути доступа. Если пользователь выходит с
некоторым другим  ключом  (например,  <Esc>),  GetFileName  возвращает
epWarning+ecNoPickSelection и Name = ".
     Если   окно  директории  было  невидимым  во  время  обращения  к
GetFileName, оно стирается до выхода из функции.
     Из-за разнообразия ошибок, которые можно  определить,  вы  должны
проверить  свое  значение  возврата,  прежде чем использовать значение

                                - 35 -
Name.

     ПРИМЕР
     uses
       Dos, OpString, OpCrt, OpFrame, OpWindow, OpPick, OpDir;
     var
       Dir : DirList;
       S : PathStr;
       Status : Word;
     begin
       {Инициализировать DirList и выбрать различные опции}
       Dir.InitCustom(25, 5, 55, 20, DefaultColorSet,
                      DefWindowOptions or wBordered,
                      MaxAvail, PickHorizontal, SingleFile);
       Dir.SetPadSize(1, 1);
       Dir.diOptionsOn(diOptimizeSize);
       Dir.AddMaskHeader(True, 1, 30, heTC);

       {Указать маску и выбрать файл}
       Write(`File to pick: `);
       ReadLn(S);
       Status := Dir.GetFileName(Trim(S), Directory, S);
       if Status <> 0 then
         WriteLn(`Status code: `, Status)
       else
         WriteLn(`Selected: `, S);
     end.

     В примере показывается список директории и допускается один выбор
файла.

     СМОТРИ ТАКЖЕ
     ChangeDirectory                   Process
     ExistFile (OPDOS)


                                - 36 -
     GetMatchingFileCount / GetMatchingSize
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetMatchingFileCount : Word;

     НАЗНАЧЕНИЕ
     Возвращает ряд файлов, относящихся к последней директории.

     ОПИСАНИЕ
     Этим является одинаковое число файлов, которые появляются в спис-
ке указания (или которые в конце концов появятся в списке указания,
если обращаются к методу PreloadDirList). Не включаются какие-либо
файлы, отвергнутые функцией Reject.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.PreLoadDirList;
     WriteLn(Dir.GetMatchingFileCount,` files matched.`);

     В этом примере предварительно загружается список директории и по-
казывается сосчитанное число файлов, которые соответствовали маске.

     СМОТРИ ТАКЖЕ
     FileCapacity
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetMatchingSize(ClusterSize : Word) : Longint;

     НАЗНАЧЕНИЕ
     Возвращает ряд байтов во все соответствующие файлы.



                                - 37 -
     ОПИСАНИЕ
     Функция использует такие же правила, которые использует DOS, что-
бы  округлять  точный  размер  файла  в  большую  сторону  с   помощью
ClusterSize.  Если вы хотите знать точную сумму размеров файлов, опре-
делите ClusterSize 1. И наоборот, используйте DOS размер кластера, ко-
торый обычно равен 2048. Вы можете найти действительный размер класте-
ра для DOS диска с помощью использования DOS.GetDiskInfo.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.PreLoadDirList;
     WriteLn(Dir.GetMatchingSize(2048),
             ` bytes in the matching files.`);

     В примере описывается число байт, которые используются всеми фай-
лами в текущей директории.

     GetMultiDirRec / GetMultiDirPtr
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура GetMultiDirRec(N : Word; var D : DirRec);

     НАЗНАЧЕНИЕ
     Возвращает полную DirRec для установленного файла.

     ОПИСАНИЕ
     Процедура обращается к внутреннему массиву DirRec для установлен-
ного файла. Если N равен нулю или больше, чем  текущее  число  файлов,
DirRec заполняется нулями.

     ПРИМЕР
     var
       N : Word;

                                - 38 -
       DR : DirRec;

     {...Сделать мульти-указание...}
     Dir.InitSequence(N);
     while Dir.HaveSelected(N) do begin
       Dir.GetMultiDirRec(N, DR);
       WriteLn(`Selected: `, DR.Name, ``, DR.Size);
       Dir.NextSelected(N);
     end;

     В  примере восстанавливается запись директории каждого выбранного
элемента и показывается имя файла и размер.  Смотрите  GetMultiFile  в
полном примере программы для выбора многочисленных файлов.

     СМОТРИ ТАКЖЕ
     GetmultiFile
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура GetMultiDirPtr(N : Word) : DirRecPtr;

     НАЗНАЧЕНИЕ
     Возвращает указатель к DirRec для установленного файла.

     ОПИСАНИЕ
     Процедура  возвращает адрес DirRec для установленного файла. Этот
указатель может быть использован, чтобы видоизменять  DirRec.  Если  N
равен  нулю или больше, чем текущее число файлов, GetMultiDirPtr возв-
ращает нуль. Смотрите FormatMultiFile во время применения этого  мето-
да.

     СМОТРИ ТАКЖЕ
     FormatMultiFile



                                - 39 -
     GetMultiFile / GetMultiPath
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetMultiFile(N : Word) : FileStr;

     НАЗНАЧЕНИЕ
     Возвращает 12-символьное имя установленного файла.

     ОПИСАНИЕ
     Возвращенная строка берется непосредственно из внутреннего масси-
ва  DirRec.  Она  всегда возвращается напечатанной в верхнем регистре.
Если N равно нулю или больше, чем текущее число  файлов,  возвращается
пустая строка.

     ПРИМЕР
     uses
       Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Dir : DirList;
       N : Word;
     begin
       Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal,
                MultipleFile);
       Dir.SetMask(`*.*`, AnyFile);
       DirSetSelectMarker(`<`, `>`);
       Dir.Process;
       Dir.Erase;
       Dir.InitSequence(N);
       while Dir.HaveSelected(N) do begin
         WriteLn(`Selected: `, Dir.GetMultiFile(N));
         Dir.NextSelected(N);
       end;
       Dir.Done;
     end.

                                - 40 -

     В примере показываются имена всех файлов, выбранных во время мно-
гократного выбора файла.

     СМОТРИ ТАКЖЕ
     GetMultiDirRec
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetMultiPath(N : Word) : PathStr;

     НАЗНАЧЕНИЕ
     Возвращает полное имя пути доступа установленного файла.

     ОПИСАНИЕ
     Функция  работает  подобно GetMultiFile, но возвращает полное имя
пути доступа (включая драйвер и директорию) установленного файла.

     СМОТРИ ТАКЖЕ
     GetMultiDirRec

     GetSelectedDir / GetSelectedDirRec
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetSelectedDir : DirStr;

     НАЗНАЧЕНИЕ
     Возвращает директорию выбранного файла.

     ОПИСАНИЕ
     Возвращенная  строка директории включает драйвер и поддиректорию.
Она завершается обратным слешом (если директория  не  является  корне-
вой). GetSelectedDir возвращает последнюю директорию, чья DOS директо-
рия была считана.

                                - 41 -

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.Process;
     Dir.Erase;
     if Dir.GetLastCommand = ccSelect then
       WriteLn(`selected `, Dir.GetSelectedFile,
               ` in directory `, Dir.GetSelectedDir);

     Пример показывает имя и директорию выбранного файла.

     СМОТРИ ТАКЖЕ
     GetSelectedFile                   GetSelectedPath
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура GetSelectedDirRec(var D : DirRec);

     НАЗНАЧЕНИЕ
     Возвращает полную DirRec для выбранного файла.

     ОПИСАНИЕ
     DirRec  поддерживает  не только имя файла, но и его размер, штамп
времени и атрибут. Этот метод не может быть вызван до  тех  пор,  пока
команда  Process не завершится без ошибки. В противном случае, возвра-
щенное значение будет заполняться нулями.

     ПРИМЕР
     var
       DR : DirRec;
     ...
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.Process;

                                - 42 -
     Dir.Erase;
     if Dir.GetLastCommand = ccSelect then
       Dir.GetSelectedDirRec(DR);
       WriteLn(`selected `, DR.Name, ` `. DR.Size, ` bytes`);
     end;

     Пример показывает имя и размер выбранного файла.

     СМОТРИ ТАКЖЕ
     GetSelectedFile                   GetSelectedPath

     GetSelectedFile / GetSelectedPath
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetSelectedFile : FileStr;

     НАЗНАЧЕНИЕ
     Возвращает 12 символьное имя выбранного файла.

     ОПИСАНИЕ
     Имя всегда возвращается в верхнем регистре. Оно не включает имени
директории файла. К этому методу нельзя обращаться до  тех  пор,  пока
команда  Process не завершится без ошибки. В противном случае, возвра-
щенное значение будет представлять собой пустую строку.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.Process;
     Dir.Erase;
     if Dir.GetLastCommand = ccSelect then
       WriteLn(`selected `, Dir.GetSelectedFile);

     Пример использует функцию GetSelectFile, чтобы показать, что  лю-

                                - 43 -
бое имя файла выбирается из списка.

     СМОТРИ ТАКЖЕ
     GetSelectedDirRec
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetSelectedPath : PathStr;

     НАЗНАЧЕНИЕ
     Возвращает полное имя пути доступа выбранного файла.

     ОПИСАНИЕ
     Этот метод объединяет GetSelectedDir и GetSelected File. Имя пути
доступа включает драйвер, директорию и имя файла. К этому методу нель-
зя обращаться до тех пор, пока команда Process не завершится без ошиб-
ки. В противном случае, возвращенное значение будет представлять собой
пустую строку.

     СМОТРИ ТАКЖЕ
     GetSelectedDir

     GetSelectedSize / Init
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetSelectedSize(ClusterSize : Word) : LongInt;

     НАЗНАЧЕНИЕ
     Возвращает общий размер всех выбранных файлов.

     ОПИСАНИЕ
     Этот  метод предназначен для использования с многократно выбирае-
мыми списками. Он суммирует размер каждого отмеченного файла после ок-
ругления его в большую сторону до самого ближайшего кластера. Для  по-

                                - 44 -
лучения большей информации о ClusterSize смотри GetMatchingSize.
     Чтобы  получить  размер  единственного  выбора файла, используйте
GetSelectedDirRec.

     ПРИМЕР
     {...Сделать мульти-указание...}
     WriteLn(`Total size of selected files:`, Dir.SelectedSize(2048));

     Пример показывает общий размер (в байтах) всех выбранных  файлов.
Смотрите  GetMultiFile для полного примера программы многократного вы-
бора файла.

     СМОТРИ ТАКЖЕ
     GetMatvhingSize
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор Init(X1, Y1, X2, Y2 : Byte;
                      HeapToUse : Word;
                      PickOrientation : pkGenlProc;
                      CommandInit : diInitCommandProc);

     НАЗНАЧЕНИЕ
     Инициализирует список директории.

     ОПИСАНИЕ
     Этот конструктор создает экземпляр DirList, используя  устанавли-
ваемые  по умолчанию опции окна (DefWindowOptions), устанавливаемый по
умолчанию цветовой набор (DefaultColorSet), устанавливаемые по умолча-
нию опции указания (DefPickOptions) и устанавливаемые по умолчанию оп-
ции директории (DefDirOptions). Более детально смотрите InitCustom.

     ПРИМЕР
     if not Dir.Init(25, 5, 55, 20,    {Координаты окна}
                     MaxAvail,         {Максимальное пространство  ди-

                                - 45 -
                                       намически распределяемой облас-
                                       ти памяти}
                     Pick orientation, {Ориентация указания}
                     SingleFile)       {Манипулятор команды}
     then begin
       WriteLn(`Failed to Init DirList, Status = `, InitStatus);
       Halt;
     end;
     ...

     Пример создает экземпляр Dir с устанавливаемыми по умолчанию  ок-
ном и опциями цвета.

     СМОТРИ ТАКЖЕ
     InitCustom

     InitCustom
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор InitCustom(X1, Y1, X2, Y2 : Byte;
                            var Colors : ColorSet;
                            Options : LongInt;
                            HeapToUse : Word;
                            PickOrientation : pkGenlProc;
                            CommandInit : diInitCommandProc);

     НАЗНАЧЕНИЕ
     Инициализирует  список  директории  с опциями и цветами заказного
окна.

     ОПИСАНИЕ
     Параметры X1, Y1, X2 и Y2  определяют  действительные  координаты
окна, в пределах которого список директории будет появляться. Colors и
Options представляются точно также как для PickList. Во время назначе-

                                - 46 -
ния устанавливаемых цветов, обратите внимание на то, что DirList расс-
матривает файлы как pkNormal элементы и поддиректории, как pkAlternate
элементы.
     HeapToUse представляет собой количество байтов пространства дина-
мически  распределяемой  области памяти, которое должно выделяться для
хранения имени файла. InitCustom будет выделять  самое  большее  $FFF1
байт.  Если невозможно выделить меньшее количество $FFF1 байт или байт
HeapToUse, конструктор не будет выполняться. Смотрите FileCapacity ме-
тод для получения информации об отношении между пространством  динами-
чески  распределяемой области памяти и максимальным числом управляемых
файлов.
     PickOrientation определяет ориентацию лежащую в основе  PickList.
Этот  параметр  может  принимать значение PickVertical, PickHorizontal
или PickSnaking.
     CommandInit определяет, управляет ли список директории многократ-
ным выбором файла или только единственным выбором  файла.  Приемлемыми
значениями  для  этого параметра являются MultipleFile или SingleFile.
Эти значения на самом деле являются процедурами, связанными при помощи
OPDIR.
     Конструктор InitCustom из PickList выполняет большую часть  рабо-
ты. Независимо от которой DirList.InitCustom устанавливает присваивае-
мый  по умолчанию фильтр устранения имени файла (RejectNone), присваи-
ваемую по умолчанию программу сортировки и присваиваемый по  умолчанию
формат  изображения  (SetNameFormat). Для получения большей информации
об этих опциях смотрите введение к этому разделу. Конструктор выделяет
пространство динамически распределяемой области памяти для  сохранения
имени  файла  и - если определяется манипулятор команды MultipleFile -
для выбранного BitSet. Пространство динамически распределяемой области
памяти для BitSet выделяется в дополнение  к  определенному  параметру
HeapToUse.  (Однако,  обычно  оно  имеет незначительный объем, так как
BitSet вмещает 8 файлов в каждом байте. Таким образом, 1600 файлов уп-
равляются 200-байтным BitSet.)
     Командный процессор PickCommand присваивается DirList. Этот  объ-
ект  присваивается  к  единичному  коду ucDir (для идентификации его к
ошибочным и помогающим манипуляциям). Для большего понимания  смотрите

                                - 47 -
подраздел во введении "Команды директории".
     Обратите  внимание на то, что объекту DirList присваивается уста-
навливаемые по умолчанию опции директории из DefDirOptions. Вы  можете
изменять эти опции при обращении к diOptionsOn или diOptionsOff, после
того как конструктор возвращает их.
     Если конструктор не выполняется, проверьте переменную  InitStatus
для подробно определенного кода ошибки.

     ПРИМЕР
     if not Dir.InitCustom(25, 5, 55, 20, {Координаты окна}
           DefaultColorSet                {Цветовой набор}
           DefWindowOptions or wBordered  {Опции окна}
           MaxAvail,                      {Максимальное пространство
                                          динамически распределяемой
                                          области памяти}
           PickHorizontal,                {Ориентация указания}
           SingleFile)                    {Манипулятор команды}
     then begin
       WriteLn(`Failed to Init DirList, Status = `, InitStatus);
       Halt;
     end;

     Пример  подтверждает Dir с окном, имеющим обрамление и устанавли-
ваемыми по умолчанию цветами.

     СМОТРИ ТАКЖЕ
     FileCapacity                      PickList.InitDeluxe

     Load
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор Load(var S : IdStream);































                                - 48 -
     НАЗНАЧЕНИЕ
     Загружает список из потока.

     ОПИСАНИЕ
     Параметр S представляет собой инициализированный потоковый объект
(например, потоковый файл, открытый для чтения). Обратите внимание  на
то,  что параметр S может быть любым приемником IdStream типа, который
включает DosIdStream, BufIdStream и MemIdStream.
     Конструктор Load считывает следующую последовательность байтов из
потокового S. Эти байты вероятно были записаны при предыдущем  обраще-
нии   к   DirList.Store.   Конструктор   Load   первым   обращается  к
PickList.Load, чтобы считать основной  PickList.  Затем  он  считывает
специфические данные для DirList, включая маски форматирования, наборы
отказа и указатели процедуры для устранения сортировки и процедур фор-
мата.
     Процедура  потоковой  регистрации  для DirList представляет собой
DirListStream. Существует также ряд указателей процедуры, которые дол-
жны быть зарегистрированы независимо.  Пример  программы,  приведенный
ниже, демонстрирует это. Более подробно смотрите Store.

     ПРИМЕР
     uses
       Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Dir : DirList;
       S : BufIdStream;
     begin
       {Загрузка окна директории из потока}
       S.Init(`DIRLIST.STM`, SOpen, 1024);
       S.RegisterHier(DirListStream);
       S.RegisterPointer(ptPickHorizontal, @PickHorizontal);
       S.RegisterPointer(ptPickSingleChoice, @SingleChoice);
       S.RegisterPointer(ptDirAllFormat, @AllFormat);
       S.RegisterPointer(ptDirSortName, @SortName);
       S.Get(Dir);
       S.Done;

                                - 49 -

       {Дать возможность}
       Dir.Process;
       Dir.Done;
     end.

     Пример подтверждает Dir из потока, созданного примером, приведен-
ным  в Store. Обратите внимание на то, что особо регистрируется проце-
дура ориентации указания, манипулятор команды указания, функция форма-
тирования директории и процедура сортировки директории.
     Смотрите BufIdStream (в OPROOT) для проверки  свойственной  этому
ошибки, используя потоки.

     СМОТРИ ТАКЖЕ
     PickList.Load                     Store

     PreloadDirList / Process
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура PreloadDirList;

     НАЗНАЧЕНИЕ
     Считывание директории зараннее.

     ОПИСАНИЕ
     К  этому методу можно обращаться до того, как появляется окно ди-
ректории или запрашивается выбор через Process. PreloadDirList исполь-
зует маску выбора, установленную с помощью SetMask, чтобы считать  DOS
директорию, и затем обращается к процедурам установленным по умолчанию
пользователем,  чтобы  устранять.  сортировать  и форматировать файлы.
Система внутренних флагов избегает повторения любой части этой  работы
до тех пор, пока некоторое внешнее изменение не потребует этого.
     Процедура  PreloadDirList может быть использована, чтобы избежать
изображения  окна  указания,  когда  обнаруживается  несоответствующий

                                - 50 -
файл. PreloadDirList также полезна для локализации потенциально значи-
тельной  задержки  (вплоть до нескольких секунд для больших директорий
со сложным форматированием даты/времени), которая, в противном случае,
случается, когда обращаются к Process методу.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.PreLoadDirList;
     Result := Dir.GetLastError;
     if Result <> o then
       WriteLn(`Fatal error `, Result)
     else
       Dir.Process;
     Dir.Done;

     В данном примере происходит загрузка списка директории до обраще-
ния к Process.

     СМОТРИ ТАКЖЕ
     GetFileName
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура Process; virtual;

     НАЗНАЧЕНИЕ
     Обрабатывает команды указания, передаваемые для выбора файла.

     ОПИСАНИЕ
     Метод  Process  из  DirList  следует  за общей моделью, описанной
CommandWindow.Process со следующими дополнениями и исключениями:
     Эта модель обращается к DirList.Process для выполнения  обработки
команды. Она выходит на любую команду, которая является командой выхо-
да из DirList, с возможным исключением ccSelect. Когда ccSelect вычис-

                                - 51 -
ляется и текущий элемент является поддиректорией,  DirList.Process  не
прекращается;  вместо этого, он считывает файлы в установленную дирек-
торию и продолжает обработку.
     Process обращается к ряду устанавливаемых по умолчанию  пользова-
телем  процедурам.  В  дополнение  к процедурам, подходящим к DirList,
DirList обращается к процедурам для фильтрации имени файла, сортировки
директории и форматирования имени файла. Для получения большей  инфор-
мации об этих процедурах смотрите введение к этому разделу.

     ПРИМЕР
     В качестве полного примера, смотрите введение к этому разделу.

     СМОТРИ ТАКЖЕ
     ChangeDirectory                   GetFileName
     CommandWindow.Process             DirList.Process

     Reject / RemoveMultiFile
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция Reject(var X : DirRec) : Boolean; virtual;

     НАЗНАЧЕНИЕ
     Возвращает  значение "верно", когда исключается отдельный файл из
списка.

     ОПИСАНИЕ
     OPDIR обращается к этому эффективному  методу,  чтобы  определить
должна  ли  добавляться  каждая  запись  неподготовленного файла (X) к
списку для показа. Если Reject возвращает значение "верно", имя  файла
будет  игнорироваться,  и в распечатке директории не будет упоминаться
файл. Выполнение Reject из DirList просто обращается к устанавливаемой
по умолчанию пользователем процедуре через указатель процедуры.
     Для получения большей информации смотрите  подраздел  "Фильтрация
имени файла" во введении к этому разделу.

                                - 52 -

     СМОТРИ ТАКЖЕ
     SetRejectFune
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура RemoveMultiFile(N : Word);

     НАЗНАЧЕНИЕ
     Удаляет установленный файл из списка.

     ОПИСАНИЕ
     Процедура  RemoveMultiFile удаляет установленный файл из всех за-
писей DirList; при следующем обращении к Draw или Process файл  больше
не появится. Обращение к RemoveMultiFile смещает элементы, находящиеся
над N вниз на одну позицию в списке. Если N определяет в настоящий мо-
мент выделенный файл, подсветка будет перемещаться к файлу, следующему
за N, если N не является последним файлом.
     Этот  метод  полезен  при  записи программы управления файлами со
всеми признаками подобно программе в DESKPOP, где вы можете иметь  ко-
манду,  чтобы  физически уничтожить отмеченные файлы. Если вы обращае-
тесь к RemoveMultiFile, чтобы удалить каждый такой файл, вам нет необ-
ходимости заставлять DirList снова считывать, сортировать и форматиро-
вать список. Однако, неполезно снова вызывать Process  после  удаления
всех файлов.

     ПРИМЕР
     repeat
       {...сделать мульти-указание...}
       Dir.InitSequence(N);
       while Dir.HaveSelected(N) do begin
         Dir.RemoveMultiFile(N);
         Dec(N);
         Dir.NextSelected(N);
       end;

                                - 53 -
     until Finished;

     В  этом  примере удаляются все выбранные файлы из списка директо-
рии, затем повторяется указание. Мы уменьшаем значение N, чтобы  избе-
жать  пропуска вышестоящих выделенных файлов. Обратите внимание на то,
что в примере физически не стираются какие-либо файлы; в нем  как  раз
удаляются файлы из изображения директории.
     Чтобы сделать это более легко смотрите RemoveSelectedFiles. Смот-
рите  GetMultiFile,  где  приведен  весь пример многократных выделений
файлов.

     СМОТРИ ТАКЖЕ
     RemoveSelectedFile                RemoveSelectedFiles

     RemoveSelectedFile / RemoveSelectedFiles
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура RemoveSelectedFile;

     НАЗНАЧЕНИЕ
     Удаляет текущий файл из указанного списка.

     ОПИСАНИЕ Этот метод обращается к RemoveMultiFile с N-набором  для
текущего индекса файла.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Finished := False;
     repead
       Dir.Process;
       case Dir.GetLastCommand of
         ccSelect : Dir.RemoveSelectedFile;
         ccQuit   : Finished := True;

                                - 54 -
       end;
     until Finished;

     В этом примере удаляется каждый выбранный файл из списка.

     СМОТРИ ТАКЖЕ
     RemoveMultiFile
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура RemoveSelectedFiles;

     НАЗНАЧЕНИЕ
     Удаляет все выбранные файлы из списка.

     ОПИСАНИЕ
     Этот метод предназначается для использования со списками, исполь-
зующими многофайловое указание. С его помощью удаляются все отмеченные
файлы из списка при повторном обращении к RemoveMultiFile.

     ПРИМЕР
     Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, MultipleFile);
     Dir.SetMask(`*.*`, AnyFile);
     Dir.SelectMarker(`<`, `>`);
     Finished := False;
     repead
       Dir.Process;
       if Dir.GetSelectedCount = 0 then
         Finished := True
       else
         Dir.RemoveSelectedFiles;
     until Finished;

     В  этом примере удаляются все выбранные файлы после многократного
выделения файлов.

                                - 55 -

     СМОТРИ ТАКЖЕ
     RemoveMultiFile

     ResetList
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура ResetList;

     НАЗНАЧЕНИЕ
     Заставляет повторно считывать директорию в случае ее изменения.

     ОПИСАНИЕ
     Этот метод устанавливает ряд внутренних флагов  DirList,  которые
показывают,  что  методы  Draw,  PreloadDirList и Process должны снова
считать DOS директорию, отсортировать файлы, отформатировать все стро-
ки имен файлов, при этом необязательно вновь определять размер указан-
ного окна, вновь позиционировать подсвеченный курсор и  корректировать
заголовок маски. DirList обычно восстанавливает список таким  способом
только  тогда,  когда вы изменяете маску поиска (через SetMask). У вас
может возникнуть потребность восстановить список явно, если ваша прог-
рамма добавляет или удаляет файлы, или, иначе,  корректирует  директо-
рию, причем изменяет маску поиска из DirList.
     DirList обеспечивает другие методы, чтобы удалять файлы из списка
директории  (смотрите  RemoveMultiFile),  но не обеспечивает ни одного
метода, чтобы добавлять файлы. Подход, применяемый  в  RemoveMultiFile
будет более быстрым, чем в ResetList, в то время как он является прак-
тичным и подходящим.

     ПРИМЕР
     var
       F : File;
     begin
       {...Инициализация/установка Dir...}

                                - 56 -
       Finisfed := False;
       repeat
         Dir.Process;
         case Dir.GetLastCommand of
           ccSeledt :
             begin
               Assign(F, Dir.GetSelectedFile);
               System.Erase(F);
               ResetList;
             end;
           ccQuit :
             Finished := True;
         end;
       until Finished;
     end.

     Выделение файла приводит к удалению этого файла; ResetList гаран-
тирует,  что директория вновь считывается, когда Process вновь вызыва-
ется.

     СМОТРИ ТАКЖЕ
     RemoveMultiFile                   SetMask

     SelectedFileInCurDir / SelectItem
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция SelectedFileInCurDir : Boolean;

     НАЗНАЧЕНИЕ
     Возвращает значение "верно", если выбранный файл находится в  те-
кущей директории.

     ОПИСАНИЕ
     SelectedFileInCurDir  сравнивает  строку,  возвращенную с помощью

                                - 57 -
GetSelectedDir, со строкой, возвращенной с  помощью  процедуры  GetDir
языка  Turbo  Pascal  с номером драйвера 0. Следовательно, эта функция
возвращает значение "верно", если последний файл, выбранный с процеду-
ре Process, находится в текущей директории текущего драйвера.

     ПРИМЕР
     {...Указать файл...}
     if Dir.SelectedFileInCurDir then
       Fname := Dir.GetSelectedFile
     else
       Fname := Dir.GetSelectedPath;

     Если выбранный файл находится в текущей директории, он точно ссы-
лается  на  свое  имя; в противном случае используется полное имя пути
доступа.

     СМОТРИ ТАКЖЕ
     GetSelectedDir                    GetSelectedPath
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SelectItem(N : Word); virtual;

     НАЗНАЧЕНИЕ
     Выбирает элемент.

     ОПИСАНИЕ
     DirList.SelectItem замещает метод с таким же названием в PickList
для того, чтобы предотвратить маркировку  поддиректории.  Обращение  к
DirList.SelectItem,  где  N относится к элементу поддиректории, просто
игнорируется.
     Эта версия процедуры SelectItem  заставляет  DirList  вести  себя
так, как описано во введении "Команды директории". Однако, это означа-
ет, что вы не можете использовать DirList, чтобы отметить многочислен-
ные поддиректории для некоторого действия команды. Если вам необходимо

                                - 58 -
сделать так, используйте вместо этого объект PathList или еще извлеки-
те новый тип из DirList, который повторно замещает метод SelectItem.

     ПРИМЕР
     {...установка для мульти-указания...}
     repeat
       Dir.Process;
       case Dir.GetLastCommand of
         ccUser0 : for I := 1 to diCurFiles do
                     Dir.SelectItem(I);
         ccUser1 : for I := 1 to diCurFiles do
                     Dir.SelectItem(I);
         ccQuit : Finished := True;
       end;
     until Finished;

     В  примере  используется  команда завершения (ccUser0) для выбора
всех изображенных файлов однократным нажатием  клавиши.  Поддиректории
не будут отмечаться.

     СМОТРИ ТАКЖЕ
     PickList.SelectItem

     SetDirAttr / SetFileAttr
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetDirAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает атрибуты видеоизображения для директорий.

     ОПИСАНИЕ
     SetDirAttr  организует обращение к SetPickAttr для категории эле-
мента pkAlternate в невыбранном состоянии. Параметры Color и Mono  яв-

                                - 59 -
ляются атрибутами видеоизображения, которые могут использоваться соот-
ветственно в цветном и монохромном режимах видеоизображения.

     ПРИМЕР
     Dir.SetDirAttr($02, $70);

     В примере показаны имена директории зеленые на черном для цветных
мониторов, в негативном видеоизображении для монохромных мониторов.

     СМОТРИ ТАКЖЕ
     PickList.SetPickAttr              SetSelectDirAttr
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetFileAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает атрибуты видеоизображения для файлов.

     ОПИСАНИЕ
     SetFileAttr организует обращение к SetPickAttr для категории эле-
мента pkNormal в невыбранном состоянии. Параметры Color и Mono являют-
ся атрибутами видеоизображения, которые могут использоваться соответс-
твенно в цветном и монохромном режимах видеоизображения.

     ПРИМЕР
     Dir.SetFileAttr($06, $70);

     В  примере показаны имена файлов коричневые на черном для цветных
мониторов, в негативном видеоизображении для монохромных мониторов.

     СМОТРИ ТАКЖЕ
     PickList.SetPickAttr              SetSelectFileAttr



                                - 60 -
     SetMask
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetMask(Mask : String; FileAttr : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает маску и атрибут поиска и восстанавливает список.

     ОПИСАНИЕ
     Процедура SetMask сохраняет новую маску поиска  и  новый  атрибут
поиска в области данных объекта,  затем обращается к ResetList. В сле-
дующий момент  времени  вызываются  PreloadDirList,  Draw  и  Process;
DirList будет считывать DOS директорию,  сортировать список,  формати-
ровать файлы и т.п.
     Параметр  Mask  должен иметь действительный DOS параметр или уни-
версальную комбинацию. (Неверные маски могут определяются  аналогичным
образом;  DirList будет возвращать исправимую ошибку после более позд-
него обращения к PreloadDirList, Draw или Process.) Маске не требуется
определить текущий драйвер или директорию. Пустая маска представляется
так же как "*.*".
     FileAttr является атрибутом DOS файла, для подгонки.  DOS  модуль
определяет константы, которые определяют атрибуты. Обычные файлы имеют
атрибут  0;  вы  можете добавить следующие константы, чтобы определить
другие атрибуты.

     ReadOnly  = $01;
     Hidden    = $02;
     SysFile   = $04;
     VolumeID  = $08;
     Directory = $10;
     Archive   = $20;
     AnyFile   = $3F;

     Обратите внимание на то, что DOS использует дополнительные прави-

                                - 61 -
ла при  применении  этих  атрибутов.  Например,  если  вы  определяете
FileAttr=ReadOnly,  вы получите файлы, способные только считываться, в
дополнение к обычным файлам. Если вы определяете Directory, вы получи-
те директории и не директории. Вы получаете  Archive  (архивные) файлы
независимо от того устанавливаете ли вы или нет Archive бит. Вы можете
использовать  функцию отказа из DirList, чтобы отфильтровать файлы бо-
лее точно.

     ПРИМЕР
     Dir.SetMask(`*.*`, AnyFile);

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

     Dir.SetMask(`*.PAS`, 0);

     В этом примере перечисляются все файлы в текущей директории,  ко-
торые имеют расширение .PAS; не включаются поддиректории и специальные
файлы.

     СМОТРИ ТАКЖЕ
     ResetList

     SetRejectFunс
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetRejectFunс

     НАЗНАЧЕНИЕ
     Устанавливает изменяемую функцию отказа для выбора файла.

     ОПИСАНИЕ
     Этот  метод определяет функцию, по которой Reject будет обращать-

                                - 62 -
ся, чтобы определить должен ли добавляться каждый файл к списку дирек-
тории. Стандартные функции отказа включают RejectNone (по  умолчанию),
RejectExtensions и RejectFiles.
     Установленная функция RF должна компилироваться через FAR модель,
должна быть глобальной и должна иметь список параметров, который точно
соответствует типу diRejectFunc.
     Для  получения  большей информации смотрите подраздел "Фильтрация
имен файлов" в начале этого раздела.

     ПРИМЕР
     var
       Dir : DirList;
       {$F+}
       function MyRejectFunc(var D : DirRec; DirPtr : DirListPtr) :
                         Boolean;
       begin
         if RejectNone(D, DirPtr) then  {отклонить "." файлы и иденти-
           MyRejectFunc := True         фикацию тома}
         else if UpCase(D.Name[1]) = `A` then  {отклонить имена, ко-
           MyRejectFunc := True                торые начинаются с "A"}
         else
           MyRejectFunc := False;
       end;
       {$F-}
     begin
       Dir.Init(25, 5, 55, 20, MaxAvail, PickHorizontal, SingleFile);
       Dir.SetRejectFunc(MyRejectFunc);
       Dir.Process;
       Dir.Done;
     end.

     В примере устанавливается заказанная функция отказа, чтобы исклю-
чить все файлы, которые начинаются с буквы "A".

     SetRejectFunc(RejectFiles);

                                - 63 -

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

     СМОТРИ ТАКЖЕ
     AddRejectString                   Reject

     SetSelectDirAttr / SetSelectFileAttr
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetSelectDirAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает атрибуты видеоизображения для выбранной директория.

     ОПИСАНИЕ
     SetSelectDirAttr  просто  организует  обращение к SetPickAttr для
категории элемента pkAlternate в выбранном состоянии.  Это  определяет
атрибут для подсвеченного курсора в списке указания, когда он находит-
ся над именем поддиректории. Параметры Color и Mono являются атрибута-
ми видеоизображения для использования соответственно в режиме цветного
видеоизображения и монохромного видеоизображения.

     ПРИМЕР
     Dir.SetSelectDirAttr($03, $70);

     В  примере показываются выбранные директории цианитовые на черном
для цветных мониторов, в негативном видеоизображении  для  монохромных
мониторов.

     СМОТРИ ТАКЖЕ
     PickList.SetPickAttr              SetDirAttr
     ─────────────────────────────────────────────────────────────────


                                - 64 -
     ПРЕДСТАВЛЕНИЕ
     SetSelectFileAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает атрибуты видеоизображения для выбранного файла.

     ОПИСАНИЕ
     SetSelectFileAttr  организует обращение к SetPickAttr для катего-
рии элемента pkNormal в своем выбранном состоянии. Это определяет  ат-
рибут  для подсвеченного курсора в списке указания, когда он находится
над именем файла. Параметры Color и Mono являются  атрибутами  видеои-
зображения  для  использования  соответственно в цветном и монохромном
режимах.

     ПРИМЕР
     Dir.SetSelectFileAttr($03, $70);

     В примере показываются выбранные имена файлов цианитовые на  чер-
ном для цветных мониторов, в негативном видеоизображении для монохром-
ных мониторов.

     СМОТРИ ТАКЖЕ
     PickList.SetPickAttr              SetFileAttr

     SetSortOrder
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetSortOrder(SP : diSortProc);

     НАЗНАЧЕНИЕ
     Устанавливает параллельную ветвь программы для сортировки.

     ОПИСАНИЕ
     Этот  метод определяет процедуру, по которой SortList будет обра-

                                - 65 -
щаться, чтобы отсортировать файлы по порядку на  дисплее.  Стандартные
процедуры   сортировки  включают  SortName,  SortDirName,  SortSize  и
SortTime.
     Установленная функция SP должна компилироваться через FAR модель,
должна быть глобальной и должна иметь список параметров, который точно
соответствует diSortProc типу.
     Обращение  к  SetSortOrder  также  устанавливает внутренние флаги
DirList, которые принуждают эту процедуру повторно сортировать список,
так что в следующий момент времени вызывается Process.  Следовательно,
вы  можете изменять порядок сортировки в результате команды завершения
в Process методе и затем сразу вернутся назад, чтобы снова  обратиться
к  Process.  Если  вы определяете SortNone, Process заставляет считать
директорию из DOS порядка.
     Для получения большей информации  смотрите  подраздел "Сортировка
списка" в начале этого раздела.

     ПРИМЕРЫ
     SetSortOrder(SortNone);

     В  примере выполняется возвращение к DOS "порядку сортировки" пу-
тем повторного считывания директории с диска.

     SetSortOrder(SortDirName);

     В примере сначала выполняется сортировка директорий, затем сорти-
руются файлы по названию/расширению.

     СМОТРИ ТАКЖЕ
     SortList

     SetXxxFormat / SortList
     ─────────────────────────────────────────────────────────────────




                                - 66 -
     ПРЕДСТАВЛЕНИЕ

     процедура SetAllFormat(DirStr, DatePicture,
                            TimePicture : String);
     процедура SetNameFormat;
     процедура SetNameSizeFormat(DirStr : String);
     процедура SetNameSizeKFormat(DirStr : String);
     процедура SetNameSizeKTimeFormat(DirStr, DatePicture,
                                      TimePicture : String);
     процедура SetNameSizeTimeFormat(DirStr, DatePicture,
                                      TimePicture : String);
     процедура SetNameTimeFormat(DatePicture, TimePicture : String);
     процедура SetUserFormat(MaxFmatLen : Byte; FF : diFormatProc);

     НАЗНАЧЕНИЕ
     Процедуры устанавливают для определения формата директории.

     ОПИСАНИЕ
     DirList поддерживает семь стандартных форматов директорий так  же
как  один формат, который полностью устанавливается по умолчанию поль-
зователем. Эти семь  стандартных  форматов  предлагают  дополнительную
гибкость через характеристику масок, шаблонов для даты и времени. Фор-
маты,  которые поддерживают дату и время, доступны, если условный опе-
ратор UseDates приводился в действие в файле OPDEFINE.INC.
     Принимая параметры DatePicture=`mm/dd/yy` и TimePicture =`hh:mm`,
семь стандартных форматов образуют следующие выходные строки:
     Формат          Ширина          Пример
──────────────────────────────────────────────────────────────────────
SetNameFormat;         12 `nnnnnnnn.eee`
SetNameSizeKFormat     19 `nnnnnnnn.eee sssssK`
SetNameSizeFormat      22 `nnnnnnnn.eee sssssssss`
SetNameTimeFormat      27 `nnnnnnnn.eee 01/02/89 13:02`
SetNameSizeKTimeFormat 34 `nnnnnnnn.eee sssssK 01/02/89 13:02`
SetNameSizeTimeFormat  37 `nnnnnnnn.eee sssssssss 01/02/89 13:02`
SetAllFormat           42 `nnnnnnnn.eee sssssssss 01/02/89 13:02 RHSA`

                                - 67 -

     Также применяют следующие правила. Поддиректории в  NameFormat  и
NameTimeFormat  изображаются  добавлением  в  конце к имени символа "\".
Поддиректории  в  других  форматах  изображаются  благодаря  помещению
DirStr  в  колонку  размера.  Символ "K", используемый для изображения
единицы измерения - килобайт, представлен с помощью верхнего, если оп-
ция diFilesUpcase доступна, иначе - с помощью нижнего регистра.  Кбайт
равен  1024  байтам и емкость измеряемая в Кбайтах округляется до бли-
жайшего Кбайта. Если DatePicture и  TimePicture  пустые,  область  для
этих  параметров  не появляется на выходе. Символы, которые появляются
для атрибутов в AllFormat, управляются глобальными типовыми константа-
ми diReadOnlyChar, diHiddenChar, diSystemChar и diArchiveChar.
     Примечание: Чем больше формат, тем меньше число  файлов,  которые
                 могут  управляться в данном объеме пространства дина-
                 мически распределяемой области памяти. Для  получения
                 большей   информации   смотрите   содержимое   метода
                 FileCapacity и вводную часть для раздела  "Форматиро-
                 вание имени файла".

     СМОТРИ ТАКЖЕ
     FileCapacity
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SortList; virtual;

     НАЗНАЧЕНИЕ
     Сортирует список входных сообщений директории.

     ОПИСАНИЕ
     OPDIR обращается к этому эффективному методу, чтобы отсортировать
список  файлов  до  выполнения  форматирования и изображения файлов на
дисплее. Выполнение SortList, принадлежащей DirList,  просто  вызывает
другую  программу, установленную по умолчанию пользователем через ука-
затель процедуры. Более подробно смотрите подраздел "Сортировка  спис-

                                - 68 -
ка" во введении к этому разделу.

     СМОТРИ ТАКЖЕ
     SetSortOrder

     Store
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура Store(var S : IdStream);

     НАЗНАЧЕНИЕ
     Сохраняет список директории в потоке.

     ОПИСАНИЕ
     Параметр S представляет собой соответственно объект инициализиро-
ванного потока (обычно файл потока открытый для записи). Обратите вни-
мание на то,  что  S  может  иметь  IdStream  типа,  который  включает
DosIdStream, BufIdStream  и MemIdStream (хотя вы обычно не записываете
в MemIdStream).
     Процедура Store  записывает  образ  DirList  в параметр потока S.
Процедура начинается при обращении к PickList.  Store затем продолжает
записывать признак данных в DirList.
     Чтобы проверить на ошибки,  которые могут произойти во время про-
цедуры Store, вызывают функцию потока GetStatus.
     Процедура регистрации  потока  для  DirList  представляет   собой
DirListStream. Существует также ряд указателей процедур, которые необ-
ходимо зарегистрировать независимо.  Пример программы, приведенный ни-
же, демонстрирует каким образом это делается.  Эта регистрация требует
небольшого усилия на вашем пути; в свою очередь, изящная программа-ре-
дактор связей для Turbo способна разделить на секции кодов OPDIR - из-
менить форматы, отсортировать программы и т.д. - которые ваша програм-
ма в  действительности не использует.  Если мы зарегистрировали все из
них, необходимые для вас,  регистр связей будет зацеплять из все вмес-
те.

                                - 69 -
     Так как DirList строится на PickList,  большая часть  выдачи  ре-
гистраций PickList применяется к DirList. Для более  подробного описа-
ния смотрите PickList.Store.  Вам  не  требуется  регистрировать  саму
процедуру для  пользовательской  строки,  так как DirList поддерживает
особую процедуру и регистрирует ее для вас.
     DirList использует  три собственных указателя процедур для проце-
дур отказа, сортировки и форматирования; если вы используете какие-ни-
будь, но  установленные по умолчанию процедуры (RejectNone,  SortNone,
NameFormat), вам необходимо будет регистрировать процедуры, которые вы
используете. После примера, приведенного ниже, мы перечислим все стан-
дартные процедуры и повторно определенные регистрационные коды.

     ПРИМЕР
     uses Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var Dir : DirList;
         S : BufIdStream;
     begin
       {Инициализировать окно директории}
       DirInitCustom(25, 5, 55, 20, DefaultColorSet,
                     DefWindowOptions or wBordered,
                     MaxAvail, PickHorizontal, SingleFile);
       Dir.OptionsOn(diOptimizeSize);
       Dir.SetPadSize(1,1);
       Dir.SetAllFormat(`<dir>`, `Mm/dd/yy`, Hh:mmt`);
       Dir.SetSortOrder(SortName);

       {Сделать попытку}
       Dir.SetMask(`*.*`, AnyFile);
       Dir.Process;

       {Сохранить его в Stream}
       S.Init(`DIRLIST.STM`, SCreate, 1024);
       S.RegisterHier(DirListStream);
       S.RegisterPointer(ptPickHorizontal, @PickHorizontal);
       S.RegisterPointer(ptPickSingleChoice, @SingleChoice);

                                - 70 -
       S.RegisterPointer(ptDirAllFormat, @AllFormat);
       S.RegisterPointer(ptDirSortName, @SortName);
       S.Put(Dir);
       S.Done;
       Dir.Done;
     end.
     В примере обрабатывается Dir и сохраняется в потоке.  Пример  ре-
гистрирует адреса процедуры ориентации списка (PickHorizontal),  мани-
пулятора команды (SingleChoice), формата директории (AllFormat) и сор-
тировки директории  (SortName).  Обратите  внимание  на  использование
оператора "@",  который должен возвращать указатель для каждой назван-
ной процедуры  и функции.  Каждая из стандартно поддержанных процедур,
которая обеспечивалась модулем OPDIR,  имела предварительно определен-
ный регистрационный код,  который будет использоваться, чтобы избежать
конфликтов:
 Процедура или функция  Регистрационный код указателя  Категория
 ─────────────────────────────────────────────────────────────────────
 RejectNone             ptDirRejectNone                Фильтры отказа
 RejectExtensions       ptDirRejectExtensions            -"-
 RejectFiles            ptDirRejectFiles                 -"-
 SortNone               ptSortNone               Сортировка директории
 SortName               ptDirSortName                    -"-
 SortDirName            ptDirSortDirName                 -"-
 SortSize               ptDirSortSize                    -"-
 SortTime               ptDirSortTime                    -"-
 NameFormat             ptDirNameFormat           Форматирование файла
 NameSizeKFormat        ptDirNameSizeKFormat             -"-
 NameSizeFormat         ptDirNameSizeFormat              -"-
 NameTimeFormat         ptDirNameTimeFormat              -"-
 NameSizeKTimeFormat    ptDirNameSizeKTimeFormat         -"-
 NameSizeTimeFormat     ptDirNameSizeTimeFormat          -"-
 AllFormat              ptDirAllFormat                   -"-
 DirStringProc          ptDirStringProc                Процедуры для
                                                       строки указания
 MultiStringProc        ptDirMultiProc                   -"-

                                - 71 -

     Обратите внимание на то, что никогда не потребуется точно регист-
рировать одну из двух последних процедур,  так как OPDIR  регистрирует
подходящие для вас процедуры.
     Смотрите пример из процедуры Load,  в котором программа загружает
этот поток.
     Смотрите BufIdStream  (в  OPROOT)  для  проверки  соответствующей
ошибки, используя поток.

     СМОТРИ ТАКЖЕ
     Load                              PickList.Store

     UpdateContents
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура UpdateContents; virtual;

     НАЗНАЧЕНИЕ
     Обновляет содержание окна директории.

     ОПИСАНИЕ
     Вам нет    необходимости     непосредственно     обращаться     к
UpdateContents. Вместо этого обратитесь к Draw.
     UpdateContents выполняет следующие функции:
     Если ни  один  файл  не  доступен  для того,  чтобы показать его,
UpdateContents очищает окно и завершается.
     Эта процедура  корректирует  список внутренних файлов ( считывает
DOS директорию,  сортирует,  форматирует и т.д.), используя внутренние
флаги, которые  показывают,  как  много работы,  если таковая имеется,
процедура должна сделать.
     Она обращается к PickList.UpdateContents.

     СМОТРИ ТАКЖЕ
     PickList.UpdateContents

                                - 72 -


     2. PathList: выбор пути доступа.
     Объект PathList очень похож на объект DirList за исключением  то-
го, что он строго имеет дело с поддиректориями и не имеет дело с обыч-
ными файлами. PathList перечисляет все поддиректории на  установленном
драйвере и разрешает пользователю выбирать один из них.  Самой отличи-
тельной особенностью PathList является его способность изображать под-
директории в  "свободном формате",  который соединяет все директории с
их линейно-изображенными характеристиками, для достижения из взаимного
соответствия. PathList может также показать список,  используя обычные
DOS имена пути доступа, если необходимо.
     За исключением   выполнения   линейно-изображаемых  особенностей,
PathList намного проще,  чем DirList.  Ему не требуется дополнительных
блоков для  определенных  пользователем процедур отказа,  сортировки и
форматирования или опций для форматирования даты или времени.  Тем  не
менее, PathList остается достаточно схожим с DirList, что вам вероятно
потребуется знать об объекте DirList,  чтобы  получить  дополнительную
информацию.
     Здесь приводится пример программы,  в котором представлен  объект
PathList:

     program PathListExample;   {EXPATH.PAS}
     uses
       Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Path : PathList;
       SelPathStr;
       Result : Word;
     begin
       {Создать объект PathList с заказными опциями окна}
       if not Path.InitCustom(25, 5, 49, 20,  {Координаты окна}
                            DefaultColorSet,  {Цветовой набор}
              DefWindowOptions or wBordered,  {Опции окна}
                            8000,             {Максимальное пространс-

                                - 73 -
                                               тво динамически распре-
                                               деляемой области памя-
                                               ти для файлов}
                            PickVertical,     {Ориентация указания}
                            SinglePath)       {Манипулятор команды}
       then begin
         WriteLn(`Failed to Init PathList, Status = `, InitStatus);
         Halt;
       end;
       Path.paOptionsOn(paShowSize+paAltCurDir);
       Path.SetPadSize(1, 1);

       {Указать директорию}
       SelPath := Path.GetPathName(`C`);
       if SelPath <> `` then
         WriteLn(`Selected: `, SelPath)
       else begin
         if Result := <> 0 then
           WriteLn(`Error selecting directory, Result = `, Result)
         else
           WriteLn(`No directory selected`);
       end;
       Path.Done;
     end.

     Подобно DirList, конструктор PathList принимает параметр, который
показывает как много пространства динамически  распределяемой  области
памяти должно  отводиться  для внутреннего массива записей поддиректо-
рий. Каждая такая запись использует 19 байт, так что в этом случае пе-
ременная Path  может  управлять  до 421 поддиректорией.  (В отличие от
DirList, нет необходимости во втором массиве отформатированных строк.)
     Всякий раз когда PathList используется в своем,  установленным по
умолчанию режиме изображения древовидной диаграммы,  ориентация списка
должна иметь  PickVertical.  Любая другая ориентация может давать нео-
бычно выраженные древовидные диаграммы.

                                - 74 -
     PathList может  использоваться  либо в режиме SinglePath,  либо в
режиме MultiplePath.  При MultiplePath,  вы можете также обратиться  к
PickList.SetSelectMarker так, что обозначения будут видимыми.
     В этом примере мы устанавливаем опции PathList,  чтобы изобразить
общее число   байт,   которые   используются   в   каждой   директории
(paShowSize) и раскрасить текущую директорию в атрибуте   видеоизобра-
жения pkAltername (paAltCurDir).
     Метод GetPathName  является  эквивалентом  DirList.GetFileName  в
PathList. Предоставляя установленную букву драйвера, он инициализирует
внутренний массив  директории,  показывает  окно  указания,  разрешает
пользователю осуществлять выбор и возвращает выбранное имя пути досту-
па. GetPathName возвращает пустую строку,  если  произошла  какая-либо
ошибка.

     КОНСТАНТЫ
     paUpcase       = $0001; {Изображает директории большими буквами}
     paSetCurDir    = $0002; {Позиционирует курсив выбора над текущей
                              директорией}
     paShowSize     = $0004; {Показывает общее число байт, содержащих-
                              ся в каждой директории}
     paOptimizeSize = $0008; {Оптимизирует размер окна, когда считыва-
                              ется директория}
     paAltCurDir    = $0010; {Показывает текущую директорию в изменя-
                              ющемся атрибуте}

     Существуют опции,  которые влияют на поведение PathList. paUpcase
принуждает воспроизводить  имена директорий с помощью верхнего регист-
ра. Если эта опция недоступна,  имена директорий воспроизводятся с по-
мощью нижнего регистра.
     paSetCurDir заставляет установить метод Process на начальный  вы-
бор к текущей директории установленного драйвера.
     Когда paShowSize доступна, PathList показывает общее число байт в
каждой директории вслед за именем директории.
     paOptimizeSize позволяет автоматическое  задание  размеров  окна,
так что  окно  указания  сужается и расширяется в зависимости от коли-

                                - 75 -
чества соответствующих директорий. Повторное задание размеров выполня-
ется методом OptimizeSize из PickList; более подробно об этом смотрите
в разделе,  описывающим PickList. Обратите внимание на то, что эта оп-
ция выполняется  в том случае,  если определенная UseAdjustableWindows
действует.
     paAltCurDir заставляет  процедуру строки объекта PathList класси-
фицировать текущую директорию как pkAlternate,  так что PickList будет
показывать ее в различном цвете.

     DefPathOptions : Word = paSetCurDir;

     Установленные по умолчанию опции для PathList.

     BadPathOptions : Word = paReadDir+paFullPathDisp+paUpdating;

     Опции использовали    внутренне    объектом    PathList.   Методы
paOptionsOn и paOptionsOff не будут  изменять  эти  биты  слова  опции
PathList.

     paTee      = 1;  {┬}
     paPipe     = 2;  {│}
     paArrow    = 3;  {├}
     paBar      = 4;  {─}
     paEll      = 5;  {└}

     Опции составляют  указатель к PathDrawArray.  PathList использует
пять уникальных символов, чтобы изобразить древовидную диаграмму и об-
ращается к ним при помощи этих имен.

     paSingleDraw     : PathDrawArray = `┬│├└`;
     paDoubleDraw     : PathDrawArray = `╦║╠╚`;

     Стандартные массивы линейно-изображенных символов для древовидной
диаграммы. PathList использует paSingleDraw при помощи устанавливаемо-
го по умолчанию значения.  Вы можете выбрать различный массив символов

                                - 76 -
благодаря методу SetDrawingChars.

     ТИПЫ

     PathDrawArray = array[paTee..paEll] of Char;

     Эта процедура связывает изображаемые символы, которые используют-
ся для древовидной диаграммы директории.

     PathRec    =            {Данные из DOS SrearchRec}
       record
         PCat   : Byte;      {Категория указания}
         PLevel : Byte;      {Уровень вложения директории. Корень = 0}
         PSize  : Long int;  {Общее число байт, содержащееся в
                              директории}
         PName  : FileStr;   {Имя и расширение файла}
       end;
     PathRecArray = array[1..$FF00 div SizeOf(PathRec))] of PathRec;
     PathArrayPtr = ^PathRecArray;

     PathList управляет массивом PathRec,  одним для каждого поддирек-
тория на данном драйвере.  Массив хранит достаточное количество инфор-
мации, что PathList может создавать дерево директории, полное имя пути
доступа для каждой директории и  общий  размер  файлов  в  директории.
Конструкторы объекта  PathList  распределяют  так широко PathRecArray,
как позволяет определенное количество пространства динамически распре-
деляемой области  памяти.  Вы  будете  обращать  внимание  на то,  что
PathRec потребляет 19 байт, так что PathRec легко может изобразить ка-
ким количеством директорий вы можете управлять на данном драйвере.

     paInitCommandProc = procedure (P : PathListPtr;
                                    var StringProc : pkStringProc;
                                    var CommandInitProc : pkGenlProc);

     Тип процедуры  использовали конструкторы PathList,  чтобы опреде-

                                - 77 -
лить единственно или многократно выбираемый список  директории.  OPDIR
связывает процедуры  SinglePath и MultiplePath,  которые соответствуют
этому типу.

     PathListPtr = ^PathList;
     PathList =
       object(PickList)
         ...
       end;

     Объект PathList.

     Done / GetMultiPath
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     деструктор Done; virtual;

     НАЗНАЧЕНИЕ
     Распоряжается списком пути доступа.

     ОПИСАНИЕ
     Этот деструктор освобождает пространство динамически распределяе-
мой области памяти,  так что PathList использует для сохранения массив
директории и затем обращается к PickList.Done.

     ПРИМЕР
     Path.Done;

     В примере  освобождается  пространство динамически распределяемой
области памяти, использованной параметром Path.

     СМОТРИ ТАКЖЕ
     PickList.Done
     ─────────────────────────────────────────────────────────────────

                                - 78 -

     ПРЕДСТАВЛЕНИЕ
     функция GetMultiPath(N : Word) : PathStr;

     НАЗНАЧЕНИЕ
     Возвращает имя пути доступа установленного пути доступа.

     ОПИСАНИЕ
     Если параметр N равен 0 или больше, чем текущее число директорий,
возвращается пустая строка.  В противном случае,  GetMultiPath создает
имя пути  доступа  с помощью отслеживания внутреннего массива PathRec.
Строка включает букву драйвера.  Она не оканчивается  обратным  слешом
(если директория не является корневой директорией).

     ПРИМЕР
     uses
       Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Path : PathList;
       N : Word;
     begin
       Path.Init(25, 5, 55, 20, MaxAvail, PickVertical, MultiplePath);
       Path.SetSelectMarker(`<`, `>`);
       Path.Process;
       Path.Erase;
       Path.InitSequence(N);
       while Path.HaveSelected(N) do begin
         WriteLn(`Selected: `, Path.GetMultiPath(N));
         Path.NextSelected(N);
       end;
       Path.Done;
     end.

     Эта полная программа показывает  как  установить  и  использовать
PathList многократного выбора.  Она записывает полное имя пути доступа

                                - 79 -
из всех выбранных директорий с помощью обращения к GetMultiPath. Обра-
тите внимание  на  то,  что  многие  вызванные  методы  наследуются из
PickList.

     СМОТРИ ТАКЖЕ
     GetSelectedPath

     GetPathName
     ─────────────────────────────────────────────────────────────────
     ПРЕДСТАВЛЕНИЕ
     функция GetPathName(Drive : Char) ; PathStr;

     НАЗНАЧЕНИЕ
     Устанавливает  драйвер,  указывает путь доступа и возвращает его.
Возвращает пустую строку в случае ошибки.

     ОПИСАНИЕ
     GetPathName является обрамлением вокруг  Process  метода  объекта
PathList. Вызов GetPathName приводит к более легкому выбору единствен-
ного  имени  пути  доступа для программы. Объект, который обращается к
GetPathName, должен быть уже инициализирован при  помощи  обращения  к
собственному  конструктору. Любое изготовление по заказу (форматирова-
ние и опции окна) уже должно быть  установлено.  GetPathName  работает
только  с  инициализированными списками путей доступа, чтобы указывать
единственную директорию по одной.
     Драйвер обозначается буквой драйвера диска, которая должна  выби-
раться из ("A", "B" и т.д.). Если этот драйвер отличается от последне-
го  установленного драйвера, GetPathName должна выбрать диск для того,
чтобы считать полную структуру директории. Для многочисленных  драйве-
ров  со значительным числом файлов и директорий, этот процесс сканиро-
вания может занять несколько секунд или больше, до того как  пользова-
тель  получает  какую-либо обратную связь. Если задержка нежелательна,
вам лучше отказаться от этого процесса, используя Process метод непос-
редственно, что даст вам благоприятную возможность показать  сообщение
о состоянии в то время, когда сканируется структура директории.

                                - 80 -
     Если GetPathName возвращает пустую строку, функция несомненно об-
ращается  к GetLastError классифицировать код ошибки. Наиболее вероят-
ной причиной ошибки является неправильная буква, обозначающая драйвер.

     ПРИМЕР
     Path.InitCustom(25, 5, 55, 20, 8000, PickVertical, SinglePath);
     SelPath := Path.GetPathName(`C`);
     if SelPath <> `` then
       WriteLn(`Selected: `, SelPath)
     else begin
       Result := Path.GetLastErroe;
       if Result <> 0 then
         WriteLn(`Error selecting directory, Result = `, Result)
       else
         WriteLn(`No directory selected`);
     end;

     В примере вызывается GetPathName, чтобы показать структуру дирек-
тории драйвера C и разрешает пользователю выбрать директорию.

     СМОТРИ ТАКЖЕ
     PreloadPathList                   SetDrive

     GetSelectedPath / Init
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция GetSelectedPath : PathStr;

     НАЗНАЧЕНИЕ
     Возвращает выбранное имя пути доступа.

     ОПИСАНИЕ
     Функция GetSelectedPath работает подобно GetMultiPath, но возвра-
щает имя пути доступа только самой последней из выбранных директорий.

                                - 81 -

     ПРИМЕР
     var
       S : PathStr;
     ...
     Path.Process;
     Result := Path.GetLastError;
     if Result = 0 then
       S := Path.GetSelectedPath
     else
       {сообщить об ошибке}

     Строковая переменная S будет содержать полное  имя  пути  доступа
выбранной директории.

     СМОТРИ ТАКЖЕ
     GetMultiPath                      GetPathName
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор Init(X1, Y1, X2, Y2 : Byte;
                      HeapToUse : Word;
                      PickOrientation : pkGenlProc;
                      CommandInit : paInitCommandProc);

     НАЗНАЧЕНИЕ
     Инициализирует список путей доступа.

     ОПИСАНИЕ
     Этот  конструктор иллюстрирует примером PathList, используя уста-
новленные по умолчанию опции окна (DefWindowOptions), установленный по
умолчанию цветовой набор (DefaultColorSet), установленные по умолчанию
опции указания (DefPickOptions) и установленные по умолчанию опции ди-
ректории (DefPathOptions). Для получения  более  подробной  информации
смотрите InitCustom.

                                - 82 -

     ПРИМЕР
     if not Path.Init(25, 5, 55, 20,   {Координаты окна}
                      8000,            {Максимальное пространство ди-
                                        намически распределяемой об-
                                        ласти памяти для директорий}
                      PickVertical,    {Ориентация указания}
                      SinglePath)      {Манипулятор команды}
     then begin
       WriteLn(`Failed to Init PathList, Status = `, InitStatus);
       Halt;
     end;

     В примере иллюстрируется Path с установленными по умолчанию опци-
ями и цветами окна.

     СМОТРИ ТАКЖЕ
     InitCustom

     InitCustom
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор InitCustom(X1, Y1, X2, Y2 : Byte;
                            var Colors : ColorSet;
                            Options : Longint;
                            HeapToUse : Word;
                            PickOrientation : pkGenlProc;
                            CommandInit : paInitCommandProc);

     НАЗНАЧЕНИЕ
     Инициализирует Path с заказанными опциями окна.

     ОПИСАНИЕ
     Параметры X1, Y1, X2 и Y2 определяют действующие координаты окна,

                                - 83 -
в  пределах  которого  будет  появляться  список директории. Параметры
Colors и Options представляются точно также как для PickList. Для  оп-
ределения цветов, обратите внимание на то, что стандартное изображение
PathList  рассматривает все директории как элементы pkNormal с возмож-
ным исключением текущей директории, которую он рассматривает как  эле-
мент pkAlternate.
     HeapToUse является числом байтов пространства динамически распре-
деляемой области памяти, которое должно отводится для сохранения имени
файла.  InitCustom  будет отводить самое большее $FFF1 байтов. Если он
не может отводить меньшее количество байт чем $FFF1 или чем HeapToUse,
конструктор будет терпеть неудачу. Максимальное  число  директорий  не
драйвере  соответствует отведенному пространству динамически распреде-
ляемой области памяти кратному 19.
     PickOrientation определяет ориентацию лежащую в основе  PickList.
Этот  параметр  может  принимать значение PickVertical, PickHorizontal
или PickSnaking. Так как отображения PickList используют линейно-изоб-
ражаемый   древовидный   формат,   ориентация   должна   всегда   быть
PickVertical.
     CommandInit  определяет, управляет ли список пути доступа многок-
ратными выборами директории или только однократными. Приемлемыми  зна-
чениями  для этого параметра являются MultiplePath или SinglePath. Эти
значения в действительности являются процедурами, объединенными  моду-
лем OPDIR.
     Конструктор  InitCustom из PickList выполняет большую часть рабо-
ты. Размер элемента списка указания определяется, чтобы  гарантировать
точное появление одной колонки элементов.
     Помимо  того, PathList.InitCustom устанавливает драйвер для изоб-
ражения текущей, установленной по умолчанию директории. InitCustom  не
сканирует  его для просмотра директорий; он только устанавливает флаг,
который показывает, что  сканирование  все  же  должно  быть  сделано.
InitCustom  также  устанавливает размер сектора (для вычисляемой суммы
байт в директории) к 1.
     Конструктор отводит пространство динамически  распределяемой  об-
ласти памяти для сохранения директории и - если определяется манипуля-
тор  команды  MultiplePath - для выделенного BitSet. Обратите внимание

                                - 84 -
на то, что пространство динамически распределяемой области памяти  яв-
ляется дополнением к HeapToUse. (Однако, оно обычно небольшое, так как
BitSet  указывает  8  файлов  в каждом байте: 400 файлам соответствует
50-байтный BitSet.)
     Командный процессор PickCommands присваивается к PathList. Объек-
ту присваивается единичный код ucDir (для идентификации ошибки и соот-
ветствующей  для нее программы обработки). Для более полной информации
смотрите подраздел "Команды директории" во введении к DirList.
     Обратите внимание на то, что объекту PathList присваиваются уста-
новленные по умолчанию опции директории из DefPathOptions.  Вы  можете
изменить  их благодаря обращению к paOptionsOn или paOptionsOff, после
того как конструктор возвращает значение.
     Если конструктор не выполняется, проверьте переменную  InitStatus
на подробном коде ошибки.

     ПРИМЕР
     if not Path.InitCustom(25, 5, 49, 20,  {Координаты окна}
                          DefaultColorSet,  {Цветовой набор}
            DefWindowOptions or wBordered,  {Опции окна}
                          8000,             {Максимальное пространс-
                                             тво динамически распре-
                                             деляемой области памя-
                                             ти для файлов}
                          PickVertical,     {Ориентация указания}
                          SinglePath)       {Манипулятор команды}
       then begin
         WriteLn(`Failed to Init PathList, Status = `, InitStatus);
         Halt;
       end;

     В примере присваивается значение Path с установленными по умолча-
нию цветами и обрамленным окном.

     СМОТРИ ТАКЖЕ
     Init                              PickList.InitCustom

                                - 85 -

     Load
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     конструктор Load(var S : IdStream);

     НАЗНАЧЕНИЕ
     Загружает список путей доступа из потока.

     ОПИСАНИЕ
     Параметр  S  является  соответственно инициализированным объектом
потока (например, потоковым файлом,  открытым  для  чтения).  Обратите
внимание  на то, что параметр S может быть любым потомком IdStream ти-
па, который включает DosIdStream, BufIdStream и MemIdStream.
     Load считывает следующую последовательность байтов из  потокового
S.  Эти  байты  вероятно  были  записаны  при  предыдущем  обращении к
PickList.Store.   Конструктор   Load   прежде   всего   обращается   к
PickList.Load,  чтобы  считать  основной  PickList. Затем он считывает
данные специфические для PathList, включая строку, изображающую симво-
лы, выбранный драйвер и флаги опции.
     Процедура    потоковой    регистрации   для   PathList   является
PathListStream. Единственные указатели процедур, которые вам необходи-
мо зарегистрировать независимо от чего-либо, являются указатели,  свя-
занные  с основным PickList. Для получения большей информации смотрите
PickList.Load.

     ПРИМЕР
     uses
       Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var
       Path : PathList;
       S : BufIdStream;
     begin
       S.Init(`PATHLIST.STM`, SOpen, 1024);

                                - 86 -
       S.RegisterHier(PathListStream);
       S.RegisterPointer(ptPickVertical, @PickVertical);
       S.RegisterPointer(ptPickSingleChoice, @SingleChoice);
       S.Get(Path);
       S.Done;
       Path.Process;
       Path.Done;
     end.

     В примере присваивается значение Path из потока, который создан в
примере процедуры Store при обращении к Get, который косвенно  обраща-
ется к PathList.Load.
     Смотрите BufIdStream (в OPROOT) для проверки соответствующих оши-
бок, используя потоки.

     СМОТРИ ТАКЖЕ
     Store                             PickList.Load

     paOptionsAreOn / paOptionsOff / paOptionsOn
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     функция paOptionsAreOn(optionFlags : Word) : Boolean;

     НАЗНАЧЕНИЕ
     Возвращает значение "верно", если все установленные опции включе-
ны.

     ОПИСАНИЕ
     Эта функция тестирует опции списка путей доступа, которые опреде-
ляются в описаниях Constant, которые приводятся в начале этого раздела.

     ПРИМЕР
     if Path.paOptionsAreOn(paShowSize) then
       {взять некоторое действие}

                                - 87 -

     В примере берется некоторое действие, если опция paShowSize вклю-
чена.
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура paOptionsOff(OptionFlags : Word);

     НАЗНАЧЕНИЕ
     Дезактивирует многократные опции.

     ОПИСАНИЕ
     Этот  метод дезактивирует установленную опцию(и), исключая опцию,
определенную как BadPathOptions (смотрите раздел  "Константы",  приве-
денный выше).

     ПРИМЕР
     Path.paOptionsOff(paShowSize);

     В примере выключается опция для показа размера директории.
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура paOptionsOn(OptionFlags : Word);

     НАЗНАЧЕНИЕ
     Активизирует многократные опции.

     ОПИСАНИЕ
     Этот  метод  активизирует установленную опцию(и), исключая опцию,
определенную как BadPathOptions (смотрите раздел  "Константы",  приве-
денный выше).

     ПРИМЕР
     Path.paOptionsOn(paShowSize+Upcase);

                                - 88 -

     В  примере  включается опция для изображения директорий с помощью
верхнего регистра и показа размера директории.

     PreloadPathList / Process
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура PreloadPathList;

     НАЗНАЧЕНИЕ
     Считывает пути доступа зараннее.

     ОПИСАНИЕ
     К этому методу можно обращаться до того, как  появится  окно  или
запрашивается  выбор через Process. PreloadPathList сканирует внутрен-
нюю структуру директории с драйвера, установленную благодаря SetDrive.
Система внутренних флагов избегает повторение любой части этой  работы
до  тех  пор,  пока некоторое внешнее изменение (такое как определение
другого драйвера) не запрашивает его.
     Этот метод особенно полезен , когда драйвер, будучи отсканирован-
ным, является достаточно многочисленным, чтобы объяснить  значительную
задержку.  Вы  можете записать сообщение "пожалуйста будьте точнее" до
обращения к PreloadPathList и затем стереть сообщение до  обращения  к
Process.
     Если  выбранный драйвер неправильный, PreloadPathList будет обра-
зовывать  ошибку,  которую  вы  можете  проверить  путем  обращения  к
GetLastError.

     ПРИМЕР
     Path.Init(25, 5, 55, 20, 8000, PickVertical, SinglePath);
     Path.SetDrive(`C`);
     FastWrite(`Please wait...`, ScreenHeight, 1, TextAttr);
     Path.PreloadPathList;
     FastWrite(`              `, ScreenHeight, 1, TextAttr);

                                - 89 -
     if Path.GEtLastError = 0 then
       Path.Process
     else
       FastWrite(`Invalid drive`, ScreenHeight, 1, TextAttr);

     В этом примере изображается сообщение о состоянии в то время, как
сканируется драйвер C.

     СМОТРИ ТАКЖЕ
     SetDrive
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура Process; virtual;

     НАЗНАЧЕНИЕ
     Изображает список и получает одну выборку.

     ОПИСАНИЕ
     Метод  Process  из DirList следует за универсальной моделью, опи-
санной  под  воздействием  CommandWindow.Process.  Он   обращается   к
PickList.Process,  чтобы получить выборки всякий раз, когда массив ди-
ректории уже образован. Если массив директории предварительно не обра-
зован, может возникнуть существенная задержка в то время, когда  OPDIR
сканирует определенный жесткий диск.

     ПРИМЕР
     Для полного примера смотрите введение к этому разделу.

     СМОТРИ ТАКЖЕ
     CommandWindow.Process             PickList.Process
     GetPathName

     ResetList / SetClusterSize
     ─────────────────────────────────────────────────────────────────

                                - 90 -

     ПРЕДСТАВЛЕНИЕ
     процедура ResetList;

     НАЗНАЧЕНИЕ
     Заставляет  повторно  считывать из директорий, когда они вероятно
изменялись.

     ОПИСАНИЕ
     Этот метод устанавливает внутренние флаги объекта PathList, кото-
рые показывают, что методы Draw, PreloadPathList и Process должны ска-
нировать  установленный  диск,  чтобы  считать  все  директории   DOS.
PathList обычно переустанавливает список только в том случае, когда вы
изменяете  выбранный  драйвер (через SetDrive). У вас может возникнуть
необходимость заново считать в явном виде список, если ваша  программа
добавляет или удаляет поддиректории или, в противном случае, корректи-
рует структуру директории, не изменяя выбранный драйвер.

     ПРИМЕР
     repeat
       Path.Process;
       {...Выполнить команды завершения...}
       Path.ResetList;
     until Finished;

     Список  пути  доступа заново устанавливается после выполнения ко-
манд завершения (в том случае, когда команды завершения изменили физи-
ческую структуру директории).

     СМОТРИ ТАКЖЕ
     SetDrive
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetClusterSize(Size : Word);

                                - 91 -

     НАЗНАЧЕНИЕ
     Устанавливает размер кластера для настраиваемых файлов к DOS гра-
ницам.

     ОПИСАНИЕ
     Когда опция paShowSize разрешена, PathList показывает общее число
байт, использованное в каждой поддиректории. При установке по  умолча-
нию эта опция сохраняет сумму точного числа байт, переданного для каж-
дого файла с помощью FindFirst/FindNext. В действительности, DOS отво-
дит  дисковое  пространство  в  кластерах  так, что общее используемое
пространство   будет   больше,   чем   сумма   переданных    размеров.
SetClusterSize позволяет вам принять в расчет этот эффект.
     Самое  типичное  значение,  которое должно определяться для Size,
равно 2048. Вы можете найти действительный  размер  кластера  для  DOS
диска при использовании DOS GetDiskInfo.
     Обратите  внимание на то, что PathList вычисляет размер, когда он
сканирует структуру директории. Следовательно, вы должны обратиться  к
SetClusterSize  до  вызова  PreloadDirList, Draw или Process. Обычно у
вас будет возникать желание обращаться к SetClusterSize непосредствен-
но после обращения к конструктору объекта.

     ПРИМЕР
     Path.paOptionsOn(paShowSize);
     Path.SetClusterSize(2048);

     Размеры директорий, показанные в их изображении  Path,  не  будут
равны сумме действительных размеров файлов, но будут вместо этого рав-
няться  сумме  (в байтах) общего числа кластеров, использованных в ди-
ректории.

     СМОТРИ ТАКЖЕ
     paOptionsOn



                                - 92 -
     SetDrawingChars / SetDrive
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetDrawingChars(P : PathDrawArray);

     НАЗНАЧЕНИЕ
     Устанавливает символы, которые используются для линейной графики.

     ОПИСАНИЕ
     Когда PathList показывает директорию в "формате дерева",  он  ис-
пользует  массив линейно-изображающих символов для создания наглядного
дерева. По умолчанию он использует одноразмерный IBM линейно-изобража-
ющий набор символов. Вы можете проверить этот набор  при  обращении  к
SetDrawingChars. OPDIR связывает два напечатанные константы соответст-
вующего  типа - paSingleDraw и paDoubleDraw - или вы можете определить
другие константы, если необходимо.

     ПРИМЕР
     Path.SetDrawingChars(paDoubleDraw);

     Этот путь доступа будет изображен,  используя  набор  изображения
paDoubleDraw (все двойные линии).

     СМОТРИ ТАКЖЕ
     SetFullPathMode
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetDrive(Drive : Char);

     НАЗНАЧЕНИЕ
     Определяет драйвер для списка путей доступа.



                                - 93 -
     ОПИСАНИЕ
     Когда вы впервые инициализируете объект PathList, от автоматичес-
ки  выбирает текущий устанавливаемый по умолчанию драйвер, как драйвер
для анализа и выбора из него. Обратитесь к SetDrive, чтобы  определить
другой  драйвер.  Если буква, обозначающая драйвер, отличается от пос-
ледней определенной буквы, обозначающей  драйвер,  SetDrive  сохраняет
новый  символ драйвера и обращается к ResetList так, что массив дирек-
тории будет корректироваться при следующем требовании.
     Обратите внимание на то, что SetDrive не проверяет  достоверность
установленного  драйвера.  Ошибки  не будут обнаруживаться до тех пор,
пока не обратятся к PreloadPathList, Draw или Process.

     ПРИМЕР
     Path.Init(25, 5, 55, 20, 8000, PickVertical, SinglePath);
     Path.paOptionsOn(paShowSize);
     Path.SetDrive(`C`);
     Path.Process;

     Этот пример использует SetDrive, чтобы установить текущему  драй-
веру символ "C". Process затем показывает всю структуру директорий для
драйвера C.

     SetDrive(`C:`);

     Неточность! Параметр для SetDrive представляет собой единственный
                 символ; отсутствие двоеточия необходимо или  допуска-
                 ется.

     СМОТРИ ТАКЖЕ
     ValidDrive (OPDOS)

     SetFullPathMode / SetLineDrawMode
     ─────────────────────────────────────────────────────────────────



                                - 94 -
     ПРЕДСТАВЛЕНИЕ
     процедура SetFullPathMode;

     НАЗНАЧЕНИЕ
     Показывает иерархию с полными именами пути доступа.

     ОПИСАНИЕ
     PathList  поддерживает переменный формат изображения, который мо-
жет быть полезным в некоторых ситуациях. Вместо  использования  линей-
но-изображающихся  символов  и как раз уникальных частей каждого имени
директории, он может изображать полное имя пути доступа каждой  дирек-
тории.   SetFullPathMode   выбирает   изменяемую  строковую  процедуру
PickList. Изображение не будет корректироваться до тех  пор,  пока  не
обратятся к Draw или Process. Обратите внимание на то, что требования,
обусловленные  размерностью окна, полного вида пути доступа отличаются
от линейно-изображаемого вида. (Полный путь доступа обычно требует бо-
лее широкое окно.) Обычно вы должны обращаться к  SetFullPathMode  не-
посредственно после обращения к конструктору объекта PathList.

     ПРИМЕР
     Path.SetFullPathMode;

     Путь доступа будет изображаться, используя полные имена пути дос-
тупа вместо линейно-изображающего набора.
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetLineDrawMode;

     НАЗНАЧЕНИЕ
     Показывает иерархию линейно-изображаемыми символами (устанавлива-
емыми по умолчанию).

     ОПИСАНИЕ
     Вам нет необходимости обращаться к этой процедуре, если вы не хо-

                                - 95 -
тите  изменить  окно объекта PathList, которое поддерживает как линей-
но-изображаемый вид, так и вид полного пути доступа. Линейно-изобража-
емый вид является устанавливаемым по умолчанию, когда вы подтверждаете
окно объекта PathList.

     ПРИМЕР
     Path.SetLineDrawMode;

     Путь  доступа  будет изображаться, используя линейно-изображаемые
символы.

     СМОТРИ ТАКЖЕ
     SetDrawingChars

     SetPathAttr / SetSelectPathAttr
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура SetPathAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает атрибут видеоизображения для путей доступа.

     ОПИСАНИЕ
     Процедура SetPathAttr просто осуществляет обращение к SetPickAttr
для категории элемента pkNormal в своем невыделенном состоянии.  Пара-
метры Color и Mono являются атрибутами видеоизображения, которые долж-
ны использоваться соответственно в цветном и монохромном режимах.

     ПРИМЕР
     Path.SetPathAttr($0E, $70);
     Невыбранные  директории  будут  изображаться цианитовым цветом на
черном на цветных мониторах, белым на черном для  монохромных  монито-
рах.
     ─────────────────────────────────────────────────────────────────

                                - 96 -

     ПРЕДСТАВЛЕНИЕ
     процедура SetSelectPathAttr(Color, Mono : Byte);

     НАЗНАЧЕНИЕ
     Устанавливает  атрибуты видеоизображения для выбранного пути дос-
тупа.

     ОПИСАНИЕ
     Процедура  SetSelectPathAttr  просто  осуществляет  обращение   к
SetPickAttr для категории элемента pkNormal в своем выделенном состоя-
нии.  Это определяет атрибут для подсвеченного курсора в списке указа-
ния, когда он находится над именем директории. Параметры Color и  Mono
являются  атрибутами  видеоизображения,  которые должны использоваться
соответственно в цветном и монохромном режимах видеоизображения.

     ПРИМЕР
     Path.SetSelectPathAttr($0E, $70);

     Выбранные директории будут изображаться желтым цветом на черном в
цветных  мониторах,  обратным видеоизображением на монохромных монито-
рах.

     Store / UpDateContents
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура Store(var S : IdStream);

     НАЗНАЧЕНИЕ
     Сохраняет список в потоке.

     ОПИСАНИЕ
     Параметр S является  соответственно  инициализированным  объектом
потока (обычно потоковый файл открыт для записи). Обратите внимание на

                                - 97 -
то,  что  параметр  S может быть любым потомком IdStream типа, который
включает DosIdStream, BufIdStream и MemIdStream (хотя вы обычно не за-
писываете в MemIdStream).
     Процедура Store сохраняет образ объекта PathList для параметра  S
потока. Она начинается при обращении к PickList.Store, затем продолжа-
ет сохранять данные специфические для PathList.
     Чтобы  контролировать  ошибки,  которые  могут возникать во время
процедуры Store, обращайтесь к функции потока GetStatus.
     Процедура   потоковой   регистрации   для    PathList    является
PathListStream. Единственными указателями процедуры, которые независи-
мо  могут потребоваться для регистрации, являются указатели, связанные
лежащим в основе PickList. Для получения  более  подробной  информации
смотрите PickList.Store.

     ПРИМЕР
     uses Dos, OpCrt, OpRoot, OpCmd, OpFrame, OpWindow, OpPick, OpDir;
     var Path : PathList; S : BufIdStream;
     begin
     Path.Init(25, 5, 55, 20, 8000, PickVertical, SinglePath);
     Path.paOptionsOn(paShowSize);
     Path.SetDrive(`C`);
     {Сохранить его в потоке}
       S.Init(`PATHLIST.STM`, SCreate, 1024);
       S.RegisterHier(PathListStream);
       S.RegisterPointer(ptPickVertical, @PickVertical);
       S.RegisterPointer(ptPickSingleChoice, @SingleChoice);
       S.Put(Path);
       S.Done;
       Path.Done;
     end.

     В  примере  демонстрируется Path и сохраняется в потоке. Смотрите
Load для программы, чтобы загрузить поток.
     Смотрите BufIdStream  (в  OPROOT)  для  проверки  соответствующей
ошибки, используя поток.

                                - 98 -

     СМОТРИ ТАКЖЕ
     Load                              PickList.Store
     ─────────────────────────────────────────────────────────────────

     ПРЕДСТАВЛЕНИЕ
     процедура UpDateContents; virtual;

     НАЗНАЧЕНИЕ
     Обновляет окно полного указания.

     ОПИСАНИЕ
     Вам  нет необходимости обращаться к UpDateContents непосредствен-
но. Вместо этого обращайтесь к Draw.
     UpDateContents выполняет следующие действия:
     - Если нет директорий доступных для  изображения,  UpDateContents
создает окно и завершается.
     - Эта  процедура  корректирует внутренний  список директорий, ис-
пользуя внутренние флаги, которые показывают, какое количество работы,
если таковая имеется, процедура должна сделать.
     - Она обращается к PickList.UpDateContents.

     СМОТРИ ТАКЖЕ
     PickList.UpDateContents
