Глава 11:Foundation READ

Для многих программистов наиболее интересным нововведением, появившимся в FoxPro 2.0, было Foundation READ. Возможность активизации меню при активном READ допускает вызов любого режима программы из любого места пока READ ожидает действий пользователя. Это верно, если вы будете разрабатывать функции с прицелом на такую функциональность.

FoxPro поставляется с несколькими примерами использования новой возможности языка. Иногда, правда, мне кажется, что программисты Fox Software настолько блестящи, что не представляют возможности простых людей. Я получил буквально сотни звонков с просьбой дать более простой пример.

Отыскивая интересное применение для Foundation READ, я сообразил, что программа, которую я посылаю потенциальным подписчикам, может служить замечательным примером. Я использовал сокращенный вариант меню, содержащего только необходимые опции. Программа позволяет пользователям перемещаться по базе данных до тех пор пока они не найдут все, что их интересует, затем распечатать заказ. В программе использованы средства поиска самого FoxPro FIND и FIND AGAIN для поиска текстовых фрагментов. Для подготовки счета я использую функции TEXTMERGE.

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

Глава 12:Расширение возможностей FoxPro средствами языка Си (часть1)

 FoxPro - это мощный язык и его средствами вы можете решить почти любую задачу. Почти, но не любую. С помощью средств, предоставляемых пакетом Library Construction Kit (LCK), FoxPro может делать абсолютно все, что доступно для любых других языков программирования.

Раньше, с возможностью делать на компьютере абсолютно все ассоциировалось знание ассемблера. Однако теперь, благодаря Кернигану и Ричи, обычно хватает средств, предоставляемых Си, и проблемы решаются меньшей кровью. LCK дает возможность использовать написанные на Си (или, если вы настаиваете, на ассемблере) функции из программ на FoxPro так, как если бы они являлись неотъемлимой частью языка пакета.

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

Как это работает

LCK позволяет вам создавать библиотечные файлы, т. е. файлы с расширением .PLB. Для подключения, скажем, библиотеки SCREENFX.PLB, в вашей программе должна присутствовать команда:

SET LIBRARY TO SCREENFX

Глава 12:Расширение возможностей FoxPro средствами языка Си (часть2)

Управление памятью При выделении участков памяти или выполнении низкоуровневого ввода/вывода вы обязаны использовать процедуры FoxPro, так как FoxPro следит за использованием памяти и файлов. К счастью, процедуры в библиотеках LCK похожи на стандартные процедуры ANSI.

Даже экранный ввод/вывод находится под строгим наблюдением FoxPro. Для получения требуемой скорости работы приводимого примера библиотеки мне пришлось использовать функции BIOSа, позволившие мне обойти наблюдение FoxPro за процессами ввода/вывода на экран, и затем выполнить легальный (командой RESTORE SCREEN) вывод на экран, чтобы FoxPro принял изменения. Все это будет объяснено позже.

Хотя, если вы привыкли писать обычные Си-программы, упомянутые выше требования могут создать некоторые неудобства, LCK дает множество новых возможностей. Любой программист, пишущий на Си, позавидует оконной среде FoxPro, а LCK обеспечивает к ней легкий доступ. Аналогично поддерживаются все функции обработки базы данных, поиск по ключу требует всего лишь вызова функции _DBSeek. Организация работы в многопользовательском режиме с вызовом, например, таких функций как _DBLock и _DBUnlock также не представляет сложности.

Пример программы

Создание библиотеки специальных видеоэффектов я начну с простой функции. Функция curtain() открывает экран подобно театральному занавесу, с выводом изображения за ним. Функция принимает два параметра: имя .MEM-файла, содержащее сохраненное изображение экрана, и имя самой экранной переменной. Для создания такого файла выполните следующие действия:

1) Создайте первый экран SAVE SCREEN TO SCR1

Глава 13:Загадки AppGen (часть1)

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

Подобные желания-соображения отчасти продиктованы высокой стоимостью разработки программного обеспечения. Я отвергаю половину предложений, потому что потенциальный заказчик рассчитывает получить, скажем, Lotus 1-2-3 и заплатить не больше розничной цены пакета. 1-2-3 обошелся в 2 миллиона долларов, если учитывать только написание кода и отладку, при том, что разработчики имели определенный задел в начале работы - исходные тексты конкурирующей фирмы. Людям страшно не хочется платить деньги; они предпочитают поискать более простое решение проблемы.

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

Будущее уже настало?

Глава 13:Загадки AppGen (часть2)

Модификация FOXAPP.APP После того как предыдущая разработка пошла, я потерял покой. Как бы мне ни нравился тот маленький трюк, истинной моей любовью является поиск по неполному соответствию (Soft Seek). Если пользователь вводит SMIHT он, возможно, имеет ввиду SMITH. Я вывожу в виде меню наиболее подходящие соответствия с использованием для этого функции, код которой почти не зависит от конкретного приложения - я выбрасываю символы с конца, пока поиск не окажется успешным. Такой подход работает только с символьными полями на которые есть индекс и лучше всего он работает если индексирование проводилось с использованием функции UPPER(), что делает его не зависящим от регистра. Учитывая эти два ограничения мне удалось создать действительно полезную функцию!

Это требует серьезных изменений в коде FoxApp. FoxApp работает так, как считает нужным, и вам необходимо с этим считаться. Он, например, включает несколько .PRG-файлов, являющихся копиями программ, сгенерированных конструкторами меню и экранов. Так APPMENU.PRG включает жестко прошитое меню, появляющееся в сгенерированном FoxApp приложении, APPSRCH содержит функцию поиска, выводящую на экран маленькое окошко с возможными вариантами сортировки, полем ввода значения поиска и кнопкой < OK >. Для внесения изменений в FoxApp вам следует сделать следующее:

1) скопировать все .PRG проекта FoxApp в другой каталог;
2) модифицировать все, что вы сочтете нужным;
3) заново собрать FoxApp из проекта

Глава 14:Событийно-управляемые приложения в FoxPro 2.5

В своем журнале я напечатал четыре статьи, посвященные созданию событийно-управляемых приложений. Каждое имеет преимущества и недостатки, но все используют одни и те же инструменты для достижения цели. Когда мне понадобился пример для использования в книге я выбрал материал Билла Довиса за чистоту изложения и качество кода. Билл - уважаемый консультант, работающий в Атланте. Для книги вам нужен код, который легко читается, именно этим качеством отличаются программы, написанные Биллом. Кроме того, Билл помог мне в написании самой главы, за что я ему крайне признателен. Вы можете связаться с Биллом по телефону 1-(404) 256-9869.


Модель событийно-управляемого приложения

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