Новости



Visual FoxPro 9 позволяет создавать ещё более производительные приложения баз данных.
Двадцатиление FoxPro! Microsoft принимает поздравления.
Visual FoxPro Toolkit for .NET - более 225 функций VFP 7.0, для языков .NET (подробнее)

Изменения в Руководстве разработчика

См. также

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

Глава 2: Обзор языка программирования

Страница 39 В разделе "Тип данных DateTime" замените второе предложение первого абзаца с едующими предложениями:

Значение типа DateTime хранится в восьми байтах fox90001.gif двух четырехбайтовых целых числах. Первые четыре байта представляют дату, остальные четыре fox90001.gif время, отсчитываемое в миллисекундах, начиная с полуночи.

Во втором примере на этой же странице удалите двоеточие перед примером и заме ите пример и его описание на следующее:

Чтобы указать пустые значения DateTime, нужно использовать фигурные скобки с косой чертой и двоеточием меж у ними:

STORE {/:} to tBlankdate1

Страница 41 В первом абзаце измените расширение имени файла с .DBT на .FPT.

Страница 43 В разделе "Создание переменных" добавьте в предложение "Следующие примеры яв яются простыми предложениями присваивания" фразу "которые функционально эквива ентны между собой", чтобы получилось следующее:

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

Страница 45 В разделе "Записи" замените процедуру "Как создавать записи" следующей проце урой:

fox00019.gif Как создавать записи

fox90000.gif Воспользуйтесь командой INSERT - SQL или APPEND.

Страница 50 Вверху страницы в абзаце после первого списка замените слова "в кавычки д угого типа" следующими:

в пару других разделителей строки: [ ] или ' '

Страница 51 В разделе "Именующие выражения" замените последний абзац данного раздела сле ующим:

Здесь имя поля city заносится в переменную cVarCity, а затем в поле city записывается значение "Paris", являющееся значением именующего выражения cVarCity.

Страница 53 Замените две процедуры следующими:

fox00019.gif Как передавать параметры по ссылке

fox90000.gif Используйте до вызова UDF следующую команду:

SET UDFPARMS TO REFERENCE

fox90002.gif Или fox90002.gif

fox90000.gif Используйте значок @ для передачи переменной или массива по ссылке, как показа о в следующем примере:

? "UDF value: " + STR(plusone(@nX))

fox00019.gif Как передавать параметры по значению

fox90000.gif Используйте до вызова UDF следующую команду:

SET UDFPARMS TO VALUE

fox90002.gif Или fox90002.gif

fox90000.gif Используйте скобки для передачи переменной или массива по значению, как показа о в следующем примере.

? "UDF value: " + STR(plusone((nX)))

Страница 60 В разделе "Значение NULL" замените первый пример на следующее:

DIMENSION aX[4]

STORE .NULL TO aX

А во втором примере замените aX на nX, как показано ниже:

STORE 5 TO nX

nX = .NULL.

? TYPE ("nX") && Visual FoxPro reports the data type as numeric

Страница 61 В разделе "Передача неопределенного значения в качестве параметра" в примере после третьего пункта списка поставьте вопросительный знак (?) перед SUBSTR, чтобы получилось следующее:

? SUBSTR("Hello, world", n, 5) && parameter should be a

Глава 3: Объектно-ориентированное программирование

Страница 72 В разделе "Классы контейнеров" замените в таблице элементы, которые могут со ержаться в контейнере Grid Columns, на следующие:

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

Страница 78 В примере раздела "Защита членов класса" замените строку "HireDate = {''}" а строку "HireDate.= { / / }".

Страница 82 В таблице измените первую строку на следующее:

DEFINE CLASS Navbutton;
AS COMMANDBUTTON
Height = 25
Width = 25
TableAlias = ""
Определение родительского класса для кнопок перемещения.

Задайте размеры объектов.

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

Страница 84 В таблице внизу страницы измените первую строку на следующее:

DEFINE CLASS vcr AS CONTAINER
Height = 25
Width = 100
Left = 3
Top = 3
Начало определения класса. Свойство Height установлено равным аналогичному свойству базового класса.

Page 85 В таблице наверху страницы измените первую строку на следующее:

ADD OBJECT cmdTop AS navTop ;
WITH Left = 0
ADD OBJECT cmdPrior AS navPrior ;
WITH Left = 25
ADD OBJECT cmdNext AS navNext ;
WITH Left = 50
ADD OBJECT cmdBot AS navBottom ;
WITH Left = 75
Добавление кнопок перемещения.

В таблице наверху страницы 86 измените первую строку на следующее:

DEFINE CLASS vcr2 AS vcr
ADD OBJECT cmdQuit;
AS COMMANDBUTTON WITH ;
Caption = "Quit",;
Height = 25, ;
Width = 50
Width = THIS.Width + THIS.cmdQuit.Width
cmdQuit.Left = THIS.Width - ;
THIS.cmdQuit.Width

Определение класса, базирующегося на vcr и добавление к нему новой командной кнопки.

Страница 87 Измените пример кода в разделе "Добавление vcr в класс формы" на следующее:

DEFINE CLASS NavForm AS Form

ADD OBJECT oVCR AS vcr

ENDDEFINE

Страница 88 В таблице измените код DEFINE CLASS на следующее:

DEFINE CLASS grdProducts AS Grid
Left = 24
Top = 10
Width = 433
Height = 189
Visible = .T.
RowHeight = 28
ColumnCount = 2

Страница 89 В третьей строке таблицы замените две строки кода процедуры Init на сле ующее:

Procedure Init
THIS.Column1.Width = 175
THIS.Column2.Width = 68

Замените две строки кода DEFINE CLASS в первой строке таблице внизу страницы а следующее:

DEFINE CLASS GridForm AS FORM
Width = 400
Height = 300

Глава 4: Основы событийно-ориентированной модели

Страница 98 Добавть следующую строку в конец таблицы:

Command2
When
Глава 7: Работа с таблицами

Страница 160 В последнем абзаце страницы раздела "Именование таблиц" измените первое пре ложение на следующее:

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

Страница 181 В разделе "Добавление записей" измените пример кода на следующее:

INSERT INTO customer (cust_id, company, contact) ;

VALUES ('SMI007', "Smith's Delicatessen", 'Sarah Smith')

Страница 193 В разделе "Создание многих вариантов упорядочения записей" в первом предложе ии после диаграммы файла .CDX замените companyemp_id на emp_id.

Страница 201 В разделе "Удаление простого .IDX-индекса" добавьте следующий пример после п оцедуры "Как удалить простой индекс":

Например, следующий код удаляет файл простого .IDX-индекса ORDDATE.IDX:

DELETE FILE orddate.idx

Страница 208 В разделе "Временные фильтры" вставьте перед последним предложением послед его абзаца следующее предложение:

Чтобы отключить фильтр для текущей таблицы, вы можете выдать команду SET FILTER TO без выражения.

Страница 212 В разделе "Присваивание псевдонима таблице" в начале абзаца, стоящего после примера кода, замените слово "можно" на "нужно".

Глава 8: Создание многотабличных представлений

Страницы 239 - 240 В процедуре "Как разрешить обновление представления с помощью свойств обнов ения" измените первый пункт списка на следующий текст:

1. В свойстве Tables задается, как минимум, одно имя таблицы.

Например, если представление основано на таблице customer и называется cust_view , то задать имя таблицы можно следующей функцией:

? DBSETPROP('cust_view', 'View', 'Tables', 'customer')

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

? DBSETPROP('cust_view.cust_id', 'Field', 'KeyField', .T.)

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

?DBSETPROP('cust_view.cust_id', 'Field', 'UpdateName', ;

'customer.cust_id')

В четвертом пункте списка измените строку кода на следующее:

?DBSETPROP('cust_view.cust_id', 'Field', 'Updatable', .T.)

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

?DBSETPROP('cust_view', 'View', 'SendUpdates', .T.)

Страница 244 В разделе "Сравнение только ключевого поля" измените "DBKEY" на "DB_KEY" в первом предложении абзаца.

Страница 254 В последней строке кода замените число "10000" на "1000".

Глава 9: Создание форм

Страница 263 В разделе "Основные свойства среды данных" удалите важное замечание после та лицы.

Страница 268 В разделе "Что такое контейнеры и элементы управления" замените в таблице э ементы, которые могут содержаться в столбце, на:

Заголовки и все объекты, за исключением наборов форм, форм, панелей инструме тов, таймеров и других столбцов.

Страница 274 В абзаце под рисунком измените путь доступа на следующий: "CONTROLS\LISTS\LADD.SCX."

Страница 280 В разделе "Редактирование кода методов и обработчиков событий" удалите сле ующее предложение:

Конструкции RETURN в кодах методов игнорируются и выполняются только для обра отчиков событий: Init, Valid и When.

Страницы 284-285 В разделе "Ссылка на объекты в иерархии объектов" замените первый абзац и п имер следующими абзацами и примером:

Для управления объектами нужно уметь идентифицировать их в иерархии контейне ов. На самом высоком уровне иерархии контейнеров (набор форм или форма) вы должн указать переменную объекта. По умолчанию переменная объекта носит то же имя, что и файл .SCX.

Доступ к свойствам осуществляется с помощью ссылки на переменную объекта, э емент управления и свойство, которые разделяются точками (.):

objectvariable.[form.]control.property = Setting

Два абзаца с примерами, расположенные после первой таблицы (вверху страницы 285), следует удалить.

Страница 287 В разделе "Вызов методов во время выполнения" замените пример кода, выво ящего на экран форму и устанавливающего в ней фокус, следующим кодом:

* form set is saved in MYF_SET.SCX

myf_set.frmForm1.Show

myf_set.frmForm1.cmdButton1.SetFocus

Команду, скрывающую форму, замените следующим кодом:

myf_set.frmForm1.Hide

Глава 10: Разработка классов

Страницы 310 и 314 В разделах "Создание новых свойств и методов" и "Защищенные свойства и метод " замените кнопки OK и Cancel в рисунках диалогового окна Edit Property/Method кнопкой Close.

Страница 318 Замените весь раздел "Вызов метода родительского класса" на следующее:

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

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

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

ParentClass::Method( )

Например, cmdOK является классом командных кнопок, хранимых в библиотеке классов Visual FoxPro в следующем каталоге SAMPLES\CONTROLS\BUTTONS.VCX. Код, ассоцированный с соб тием Click класса cmdOk освобождает кнопку. CmdCancel является подклассом класса cmdOk в той же библиотеке классов. Чтобы добавить функциональность к CmdCancel для отмены изменений, можно добавить следующий код в событие Click.

IF USED( ) AND CURSORGETPROP("Buffering") != 1

=TABLEREVERT(.T.)

ENDIF

cmdOk::Click( )

Так как измения записываются по умолчанию в буфферизованную таблицу при ее зак ытии, то не нужно добавлять код TABLEUPDATE( ) в cmdOk. Дополнительный код в классе cmdCancel отменяет изменения в таблице перед вызовом кода в классе cmdOk для освобождения формы.

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

Class::Method( )

Например, при добавлении объекта, основанного на новом классе cmdCancel, в фо му можно включить дополнительный код для события Click элемента управления в ко структоре форм. Следующий код строит окно сообщения, запрашивающее у по ьзователя подтверждение для закрытие формы. Если пользователь выбирет 'Yes', то код в событии Click класса cmdCancel будет выполнен, восстанавливая таблицу и выз вая код события Click класса cmdOk для освобождения формы.

nChoice = MESSAGEBOX("Do you want to exit without saving?", ;

32+0+4,"Verify Cancel")

IF nChoice = 6 && The value returned if the user chooses Yes

cmdCancel::Click()

ENDIF

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

ContainerClass.ControlName::Method( )

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

VCR.cmdTop::Click()

SET MESSAGE TO 'Top of the table.'

Родовой вызов кода класса Можно вызвать код в родительском классе так, что его легко будет испо ьзовать повторно. Создайте символьное выражение с допустимыми значениями и испо ьзуйте функцию EVAL( ) для вычисления выражения.

Родовой вызов код события Click

Код класса
Код, связанный с событием Click
В подклассе
=EVAL(THIS.ParentClass + "::Click()")
В элементе управления в контейнере.
=EVAL(THIS.Class + "::Click()")
В элементе управления во вложенном контейнере.
=EVAl(THIS.Parent.Class + "." + ;
THIS.Name + "::Click()")

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

Глава 11: Применение элементов управления

Страница 338 В примере внизу страницы удалите две последних строки:

ELSE

RETURN .T.

Страница 342 В разделе "Манипулирование выделенным текстом в поле редактирования" удалите последюю фразу из третьего абзаца:

если значение свойства HideSelection поля редактирования равно (.F.),

Страница 351 В разделе "Применение изображений" измените заголовок первого столбца таблиц с "Свойство" на "Метод".

Страница 364 В разделе "Установка порядка обхода элементов управления" добавьте в конец с едующий абзац и процедуру:

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

fox00019.gif Как изменить порядок выбора кнопок внутри группы элементов управления

1. В окне свойств выберите группу в списке Object. Жирная рамка показывает, что г уппа находится в режиме редактирования.

2. Выберите окно конструктора форм.

3. В меню View выберите команду Tab Order.

4. Установите нужный порядок выбора при обходе элементов управления.

Глава 12: Конструирование меню

Страница 384 В разделе "Назначение клавиш сокращения" вставьте вместо замечания о разреше ии проблем после пункта 5 следующее замечание:

Замечание Комбинация CTRL+J является недопустимой клавишей сокращения.

Страница 397 В разделе "Соблюдение соответствия между меню и панелями инструментов" заме ите третье предложение следующими.

Однако после создания панели инструментов вам необходимо синхронизовать команд меню с соответствующими кнопками. Например, если кнопка становится доступной, то нужно сделать доступной и соответствующую команду меню. Подробнее см. разде справки "Согласование меню и пользовательских панелей инструментов" или главу 13 "Создание панелей инструментов пользователя".

Глава 13: Создание панелей инструментов пользователя

Страница 406 В разделе "Согласование меню и панелей инструментов пользователя" замените весь абзац следующим:

При создании панели инструментов необходимо синхронизировать команды меню с соответствующими кнопками панели инструментов. Например, если вы делаете кнопку оступной, то нужно сделать доступной и соответствующую команду меню. Подробнее о синхронизации меню и панелей инструментов см. раздел справки "Согласование ме ю и пользовательских панелей инструментов". О том, как создать меню, см. главу 12 "Конструирование меню".

Глава 14: Использование запросов и отчетов

Страница 412 В разделе "Как записать результат запроса в курсор" измените второе предложе ие в абзаце после примера кода на следующее:

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

Страница 414 В конструкции SELECT в таблице, замените "1000" на "50000."

Страница 415 Добавьте следующий раздел перед разделом "Как установить неразделяемый сеанс данных".

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

Глава 17: Оптимизация приложений

Страница 458 В разделе "Базовые оптимизируемые выражения" замените третий пункт списка с едующим:

fox90000.gif relOp должен быть одним из следующих реляционных операторов: <, >, =, <=, >=, <>, #, == или !=. Также можно использовать функции ISNULL( ), BETWEEN( ) и INLIST( ).

После этого списка приведены примеры синтаксиса функций BETWEEN и INLIST; их с едует заменить следующими процедурами.

fox00019.gif Как использовать BETWEEN и INLIST в оптимизируемых выражениях

Выберите один из предлагаемых форматов:

fox90000.gif BETWEEN(eIndex, eExpr, eExpr)

fox90002.gif Или fox90002.gif

fox90000.gif INLIST (eIndex, eExpr [,...])

fox00019.gif Как использовать BETWEEN и IN в оптимизируемых выражениях SQL

Выберите один из предлагаемых форматов:

fox90000.gif eIndex BETWEEN eExpr AND eExpr)

fox90002.gif Или fox90002.gif

fox90000.gif eIndex IN (eExpr [,...])

Страница 461 В первом примере на странице поместите открывающую круглую скобку перед вы ажением:

(FIRSTNAME = 'FRED' AND HIREDATE < {12/30/89}) ; && Fully
OR (LASTNAME = '' AND HIREDATE > {12/30/88}) && optimizable

Глава 18: Применение OLE

Страница 471 В разделе "Использование привязанных и непривязанных объектов OLE" замените во втором предложении фразу "содержимого поля General" на фразу "содержимого о ъектов OLE в полях General".

Страница 480 В разделе "Совет" замените второе предложение на следующее:

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

oleApp=GETOBJECT(.NULL., "Excel.Application")

Страница 481 В разделе "Соединение всего вместе" замените в аргументах мастера диаграмм з ачение "4100" на " fox90002.gif 4100".

Страница 485 В последнем абзаце раздела "Управление свойствами объектов OLE" замените во втором предложении "свойства Class" на "свойства OleClass".

Глава 19: Программирование совместного доступа к данным

Страница 493 В строке таблицы, содержащей команду REPLACE, измените столбец, описывающий локировку:

Таблицу целиком и все таблицы, связанные с ней

Страница 498 В разделе "Разделение сеансов" замените в процедуре "Как включить режим разделения сеансов" второй пункт списка следующим пунктом вместе с замечанием и следующим а зацем:

fox90000.gif В окне команд установите свойство DataSession равным 2. Например, введите:

frmFormName.DataSession = 2

Замечание Вы можете устанавливать свойство DataSession только на этапе разработки.

Когда свойство DataSession равно 2, каждая копия формы использует отдельные да ные, в которых блокировки не всегда эффективны.

Страница 504 В разделе "Добавление и удаление записей при буферизации таблиц" замените второй абзац на следующее:

Можно удалять добавленные записи из буфера с помощью команды TABLEREVERT( ). Д я любой добавленной записи функции TABLEUPDATE( ) и TABLEREVERT( ) удаляют от ицательное значение функции RECNO( ).

Страница 512 Измените первую строку таблицы на следующее:

DO WHILE GETNEXTMODIFIED(nCurRec) <> 0

Глава 20: Разработка интернациональных приложений

Страницы 525-526 В первом абзаце раздела "Удаление меток кодовых страниц" замените название темы "Файлы примеров" на тему "CPZERO".

В процедуре "Как удалить метку кодовой страницы" замените синтаксис примера с едующим примером:

DO CPZERO [WITH "FileName"[, codepage_number]]



Новое на сайте

  • Обновлен портфель программиста

    Добавлены: Установка HTML Help (Создание справочной системы), Imagedit.zip - Графический редактор ( ico и bmp), Библиотека локализации HTML Help (Русский)
  • Новые примеры программ

    Установка библиотек, Игровая программа "Охота на лис", Установка библиотек "Охота на лис", plastic -"Платежки", Библиотеки (на FPD26), platan -"Платежки" (на Clipper 5.2)
  • Обновленна справка

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