|
Alaska Xbase++: Отличия от Clipper
Главные
отличия Alaska Xbase++ от Clipper связаны с
появлением новых возможностей (классов
и функций), связанных с разработкой
приложений для 32-ух разрядных
операционных систем. В этом документе мы
не будем рассматривать эти новые
возможности, а заострим внимание на тех
отличиях, которые могут привести к "нежелательным"
или "невразумительным" результатам.
 |
Головная
процедура должна иметь имя MAIN (это
связано с особенностями работы
линкера Alink). При этом любой код,
находящийся вне определений Procedure или
Function, считается Main процедурой.
|
 |
Изменился
список INIT (APPSYS, ERRORSYS, DBESYS) и EXIT (APPEXIT)
процедур. Исходные тексты стандартных
процедур приведены в примерах.
|
 |
Parameters
- выполняемый оператор (в принципе, как
и в Clipper, начиная с версии 5).
Следовательно, определение Local и Static
переменных должно идти перед этим
оператором.
|
 |
В
связи с особенностями работы ПО в
мультисредовых ОС, циклы типа:
do while Inkey() == 0
- - -
enddo
рекомендуется заменить на:
do while Inkey(0.1) == 0
- - -
enddo
чтобы процессор мог стать доступным
для обработки ПО в других средах
хоть на какое-то время.
|
 |
Не
все команды (функции) поддерживаются.
Например, DIR - считалась устаревшей еще
в Clipper 5, ее заменила функция Directory(). SET
FUNCTION - тоже достаточно старая команда,
ее с успехом заменет SetKey. LABEL FORM, REPORT
FORM не поддерживаются в связи с тем, что
Xbase++ не работает с .FRM и .LBL файлами.
|
 |
Не
все команды (функции, средства)
работают идентично с Clipper, например, SET
TYPEAHEAD TO допускает min 10, max 100 (0, в
принципе, служившая для
взаимодействия клавиатура - BIOS - не
работает). Это связано с тем, что SET
TYPEAHEAD TO 0 обнулит очередь событий (event
queue), что просто приведет к остановке
системы.
|
 |
Изменилась
структура .MEM файла (появились .XPF),
соответственно, команды SAVE TO и RESTORE FROM
ориентированы на работу с новой
структурой. Это, на первый взгляд,
неудобство с лихвой окупается тем, что
в XPF файлах стало возможно хранить не
только символьные и цифровые данные,
но и объекты, массивы, кодовые блоки.
|
 |
COPY..TO
- создает не только текстовый файл, но
и дополнительный структурированный
файл, который позволит вам работать с
текстовым файлом аналогично файлу БД.
Естественно, с некоторыми
ограничениями. Например, файл
открывается только в монопольном
режиме, невозможно удаление записей,
сортировка.
|
 |
Achoice()
с пользовательской функцией в GUI
режиме ведет себя несколько иначе, чем
в терминальном режиме: в GUI режиме
пользовательская функция вызывается
даже во время инициализации (прорисовки)
меню, при этом, в нее передается
состояние "есть необрабатываемые
клавиши", - в терминальном режиме
вызов пользовательской функции
происходит только после стабилизации
меню. Как видите, это - потенциально
опасная ситуация. Чтобы не натыкаться
на эти “грабли", рекомендуется
очистить буфер клавиатуры перед
обращением к Achoice().
|
 |
Wopen()->Set
Color To->Wselect() не запоминает настройки
цветов для окон. Разработчики
объясняют это тем, что Wopen() приобрела
два новых параметра: настройка цветов
и тип курсора.
|
 |
Макроподстановки
и кодовые блоки. Рекомендуется
заменить макроподстановку внутри
кодового блока на макроподстановку от
строки. Например, { || &(asdf)} -> &("{||"
+ asdf + "}"). Это связано с тем, что
Xbase++ выполняет макроподстановку
только во время выполнения кодового
блока, в то время как Clipper делает это во
время определения кодового блока.
|
 |
Макроподстановки
и алиасы. Выражения типа Memvar->(&cMemvar)
надо заменить на Memvar->&(cMemvar).
|
 |
Появились
новые зарезервированные слова, причем,
есть слова, идентифицируемые
транслятором по 4 первым символам. В
связи с этим, изменились имена
некоторых внутренних экспортируемых
переменных и методов Get и TBrowse классов,
например, oGet:Assign() -> oGet:_Assign(), oGet:End()->
oGet:_End(), oTBrowse:End()-> oTBrowse:_End()
|
 |
БД
по умолчанию открываются в Shared режиме
(в отличие от Exclusive в Clipper). Самым
простым путем преодоления этого
различия будет включение в головной
модуль конструкции SET EXCLUSIVE ON.
|
 |
COMMIT
автоматически не выполняется при
выходе из программы при наличии
открытых БД. Принудительное
выполнение COMMIT и закрытие БД по
умолчанию осуществляется в EXIT
процедуре APPEXIT.
|
 |
Форматы
даты, времени и валюты берутся по
умолчанию из настроек ОС. Их
переустановка возможна с
использованием соответствующих
конструкций языка. В связи с этим,
соответствующие Picture форматы
игнорируются.
|
 |
Понятие
RDD (заменяемый драйвер баз данных)
заменено на DBE (механизм управления
базами данных). При этом, управление
данными состоит по сути из 3 частей:
управление собственно данными (таблицами),
управление связями, и управление
упорядоченностью (индексами). Каждая
из частей DBE выполнена в виде
отдельной DLL. Сборка "рабочей" (compound)
DBE должна производиться из отдельных
составляющих по мере надобности (хотя,
разработчики рекомендуют делать это в
INIT процедуре DBESYS). Все операции по
манипулированию с DBE сводятся
практически к вызовам 5 функций:
 |
DbeLoad():
загрузить составляющую DBE в память |
 |
DbeBuild():
создать compound DBE и назначить ее
текущей |
 |
DbeSetDefault():
назначить DBE умалчиваемой |
 |
DbeUnLoad():
выгрузить DBE изпамяти |
 |
DbeList():
получить список доступных (загруженных)
DBE
|
|
 |
Все
диалоговые функции, включая @ Say Get, Menu To,
TBrowse() готовы к работе с мышью. Для
активизации процесса, просто вставьте
в свою головную программу вызов
функции SetMouse(.T.). Вероятно, чаще всего в
своих программах в качестве метода
ожидания нажатия клавиши вы
используете две конструкции: Inkey() и
SetKey(). Если вы замените их на AppEvent() и
SetAppEvent(), то мышь заработает почти в
полном объеме. Естественно, надо
дописать ваш обработчик событий и не
упустить из виду, что коды клавиш для
DOS и Windows ( OS/2 ) различны.
|
Новые
ключи компилятора
 |
/ga -
преобразовать литеральные константы
в ANSI формат. |
 |
/go -
преобразовать литеральные константы
в OEM формат. |
 |
/omf -
создать obj файл формата OMF. |
 |
/coff -
создать obj файл формата COFF. |
 |
/wl -
выдача предупреждений о наличии не
лексических переменных (не
объявленных как Local или Static, не
включенных в формальный список
параметров функций, процедур или
методов). |
 |
/wi -
выдача предупреждений о наличии
лексических переменных, которые не
инициализируются, но появляются в
выражениях, где переменные должны
иметь значение, например Eval(). |
 |
/wu -
выдача предупреждений о наличии
неиспользуемых лексических
переменных. |
Использование
в качестве линкёра Blinker
 |
создавайте
.obj файлы в формате OMF |
 |
используйте
Xbase++ .lib формата OMF (...\lib\omf) |
 |
при
запуске Blinker из-под PBUILD указывайте -
LINKER = blinker /qm (/qm - синтаксис .lnk файлов -
Microsoft Link) |
 |
при
запуске Blinker из командной строки (или
ваши привычные .RMK файлы) добавьте в .LNK
файл строки:
 |
CODEVIEW
для включения отладочной
информации |
 |
defbegin
для обозначения 32 разрядого Windows
приложения |
 |
exetype
nt subsystem console для терминального
режима |
 | exetype
nt для графического режима |
 |
defend |
|
Вот
практически и все отличия Xbase++ от Clipper,
которые надо учитывать при начальной
стадии перехода с Clipper под Xbase++. |