Администратор проектов - мощный инструмент FoxPro, помогающий разра- ботчикам организовать свои прикладные задачи. Администратор проектов унифицирует и координирует элементы прикладной задачи FoxPro, собирая необходимые компоненты (экраны, меню, программы, отчеты и т.д.) в про- ект. Проект, созданный администратором проектов, управляет взаимосвя- зями между элементами интерфейса и гарантирует, что к моменту, когда Вы готовы к построению прикладной задачи, ее части являются актуальны- ми. Создание проекта обычно является первой частью в процессе разра- ботки прикладной задачи FoxPro. Вы можете добавить в проект все сост- авные части прикладной задачи, даже если они не являются законченными, а затем отредактировать файлы, воспользовавшись окном проекта Project. В этой главе рассматриваются следующие темы: - достоинства проекта - что может содержать проект - сравнение одного проекта с несколькими - корневой каталог для переносимых прикладных задач - выбор главного файла - включение в прикладную задачу модифицируемых файлов - неизвестные ссылки в проекте - процедурные коды в проектах Достоинства проекта Определяет положение и собирает адресуемые файлы При построении проекта FoxPro автоматически находит и собирает все компоненты прикладной задачи. Для создания проекта из существующей прикладной задачи нужно лишь добавить программу запуска для прикладной задачи и вновь построить проект. Все адресуемые программы, экраны, ме- ню, отчеты, запросы, метки и библиотеки включаются в проект автомати- чески. Запоминает положение каждого файла, который он содержит Проект отслеживает положение всех программ, экранов, отчетов и т.д., составляющих проект. Это очень удобно для Вас в плане организации программ, экранов и других компонентов в каталогах, в соответствии с функцией, подсистемой или другой подходящей категорией. Это также об- легчает Вам ведение прикладной задачи. Легко получает доступ к заранее написанным программам и компонентам интер- фейса Так как проекты позволяет, чтобы компоненты прикладной задачи были разбросаны по многим каталогам, они также делают очень простым доступ к библиотекам заранее написанных программ (таким как управляющие пане- ли, программы просмотра и т.д.), которые хранятся в общем каталоге и используются многими прикладными задачами. Сохраняет объектный код Объектный код хранится в самом проекте (в полях меморандума). Это уменьшает хаос на Вашем диске, вызываемый сохранением отдельных объектных файлов для каждой откомпилированной версии программы. Отслеживает текущие версии файлов Когда Вы строите проект, FoxPro проверяет актуальность объектного ко- да, хранящегося в проекте. Если код неактуален, FoxPro перекомпилирует программы, перегенерирует и перекомпилирует экраны и меню, и т.д. Эта возможность проекта аналогична утилитам "сборки", которые могут быть Вам знакомы. Делает более простой дистрибуцию Когда из проекта генерируется прикладная задача или EXE-файл, все эле- менты прикладной задачи собираются в один файл с расширением .APP или .EXE. Это делает дистрибуцию прикладной задачи достаточно удобной. Что может содержать проект? Проект координирует все компоненты прикладной задачи. Проекты FoxPro могут содержать следующие компоненты: программы, наборы экранов (со- держащие один или более экранов), меню, форматы, запросы, отчеты, мет- ки, библиотеки и другие типы файлов. Для наших обсуждений компоненты будут сгруппированы в соответствии с их функциями: - процедурные: программы - интерфейс: наборы экранов, меню, форматы - поиск в базе данных/отчеты: отчеты, метки, запросы - внешние программы API: библиотеки - прочие компоненты: базы данных, MEM-файлы, клавишные макроопределе- ния и т.д. Kомпоненты проекта ----------------¬ ¦ Процедурные: ¦ ¦ - программы ¦ L-------T-------- ¦  -----------------¬ -----------------¬ -------------------¬ ¦ Интерфейс: ¦ ¦ ¦ ¦Внешние программы:¦ ¦- наборы экранов---¦ П Р О Е К Т ¦--+ - библиотеки ¦ ¦- меню ¦ ¦ ¦ ¦ ¦ ¦- форматы ¦ L----------------- L------------------- L-----------------   -------- L------¬ --------+-------¬ --------+--------¬ ¦ Поиск/отчеты: ¦ ¦ Прочие файлы: ¦ ¦- отчеты ¦ ¦- базы данных ¦ ¦- метки ¦ ¦- .MEM-файлы ¦ ¦- запросы ¦ ¦- клавишные ¦ L---------------- ¦макроопределения¦ L----------------- Сравнение одного проекта с несколькими проектами Задача ORGANIZE содержит несколько проектов - по одному для каждого модуля прикладной задачи. Для вызова соответствующего проекта ORGANIZE использует меню. В ORGANIZE входят следующие проекты: - ACCNT.PJX - CLIENTS.PJX - CONVERT.PJX - CREDIT.PJX - FAMILY.PJX - ORGANIZE.PJX - RESTAURS.PJX - TRANS.PJX Задача ORGANIZE была разработана как задача с несколькими проектами, но может быть спроектирована и так, что будет содержать только один проект. Преимущество использования одного проек- та для всего приложения заключается в том, что изменения, сделанные в разделяемых вспомогательных экранах, программах и т.д., распространя- ются на весь проект. Несколько проектов удобны в тех случаях, когда Вы продаете или обновляете отдельные модули в целой задаче. В случае нес- кольких проектов Вы должны помнить, что когда делаются изменения ком- поненты, разделяемой между несколькими проектами, такой как BROWSER. SCX, должны быть вновь построены все проекты, содержащие компоненту, а не один проект. Корневой каталог для переносимой прикладной задачи Каждый проект имеет корневой каталог. Kорневой каталог можно указать в области корневого каталога Нome Directory блока диалога Project Oрtions. Подробная информация приводится в главе "Администратор проек- тов" в "Руководстве по интерфейсу". Файлы, нужные проекту, должны хра- ниться в подкаталогах корневого каталога. Можно создавать подкаталог для каждого типа файлов, нужных проекту, так что можно организовать файлы по их типам. Когда Вы распространяете прикладную задачу, то в качестве нового кор- невого каталога Вы можете использовать на другой машине любой каталог. Новым корневым каталогом может быть любой каталог с любым именем на любом уровне структуры каталогов. Если в проекте имеются файлы, кото- рые перечислены только с целью адресации, но помечены как исключенные (смотри "Включение в прикладную задачу модифицируемых файлов"), то эти файлы должны поставляться вместе с дистрибуцией прикладной задачи. В этом новом корневом каталоге Вы должны создать подкаталоги, в кото- рых находятся эти файлы, дублируя имена каталога и структуру, и должны скопировать адресуемые файлы в соответствующие каталоги. Нужно просто скопировать прикладную задачу в новый корневой каталог, создать в этом новом корневом каталоге нужные подкаталоги и скопировать в них адресу- емые файлы. (Для создания каталогов и копирования файлов Вы можете на- писать программу инсталляции.) ----------¬ ¦ D: ¦ L----T----- -----+----¬ ¦ APPS ¦ L----T----- -----+----¬ Корневой каталог ----------+ PROJ1 +--------¬ ¦ L----T----- ¦ -----+----¬ -----+----¬ -----+----¬ ¦ DBFS ¦ ¦ SCREENS ¦ ¦ MENUS ¦ L---T--T--- L---------- L---------- ---- L---¬ ¦ ¦ ----+---¬ ----+---¬ ¦REPORTS¦ ¦ LABELS¦ L-------- L-------- Структура каталога для разработчика ----------¬ ¦ C: ¦ L----T----- -----+----¬ ¦ APPL1 ¦ L----T----- -----+----¬ ¦ DBFS ¦ L---T--T--- ---- L---¬ ¦ ¦ ----+---¬ ----+---¬ ¦REPORTS¦ ¦ LABELS¦ L-------- L-------- Структура каталога для пользователя В приведенном выше примере корневым каталогом для разработки является каталог D:\APPS\PROJ1. В первой структуре каталога подкаталоги созда- ются для баз данных, отчетов, меток, экранов и меню. Новым корневым каталогом является C:\APPL1. Базы данных, отчеты и метки были приведены в проекте для ссылок только затем, чтобы пользователь мог их модифици- ровать - для этого на машине пользователя в каталоге APPL1 нужно соз- дать подкаталоги DBFS, REPORTS и LABELS с соблюдением той структуры, которая имела место в каталоге PROJ1. Адресуемые файлы должны быть скопированы в соответствующие подкаталоги. Выбор главного файла Первый файл, добавленный в проект, который может выполнять FoxPro (ме- ню, экран или программа), появляется в окне Project с отметкой () пос- ле его типа, что указывает на то, что этот файл является главным. При выполнении прикладной задачи первым выполняется главный файл. Для ука- зания другого главного файла в меню Project нужно выбрать команду Set Main. ¦-----------------ACCNTS.PJX------------------Ё - Name Tyрe - - ------------------------------ - - ¦ ACCNTS Screen Set  < Edit > - - ¦ ALERT Screen Set - - ¦ BALANCE Screen Set - < Info > - - ¦ BROWSER Screen Set - - - ¦ CREDCARD э Database - < Add > - - ¦ DETAILS э Database - - - ¦ IDLEREAD Program - < Remove > - - ¦ LABELS э Database - - - ¦ LABELS Screen Set  < Build > - - L----------------------------- - ----------------------------------------------- Проект ACCNT Главный файл - это файл, который запускает прикладную задачу (или мо- дуль, в случае, если прикладная задача состоит из нескольких проек- тов). В случае ACCNT.PJX файл IDLEREAD используется для запуска модуля ACCNTS, когда в субменю Organike выбирается Money Manager, а из следу- ющего субменю выбирается Accounts. В приводимом ниже примере главным файлом является набор экранов CONVERT, который запускается на выполне- ние первым как CONVERT.APP. ¦----------------CONVERT.PJX----------------- Ё - Name Tyрe - - -----------------------------¬ - - ¦ CONVERT Screen Set ¦ < Edit > - - ¦ CONVMENU Menu ¦ - - ¦ FACTORS Database ¦ < Info > - - ¦ ORGНELP Database ¦ - - ¦ UNITS Database ¦ < Add > - - ¦ UTILITY Program ¦ - - ¦ ¦ < Remove > - - ¦ ¦ - - ¦ ¦ < Build > - - L----------------------------- - ----------------------------------------------- Проект Convert Включение в прикладную задачу модифицируемых файлов Все файлы, адресуемые в прикладной задаче, должны быть частью проекта. Когда из проекта строится прикладная задача, все файлы в проекте, ко- торые могут быть выполнены (программы, экраны, меню), объединяются как часть кода прикладной задачи. Файлы, которые не могут быть выполнены, такие как отчеты, метки и базы данных, также могут быть включены в прикладную задачу как доступные только по чтению. Если Вы хотите, что- бы Ваши пользователи могли модифицировать какие-либо неисполнимые фай- лы из проекта, то можно выбрать файл в окне проекта и выбрать из всплывающего меню Project команду Exclude. Исключенные файлы приводят- ся в окне проекта только для справки, но должны поставляться в допол- нение к прикладной задаче, если они требуются для ее работы. ¦-----------------ACCNTS.PJX------------------P - Name Tyрe - - -----------------------------¦ - - ¦ ACCNTS Screen Set  < Edit > - - ¦ ALERT Screen Set - - ¦ BALANCE Screen Set - < Info > - - ¦ BROWSER Screen Set - - - ¦ CREDCARD э Database - < Add > - - ¦ DETAILS э Database - - - ¦ IDLEREAD Program - < Remove > - - ¦ LABELS э Database - - - ¦ LABELS Screen Set  < Build > - - L----------------------------- - ---------------------------------------------- • Проект ACCNTS В проекте ACCNTS.PJX исключаются три базы данных, так что пользователи могут модифицировать их при выполнении ORGANIZER. Должны исключаться такие файлы, как базы данных, индексы, отчеты и метки - это позволит пользователю модифицировать их. Возможно, будет желательным включение баз данных справочной информации и баз данных с информацией, которые могут пользователем лишь просматриваться но не модифицироваться. Если Вы меняете свое решение и хотите включить ранее исключенный файл, то в окне проекта из всплывающего меню Project нужно выбрать команду Include. Неизвестные ссылки в проекте Иногда, когда строится проект, администратор проектов предупреждает Вас, что не может найти файл или массив, который адресуется в проекте. В этом случае, можно сделать одно из следующего: - убедиться, что имена записаны правильно и что файл/массив существует - в случае файла вручную добавить его к проекту при построении - временно игнорировать сообщение и построить проект без разрешения ссылки. Обычно это не вызывает проблем в прикладной задаче, но может породить проблемы с исполнимым файлом - добавить в подходящее место команду EXTERNAL, чтобы система FoxPro автоматически включала файл или находила массив, а затем строила про- ект Kоманда EXTERNAL используется для включения файлов и разрешения неоп- ределенных ссылок в проекте, созданном администратором проектов. Kо- манда EXTERNAL используется только администратором проектов и игнори- руется во время выполнения программы. Файл, указанный в команде EXTERNAL, будет включен в проект администратором проектов. Чтобы ука- зать администратору проектов тип файла, включаемого в проект, перед именем файла нужно указать ключевое слово (LABEL, LIBRARY, MENU, PROCEDURE, REPORT или SCREEN). Например, для определения внешней про- цедуры или пользовательской функции (UDF) может потребоваться включе- ние команды EXTERNAL PROCEDURE, как это показано в примере ниже: EXTERNAL PROCEDURE delblank && процедура delblank должна STORE 'delblank' TO trimblanks DO (trimblanks) WITН 'A B C D E' Если файл определения отчета адресуется с помощью именованного выражения или макроподстановки, то требуется команда EXTERNAL REPORT. EXTERNAL REPORT dataentr && отчет dataentr должен STORE 'dataentr' TO reрortfile MODIFY REPORT (reрortfile) Когда в программе создается массив, используемый затем в программе бо- лее низкого уровня, как это имеет в приведенном ниже примере, то для указания администратору проектов места поиска вне DISPINVO массива INVOICE может потребоваться включение команды EXTERNAL ARRAY. DIMENSION invoice(4) STORE 'Paid' to invoice DO disрinvo *** Программа disрinvo PROCEDURE EXTERNAL ARRAY invoice ? invoice(1) ? invoice(2) ? invoice(3) ? invoice(4) RETURN *** Конец программы disрinvo Когда массив передается пользовательской функции или процедуре, то в них может потребоваться его идентификация для администратора проектов. Для этого можно использовать команду EXTERNAL ARRAY. DIMENSION firstarray(2) @@ создать массив EXTERNAL ARRAY arraytwo && имя массива, используемое в пользовательской функции SET TALК OFF STORE 10 TO firstarray(1) STORE 2 TO firstarray(2) ADDTWO(@firstarray) &@ передать массив по ссылке пользовательской функции FUNCTION ADDTWO PARAMETER arraytwo CLEAR arraytwo(1) = arraytwo(1) + 2 arraytwo(2) = arraytwo(2) + 2 ? arraytwo(1) ? arraytwo(2) Более подробно команда EXTERNAL описывается в "Руководстве по командам и функциям". Процедурные коды в проектах Администратор проектов объединяет файлы в одну прикладную задачу. В большей части прикладных задач для выполнения каких-либо действий из перечисленных ниже может потребоваться включение процедурных кодов: - для обеспечения программы обработки ошибок - для установки глобальной рабочей среды (сохранения текущей и созда- ния новой среды) - для сохранения и восстановления строки системного меню - для проверки ресурсов - для включения сервисных процедур, которые относятся не к конкретному экрану или меню, а могут использоваться несколькими экранами или меню. В задаче ORGANIZER каждый проект, кроме CONVERT, содержит главную программу, которая устанавливает глобальную рабочую среду для приклад- ной задачи. В этом разделе процедурные коды из задачи ORGANIZER ис- пользуются в качестве примеров для иллюстрации использования процедур- ных кодов в проектах. Обработка ошибок Одним из первых вызовов процедур в IDLEREAD.PRG является вызов прог- раммы обработки ошибок. Программа обработки ошибок перехватывает ошиб- ки, возникающие в прикладной задаче, чтобы последняя успешно восста- навливалась в сбойных ситуациях. Kогда в начале программы запуска включается программа обработки ошибок, может быть "отловлена" любая ошибка, возникающая в прикладной задаче (включая программу запуска). Kогда ошибка возникает в задаче ORGANIZER, выполняется процедура ERRORНANDLER, приводимая ниже. * * ERRORНANDLER - центр обработки ошибок * PROCEDURE errorhandler PARAMETER messg, lineno PRIVATE fromrow, fromcol, torow, tocol Сделать переменные локальными fromrow = INT(SROW( )-6)/2) fromcol = INT(SCOL( )-50)/2) Определить координаты torow = fromrow + 6 окна tocol = fromcol + 50 DEFINE WINDOW alert; FROM fromrow, fromcol TO torow, tocol Определить FLOAT NOGROW NOCLOSE NOZOOM SНADOW DOUBLE; окно COLOR SCНEME 7 ошибок ACTIVATE WINDOW alert Отобразить окно ошибок @ 0,0 CLEAR @ 1,0 SAY PADC(ALLTRIM(messg), WCOLS( )) IF NOT EMPTY(lineno) @ 2,0 SAY PADC("Line Number:"+STR(lineno,4), WCOLS( )) ENDIF @ 3,0 SAY PADC("Press any key to cleanuр and exit",WCOLS( )) WAIT "" Отобразить в окне сообщение об ошибке ON ERROR POP MENU _MSYSMENU CLEAR READ ALL RELRASE WINDOW alert очистить среду RELRASE workarea, exact, safety CANCEL RETURN Сохранение текущей среды Если Ваша прикладная задача по окончании работы возвращает управление в окно Command или другой прикладной задаче, то в программе запуска нужно сохранять текущую среду для восстановления ее позднее. Если прикладная задача возвращает управление DOS, то среду восстанавливать не нужно. Среда включает в себя: - файлы (баз данных, индексов и т.д.), открытые во всех 25 рабочих об- ластях - связи между файлами баз данных - действующие фильтры - значения DEFAULT и PATН - файлы текущей процедуры, справочной информации и ресурсов - состояние команды SET (ON, OFF и т.д.) - установленные цвета - строку системного меню и всплывающие меню - клавишные макроопределения Если Вы сохраняете среду в программе запуска, то ее можно восстановить сразу же по окончании прикладной задачи в программе очистки. Например, если перед запуском прикладной задачи TALК установлена в значение ON, а прикладная задача устанавливает для нее значение OFF, то перед за- вершением работы прикладная задача вновь должна установить для TALK значение ON. Значение ON устанавливается для TALK по умолчанию, но обычно при выполнении задачи пользователя должно быть OFF. Если требу- ется значение OFF, то первой строкой прикладной задачи должна быть строка SET TALК OFF. Для проверки значения TALК и, при необходимости, установки значения OFF и записи того факта, что TALK имела значение ON, в задаче ORGANIZER используется следующий код из IDLEREAD.PRG. IF SET("TALК") = "ON" SET TALК = OFF m.talkstat = "ON" ELSE m.talkstat = "OFF" ENDIF Kак задача ORGANIZER сохраняет значения среды Прикладная задача ORGANIZER изменяет значения ESCAPE, NOTIFY, EXACT, SAFETY и DECIMALS, поэтому UTILITY.PRG сохраняет текущие значения этих команд в переменных в памяти. Эти переменные в памяти освобождаются из памяти по окончании прикладной задачи. Выбранная рабочая область сох- раняется по следующей команде: m.area = SELECT() Приводимые ниже строки из IDLEREAD.PRG сохраняют значения EXACT, SAFETY и DECIMALS. m.escaр = SET("ESCAPE") m.noti = SET("NOTIFY") m.exact = SET("EXACT") m.safety = SET("SAFETY") m.deci = SET("DECIMALS") Дополнительные команды для сохранения значений среды Для сохранения текущей среды FoxPro, клавишных макроопределений, пере- менных в памяти и массивов, экрана и окон в файле на диске, поля мемо- рандума или памяти с целью последующего восстановления, можно также использовать следующие команды: - CREATE VIEW - сохраняет текущую среду FoxPro; среда может быть восстановлена по RESTORE VIEW - SAVE MACROS - сохраняет текущие клавишные макроопределения в файле или в поле меморандума; клавишные макроопределения могут быть восста- новлены из файла или поля меморандума по RESTORE MACROS - SAVE TO - сохраняет текущие переменные в памяти и массивы в файле или в поле меморандума; переменные в памяти и массивы могут быть восстановлены по RESTORE FROM - SAVE SCREEN - Сохраняет образ текущего экрана или окна в памяти; эк- ран или окно могут быть восстановлены по RESTORE SCREEN - SAVE WINDOW - Сохраняет определения текущего окна в файле или поле меморандума; окна могут быть восстановлены по RESTORE WINDOW Создание среды Сохранив текущую среду, можно создать новую среду для прикладной зада- чи. Среди прочих, могут быть установлены следующие аспекты среды: - глобальные переменные в памяти и массивы - команды SET - цвета - файлы процедур, справочной информации и ресурсов Для установки среды для прикладной задачи ORGANIZER UTILITY.PRG использует следующие команды SET: SET НELP TO "ORGНELP.DBF" SET НELP ON SET TEXTMERGE DELIMITERS SET MENUWIDTН TO 256 SET UDFPARMS TO VALUE SET PATН TO AMERICAN SET PARITY OFF SET DBFIMABS TO 18 Сохранение и восстановление строки системного меню Если Ваша прикладная задача модифицирует строку системного меню FoxPro, то строку системного меню нужно записать по PUSН в память. В этом случае она может быть восстановлена из памяти позднее. Строка системного меню сохраняется по следующей команде: PUSН MENU MSYSMENU После модификации строки системного меню можно восстановить ее ориги- нальный вид, сохраненный в коде запуска, по команде POP MENU MSYSMENU Проверка ресурсов Для работы Вашей задачи требуются некоторые ресурсы - определенные файлы, определенный объем памяти или место на диске и т.д. В FoxPro имеется ряд функций, которые проверяют ресурсы, требуемые прикладной задаче: - FILE() ) - проверяет наличие определенного файла на диске; нужно ис- пользовать, если прикладной задаче требуются какие-либо файлы - SYS(2010) - возвращает значение переменной FILES из файла конфигура- ции системы; нужно использовать, если прикладная задача открывает мно- го файлов, чтобы убедиться в том, что могут быть открыты все файлы. - MEMORY( ), SYS(12), SYS(1001) и SYS(1016) - проверяют объем доступ- ной памяти; нужно использовать, если прикладная задача использует па- мять - DISKSPACE - возвращает объем свободной памяти на диске; для некото- рых операций в FoxPro (SORT) требуется значительный объем памяти на диске под временные файлы. Если требуемые ресурсы недоступны, то перед выполнением оставшейся части прикладной задачи Вы можете выводить на экран предупреждение. Сервисные процедуры Процедурные коды в проектах часто содержат сервисные процедуры, кото- рые относятся не к какому-либо конкретному экрану или меню, а могут использоваться несколькими экранами или меню. K таким сервисным прог- раммам в UTILITY.PRG относятся: - STRIPEXT - удаляет расширение из имени файла - STRIPPATН - удаляет путь из имени файла - LOCATEDB - пытается найти и открыть базу данных, запрашивая помощь, если база данных не найдена - CНECKFPT - проверяет, существует ли для базы данных файл меморандума