Язык программирования foxpro используется

Основы языка Visual FoxPro

Как уже отмечалось выше, язык VFP это сильно дополненный и расширенный язык xBase. В Visual FoxPro язык программирования объектно-ориентированный, то есть базовой конструкцией языка является понятие класса. Исходный же вариант xBase это чистейший структурный язык, с базовым понятием процедур и функций. Таким образом, современный язык программирования Visual FoxPro допускает совмещать как и программирование «по старинке» описанием массы процедур, так и в стиле ООП, создавая сложную иерархию классов.

Разумный же выбор стиля программирования сделает Ваши программы читабельными, легкими для понимания, с другой стороны, позволит Вам быстро создавать мощные приложения. Как уже говорилось, язык Visual FoxPro сильно перегружен языковыми конструкциями, стандартными функциями и операторами. Это сделано из-за соображений совместимости со старыми версиями FoxPro. Дать полное описание всех конструкций языка представляется невозможным из-за огромного количества материала. Поэтому мы отсылаем читателя к Visual FoxPro Online Documentation справочной базе данных по программированию VFP. Размер этой базы данных около 80 Mb, и ее можно установить при установке самого VFP себе на жесткий диск или же оставить на оригинальном CD-диске. Здесь же мы будем стараться приводить описания только тех языковых конструкций, которые потребуются нам для более полного изложения материала. Если в приводимых программах Вы встретите незнакомую функцию или оператор, попробуйте найти его описание в Visual FoxPro Online Documentation, в крайнем случае, напишите мне, и я обязательно подробно про него расскажу.

Итак, здесь рассматриваются:

Понятие типов данных и массивов

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

Первое, что отличает VFP от других языков программирования, это то, что в VFP все переменные динамические с неявным объявлением типа. То есть, Вы всегда можете создать переменную, некоторое время ее использовать и потом удалить. При создании переменная всегда имеет тип logical со значением false и тип ее фиксируется (определяется) при первом присваивании переменной какого-либо значения. То есть, при первом присваивании переменная меняет свой тип на тип присваиваемых ей данных. Изменить свой тип переменная может только один раз, при первом присваивании. Переменные могут быть следующих типов:

Кроме того, в некоторых случаях, могут создаваться переменные с любым типом данных, разрешенном в таблицах, то есть, например, memo, general и др. (См. команды SCATTER и GATHER).

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

Объявление типа области действия переменной производится ниже указанными командами. Внимание! Объявление типа области действия переменной всегда должно предшествовать ее первому присваиванию! По умолчанию, переменные без объявления области действия становятся частными (приватными) о чем более подробно будет сказано чуть ниже.

Глобальные переменные объявляются командой PUBLIC и существуют в течение выполнения всей программы или всего приложения. При отладке (в среде VFP) глобальные переменные существуют в течение всего сеанса работы с VFP, пока они не будут явно удалены из памяти. Пример объявления глобальных переменных:

PUBLIC gcMyName, gdCurrentDate gcMyName = Иван Никитин gdCurrentDate = date()

Частные переменные (приватные) существуют в течение выполнения текущего программного модуля и доступны во всех вызываемых им модулях. Эти переменные автоматически удаляются из памяти при окончании выполнения модуля, в котором они были объявлены и созданы. Такой тип области действия получают все необъявленные явно переменные, кроме массивов. По умолчанию, массивы становятся глобальными. Явно объявить этот тип области действия можно командой PRIVATE.

Локальные переменные существуют и доступны только в том модуле, в котором они объявлены. Эти переменные объявляются командой LOCAL и удаляются из памяти автоматически при завершении выполнения программного модуля. Как мы уже говорили, в VFP все переменные динамические.

Венгерская нотация

В Вашем приложении могут быть сотни и тысячи переменных. Чтобы избежать путаницы и долгих размышлений при отладке программы типа: «A[i,j] что за массив и чего он здесь вообще делает?» была предложена и успешно используется стройная система именования переменных и других объектов программы.

По родине предложившего эту систему программиста она названа Венгерская нотация. Система именования очень проста. Прилагаемо к VFP, имя переменной начинается с 2-х буквенного префикса, 1-я буква которого область действия переменной, 2-я буква ее тип. То есть:

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

Всячески следует избегать имен переменных типа A[i,j], K1, L2 R0 и т.п. так часто приводимых в старых учебниках по программированию. Единственным исключением, пожалуй, являются переменные циклов I и J. Это «вечные» имена для создания циклов.

Понятие программной единицы (процедуры) и их типы

В отличие от старых версий FoxPro, VFP имеет понятие формы определенного описания окна (формы), которое может самостоятельно исполнятся. В старых версиях FoxPro существовало понятие Экрана (screen).Это не одно и то же, что и форма.

Экран в FoxPro просто способ визуального построения окна, который в дальнейшем в любом случае переводился в исполняемую программу, строящую это окно (файл SPR). Форма же по своей сути является описанием класса окна, который при исполнении порождает объект, готовый к работе (см. ООП).

Таким образом, в отличие от экранов FoxPro форма может быть самостоятельно исполнена без генерации программного модуля. Более подробно мы рассмотрим формы позже, а пока перейдем к другой группе программных единиц.

Любая программная единица это набор операторов VFP, выполнение которых приводит к желаемому результату. В зависимости от назначения и способа построения программные единицы делятся на следующие группы:

Четкого различия на уровне операторов между всеми этими группами нет. Просто они по разному строятся (например, запросы и меню стоятся автоматически), и соответственно имеют разное назначение. Здесь мы пока не приводим подробное описание каждой группы, лишь обозначим общую идеологию этого построения и типы файлов, в которых сохраняются эти программные единицы. Любая программная единица хранится в файле. Стандартным расширением для такого файла является расширение PRG. При выполнении или при построении проекта этот файл компилируется в p-код и затем выполняется. Компиляция проходит очень быстро и обычно пользователь VFP даже не замечает время, потраченное VFP на компиляцию при выполнении. Соответственно, при выполнении построенного проекта компиляция уже не нужна, так как проект строится на основе уже скомпилированных модулей.

Наборы готовых «кирпичиков» процедур можно объединять в файлы (об этом см. ниже), что дает нам процедурные файлы. Кроме того, есть большой класс програмных элементов, именуемый User defined function (UDF), но об этом ниже.

Хранимые процедуры это такие же наборы процедур, хранимых в базе данных. Об этом см. раздел «Понятие базы данных». Программы запросов и программы меню строятся автоматически и соответственно имеют расширения QPR и MPR. Как правило, Вам не нужно их менять или править. Более подробно об этом мы рассмотрим в разделах применение RQBE и Построение меню.

Операторы

Операторы это элементарные командные единицы Вашей программы. При работе с VFP, Вам доступно окно Command, позволяющее выполнять эти команды поодиночке, в принципе, последовательное выполнение операторов и есть работа Вашего приложения. Конечно же, на практике дело обстоит несколько сложнее, так как мы имеем дело с системой, управляемой событиями, но в первом приближении, можно представить дело именно так: «Ваше приложение представляет набор некоторых, команд, выполнение которых и есть работа Вашего приложения».

Операторы (команды) VFP могут быть как простыми, так и очень сложными и длинными, равно как и команда, выполняемая оператором, может быть простой, а может быть и весьма сложной и емкой. Конечно же, здесь мы не ставим перед собой цель подробно объяснить все команды VFP, для этого у нас попросту нет ни времени, ни сил, ни объема, и, в конце концов, для этого существует Help (справочная информация), но несколько простых оператором мы рассмотрим.

Итак, оператором в VFP считается одна строка программы. Пустые строки игнорируются. Если оператор не умещается на одной строке, или программисту кажется более наглядным разместить один оператор на нескольких строках, то это можно сделать, поставив в конце строки, которую требуется продолжить символ «точка с запятой», например, здесь приведен один оператор:

Организация процедур и функций

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

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

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

Процедура может принимать при ее вызове параметры от вызывающей программы. Параметры могут объявляться как частные переменные (ключевое слово PARAMETERS) или как локальные переменные (ключевое слово LPARAMETERS). Как именно объявлять параметры дело Вашего вкуса. Число передаваемых параметров может быть меньше, чем число объявленных параметров. В этом случае «лишние» параметры процедуры инициализируются в значение false (.F.). Пример оформления процедуры:

Соответственно вызов этой процедуры выглядит так:

Программа, дойдя до оператора Do MyProc, произведет поиск файла myproc.prg (или откомпилированного myproc.fxp) и произведет вызов этой процедуры. При вызове переменной-параметру nScope будет передано значение 3.14, и начнет исполняться процедура, пока не будет достигнут конец файла myproc.prg или не будет встречен оператор RETURN. При этом управление будет передано на следующий оператор после Do MyProc.

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

где MyProcFile имя процедурного файла.

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

Пример функции, которая вычисляет что-то:

Вызов этой функции может быть таким:

В последнем примере видно как функция вызывается без фиксации возвращаемого результата (кстати говоря, тут и сам знак = не нужен, но так читабельнее). То есть в этом случае, возвращаемый результат нигде не сохраняется. В этом случае, функция ведет себя как типичная процедура, выполняя что-то, а не вычисляя. Кстати, большинство функциональных возможностей VFP реализовано именно как функции.

Далее мы увидим, что методы классов тоже реализуются именно как функции. Функции, определенные Вами, в VFP называются User Defined Function, то есть функции, определенные пользователем. UDF это очень мощный инструмент структурного программирования.

Циклы и условные операторы

Если Вы знакомы со структурным программированием, то Вам особенно не нужно объяснять, что такое циклы и условные операторы. Но все же вкратце на этом остановимся.

Условный оператор позволяет выполнять тот или иной блок программы в зависимости от какого-то условия:

lExpression любое логическое выражение. Если оно истинно, то выполняется «часть кода 1», иначе «часть кода 2». В VFP существует масса функций, результат которых является логическим и поэтому может использоваться в этой конструкции.

Циклы позволяют выполнить какую либо часть кода несколько раз. Соответственно, в VFP существуют несколько видов циклов:

Циклов с послесловием, таких как Паскалевский цикл repeat until, в VFP нет. Но, при желании, их можно легко реализовать. Циклы с предусловием это циклы, выполняющиеся до тех пор, пока условие выполнения истинно. Проверка условия происходит перед очередным циклом, отсюда и название.

Такой цикл строится такой конструкцией :

Цикл перечисления это цикл, в котором происходит последовательное наращивание (или уменьшение) какого либо значения, то есть его перечисление.

Типичный цикл перечисления:

В этом случае, происходит последовательное увеличение переменной цикла (в данном примере I) от минимального значения nMin, до максимального nMax, с шагом приращения nStep.

Циклы «для каждого» очень удобно использовать для последовательного просмотра массивов или коллекций (о них мы поговорим позже). В этом случае, произойдет выполнение операторов цикла для каждого элемента этого массива или коллекции:

Приведем два примера использования этого цикла. Первый пример создается массив и затем последовательно выводятся его элементы оператором (?) :

В следующем примере с помощью OLE Automation создается объект книги Excel и последовательно выводятся имена листов этой книги:

Во всех циклах можно прервать выполнение цикла оператором EXIT или прекратить выполнение текущей итерации (перейти на следующую итерацию) с помощью команды LOOP.

Реакция на события

Как мы уже отмечали, VFP реализует систему, управляемую событиями. Поговорим об этом более подробно. Первые языки программирования и первые подходы к программированию реализовали модель, управляемую данными. То есть программа чего-то там обрабатывала, и в зависимости от данных (исходных, вычисленных, сохраненных и проч.) выполняла тот или иной свой блок.

Характерным отличием такой модели является наличие алгоритма обработки, то есть четкой схемы, показывающей работу программы. К сожалению (или к счастью?) мир устроен по-другому. Динамичное развитие ситуации невозможно представить в виде законченных схем, блоков готовых решений. Мы не знаем, что случится через секунду или через минуту, мы также не знаем когда вообще что-нибудь случится. И, соответственно, мы не можем получить законченный алгоритм обработки.

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

Соответственно, суть системы управляемой событиями это описание реакции системы на определенные события. Нетрудно видеть, что алгоритма здесь нет, потому что мы не можем предсказать события. Мы можем лишь заявить следующее: «В случае того-то и того-то система поведет себя так-то и так-то». Таким образом, программирование системы заключается в описании реакции на события. Это очень важный момент в понимании подобных систем. Основное отличие от обычных подходов в том, что мы описываем только те события, которые нас интересуют, оставляя для остальных стандартную (ранее описанную) реакцию. То есть, если при создании обычных программ, Вы были обязаны описать все функциональные блоки Вашей программы, то в данном случае, Вы описываете лишь то, что отличает Вашу программу от стандартного поведения системы, как бы говоря: «А в остальном веди себя, как и прежде».

Кто и как расписал это «прежде» сейчас Вас не интересует, главное то, что программа может себя вести стандартным образом, пусть даже никак, весь пустая реакция это тоже реакция. Наиболее полно система, управляемая событиями, реализуется в объектной модели программирования, и мы рассмотрим ее позже, но в VFP есть еще несколько способов управлением реакцией на события. Первое, что необходимо знать, это понятие обработчика событий. Когда Вы отлаживаете Ваше приложение в среде VFP, или просто экспериментируете с VFP, Вам об этом заботиться не надо, так как сам VFP уже имеет свой обработчик событий, другое дело, когда стартует Ваше уже законченное приложение. Вы должны включить его при старте и выключить при окончании работы Вашего приложения. При всей своей сложности это делается весьма просто:

И все. Где именно это размещать мы покажем позже. А пока просто примите это к сведению.

Кроме этого примера, можно привести команды VFP ON :

Попробуйте следующее. В среде VFP в командном окне введите строку:

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

Функция LocFile() возвращает имя выбранного пользователем файла, но если пользователь отказывается от выбора, то происходит ошибка. Попробуем ее отследить:

Форма элемент Вашего приложения

Итак, форма это не программа, а класс. Класс формы хранится в файле с расширением SCX (SCT дополнительный файл). Экземпляр формы создается командой DO FORM, при этом, соответственно выполняются события (методы) формы, которые возникают при ее загрузке. При выполнении формы (если это не указана специально) создается объектная переменная. Этим процессом можно управлять, указывая имя переменной в команде DO FORM:

Как мы покажем ниже, на самом деле формами управлять очень и очень просто. Ну а пока на этом все о формах.

Источник

Основы программирования на языке foxpro

ЛАБОРАТОРНАЯ РАБОТА № 1

1. Изучение основных понятий и правил языка FoxPro.

2. Изучение принципов определения окон и меню в FoxPro.

2. ПЕРЕМЕННЫЕ И МАССИВЫ

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

NResult = 255 + nFirst

CName = «Иван» + alltrim(LastName)

2.1.1. Глобальные переменные

Глобальными переменными называются переменные или массивы, которые могут быть доступны из любой программы, которая выполняется в текущем сеансе работы с FoxPro. Такие переменные должны быть объявлены до присвоения им значения с помощью команды:

2.1.2. Локальные переменные

Команда PRIVATE позволяет создавать локальные переменные или массивы, доступные в пределах программы, в которой объявлена переменная, а также во всех процедурах и функциях, вызываемых из нее. Синтаксис команды:

Переменные объявленные командой LOCAL, доступны только в пределах программы, в которой объявлена переменная, и не доступны в процедурах и функциях, которые вызываются из нее. Синтаксис команды:

Команда DECLARE (синоним – DIMENSION) позволяет создавать одно — и двумерные массивы:

DECLARE [Array] ArrayName1(NRows1 [, NColumns1])

Нумерация индексов массива начинается с 1.

Для объявления глобальных или локальных массивов используются соответственно команды:

PUBLIC [Array] ArrayName1(NRows1 [, NColumns1])

LOCAL [Array] ArrayName1(NRows1 [, NColumns1])

Синтаксис процедур в FoxPro имеет следующий вид:

Можно хранить каждую процедуру в отдельном файле или объединять несколько процедур в одном файле. Для выполнения процедуры используется команда:

При этом FoxPro осуществляет поиск процедуры в следующем порядке:

1) в файле, из которого осуществляется вызов процедуры;

2) в процедурном файле, который указан в команде SET PROCEDURE TO;

3) просматриваются программы в соответствии с иерархией вызовов, начиная с последней вызвавшей программы и заканчивая основной программой;

4) ищется отдельный файл, который имеет такое же имя, как и имя вызываемой процедуры.

При вызове процедуры можно указать имя файла, в котором содержится процедура:

DO ProcedureName IN ProgramName

Синтаксис функции в языке FoxPro имеет следующий вид:

В отличие от процедуры, функция может использоваться в выражениях аналогично стандартным функциям FoxPro. Поиск функции осуществляется в таком же порядке, как и поиск процедуры.

3.3. Передача аргументов

Как процедуры, так и функции могут иметь параметры, которые объявляются в них командой

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

При вызове процедуры или функции, содержащей параметры, необходимо использовать следующий вариант команды DO:

DO ProcedureName WITH ParameterList

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

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

По умолчанию в функцию параметры передаются по значению. Если требуется передавать аргументы по ссылке, используется команда

SET UDFPARMS TO VALUE | REFERENCE

Где VALUE – режим передачи аргументов по значению, а REFERENCE – режим передачи по ссылке.

3.4. Возврат из процедур и функций

Для завершения процедуры или функции используется команда

RETURN [EExpression | TO MASTER | TO ProcedureName]

Здесь EExpression выражение, которое возвращается в вызывающую программу. TO MASTER возвращает управление вызывающей программе самого высокого уровня. TO ProcedureName возвращает управление указанной процедуре (программе).

4.1. Определение пользовательского окна

Вид окна определяется следующей командой:

DEFINE WINDOW WindowName1

FROM NRow1, NColumn1 TO NRow2, NColumn2

| AT NRow3, NColumn3 SIZE NRow4, NColumn4

[IN [WINDOW] WindowName2 | IN SCREEN | IN DESKTOP] [FONT CFontName [, NFontSize]] [STYLE CFontStyle] [FOOTER CFooterText] [TITLE CTitleText] [DOUBLE | PANEL | NONE | SYSTEM | CBorderString] [CLOSE | NOCLOSE] [FLOAT | NOFLOAT] [GROW | NOGROW] [MINIMIZE | NOMINIMIZE] [ZOOM | NOZOOM] [ICON FILE FileName1] [FILL CFillCharacter | FILL FILE FileName2] [COLOR SCHEME NSchemeNumber | COLOR ColorPairList]

Здесь WindowName1 – имя окна. FROM NRow1, NColumn1 TO NRow2, NColumn2 – координаты левого верхнего и нижнего правого углов окна. AT NRow3, NColumn3 SIZE NRow4, NColumn4 – координаты левого верхнего угла, высота и ширина окна. IN [WINDOW] WindowName2 | IN SCREEN | IN DESKTOP помещает определяемое окно в родительском окне WindowName2, в главном окне FoxPro (используется по умолчанию) или на рабочем столе. FONT CFontName [, NFontSize] – тип и размер шрифта. STYLE CFontStyle – стиль шрифта. FOOTER CFooterText – нижний колонтитул. TITLE CTitleText – заголовок. DOUBLE | PANEL | NONE | SYSTEM определяет рамку окна. CLOSE | NOCLOSE – возможность закрытия окна. FLOAT | NOFLOAT – возможность перемещения окна. GROW | NOGROW – возможность изменения размеров окна. MINIMIZE | NOMINIMIZE – возможность минимизации окна. ZOOM | NOZOOM – возможность разворачивания окна. ICON FILE FileName1 – иконка окна (файл с расширением ico). FILL CFillCharacter | FILL FILE FileName2 – фон окна заполняется символом CFillCharacter или содержимым bmp-файла FileName2. COLOR SCHEME NSchemeNumber | COLOR ColorPairList – цвета окна задаются номером цветовой схемы или набором цветовых пар.

4.2. Использование пользовательских окон

Следующая команда отображает и активирует одно или несколько определенных пользователем окон или системных окон FoxPro:

ACTIVATE WINDOW WindowName1 [, WindowName2 …] | ALL

[IN [WINDOW] WindowName3 | IN SCREEN] [BOTTOM | TOP | SAME] [NOSHOW]

Здесь WindowName1 [, WindowName2 …] | ALL – имена окон, предназначенных для активации, или все определенные окна. IN [WINDOW] WindowName3 | IN SCREEN активирует окно в родительском окне или в главном окне FoxPro. BOTTOM | TOP | SAME – предложения BOTTOM и TOP позволяют отобразить активируемые окна под/над уже имеющимися на экране (по умолчанию TOP). SAME – поместить и активировать окно в то же место, где оно было ранее. NOSHOW – окно активируется, но не отображается.

Перед активированием определяемые пользователем окна должны быть созданы командой DEFINE WINDOW. Вывод всегда направляется в окно, активированное последним.

DEACTIVATE WINDOW WindowName1 [, WindowName2 …] | ALL

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

RELEASE WINDOWS WindowName1 [, WindowName2 …] | ALL

Пример создания и использования пользовательского окна:

DEFINE WINDOW MyWindow FROM 5, 20 TO 15, 100 IN SCREEN;

DOUBLE CLOSE FLOAT GROW MINIMIZE ZOOM;

ACTIVATE WINDOW MyWindow

WAIT «Через 5 секунд окно закроется» TIMEOUT 10

RELEASE WINDOW MyWindow

5.1. Определение строки меню

Горизонтальное меню создается с помощью команды

DEFINE MENU MenuName [BAR [AT LINE NLineNumber]] [IN [WINDOW] WindowName | IN SCREEN] [KEY KeyLabel] [MESSAGE MessageText] [NOMARGIN] [COLOR SCHEME NSchemeNumber | COLOR ColorPairList]

Здесь MenuName – имя меню. BAR [AT LINE NLineNumber] – меню имеет свойства строки меню FoxPro, располагается в строке с номером NLineNumber. KEY KeyLabel – назначение клавиши (или комбинации клавиш) для активации меню. MESSAGE MessageText – сообщение, отображаемое при активации меню. NOMARGIN – подавление вывода пробелов слева и справа от каждого пункта меню.

Каждый пункт меню описывается командой

DEFINE PAD PadName1 OF MenuName PROMPT CMenuItemText

[AT NRow, NColumn] [BEFORE PadName2 | AFTER PadName3] [KEY KeyLabel] [SKIP [FOR LogicExpression]] [MESSAGE MessageText] [COLOR SCHEME NSchemeNumber | COLOR ColorPairList]

Здесь PadName1 – имя пункта меню. MenuName – имя строки меню. PROMPT CMenuItemText – текст пункта меню. Можно создать «Горячую клавишу», поместив ‘ 2013-08-07

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *