Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Alaska Xbase++: Отличия от Clipper

Главные отличия Alaska Xbase++ от Clipper связаны с появлением новых возможностей (классов и функций), связанных с разработкой приложений для 32-ух разрядных операционных систем. В этом документе мы не будем рассматривать эти новые возможности, а заострим внимание на тех отличиях, которые могут привести к "нежелательным" или "невразумительным" результатам.

bullet

Головная процедура должна иметь имя MAIN (это связано с особенностями работы линкера Alink). При этом любой код, находящийся вне определений Procedure или Function, считается Main процедурой.

bullet

Изменился список INIT (APPSYS, ERRORSYS, DBESYS) и EXIT (APPEXIT) процедур. Исходные тексты стандартных процедур приведены в примерах.

bullet

Parameters - выполняемый оператор (в принципе, как и в Clipper, начиная с версии 5). Следовательно, определение Local и Static переменных должно идти перед этим оператором.

bullet

В связи с особенностями работы ПО в мультисредовых ОС, циклы типа:

     do while Inkey() == 0
              - - -
     enddo

рекомендуется заменить на:

     do while Inkey(0.1) == 0
              - - -
     enddo

чтобы процессор мог стать доступным для обработки ПО в других  средах  хоть на какое-то время.

bullet

Не все команды (функции) поддерживаются. Например, DIR - считалась устаревшей еще в Clipper 5, ее заменила функция Directory(). SET FUNCTION - тоже достаточно старая команда, ее с успехом заменет SetKey. LABEL FORM, REPORT  FORM не поддерживаются в связи с тем, что Xbase++ не работает с .FRM и .LBL файлами.

bullet

Не все команды (функции, средства) работают идентично с Clipper, например, SET TYPEAHEAD TO допускает min 10, max 100 (0, в принципе, служившая для взаимодействия клавиатура - BIOS - не работает). Это связано с тем, что SET TYPEAHEAD TO 0 обнулит очередь событий (event queue), что просто приведет к остановке системы.

bullet

Изменилась структура .MEM файла (появились .XPF), соответственно, команды SAVE TO и RESTORE FROM ориентированы на работу с новой структурой. Это, на первый взгляд, неудобство с лихвой окупается тем, что в XPF файлах стало возможно хранить не только символьные и цифровые данные, но и объекты, массивы, кодовые блоки.

bullet

COPY..TO - создает не только текстовый файл, но и дополнительный структурированный файл, который позволит вам работать с текстовым файлом аналогично файлу БД. Естественно, с некоторыми ограничениями. Например, файл открывается только в монопольном режиме, невозможно удаление записей, сортировка.

bullet

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

bullet

Wopen()->Set Color To->Wselect() не запоминает настройки цветов для окон. Разработчики объясняют это тем, что Wopen() приобрела два новых параметра: настройка цветов и тип курсора.

bullet

Макроподстановки и кодовые блоки. Рекомендуется заменить макроподстановку внутри кодового блока на макроподстановку от строки. Например, { || &(asdf)} -> &("{||" + asdf + "}"). Это связано с тем, что Xbase++ выполняет макроподстановку только во время выполнения кодового блока, в то время как Clipper делает это во время определения кодового блока.

bullet

Макроподстановки и алиасы. Выражения типа Memvar->(&cMemvar) надо заменить на Memvar->&(cMemvar).

bullet

Появились новые зарезервированные слова, причем, есть слова, идентифицируемые транслятором по 4 первым символам. В связи с этим, изменились имена некоторых внутренних экспортируемых переменных и методов Get и TBrowse классов, например, oGet:Assign() -> oGet:_Assign(), oGet:End()-> oGet:_End(), oTBrowse:End()-> oTBrowse:_End()

bullet

БД по умолчанию открываются в Shared режиме (в отличие от Exclusive в Clipper). Самым простым путем преодоления этого различия будет включение в головной модуль конструкции SET EXCLUSIVE ON.

bullet

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

bullet

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

bullet

Понятие RDD (заменяемый драйвер баз данных) заменено на DBE (механизм управления базами данных). При этом, управление данными состоит по сути из 3 частей: управление собственно данными (таблицами), управление связями, и управление упорядоченностью (индексами). Каждая из частей DBE выполнена в виде отдельной DLL. Сборка "рабочей" (compound) DBE должна производиться из отдельных составляющих по мере надобности (хотя, разработчики рекомендуют делать это в INIT процедуре DBESYS). Все операции по манипулированию с DBE сводятся практически к вызовам 5 функций:

bullet

DbeLoad(): загрузить составляющую DBE в память

bullet

DbeBuild(): создать compound DBE и назначить ее текущей

bullet

DbeSetDefault(): назначить DBE умалчиваемой

bullet

DbeUnLoad(): выгрузить DBE изпамяти

bullet

DbeList(): получить список доступных (загруженных) DBE

bullet

Все диалоговые функции, включая @ Say Get, Menu To, TBrowse() готовы к работе с мышью. Для активизации процесса, просто вставьте в свою головную программу вызов функции SetMouse(.T.). Вероятно, чаще всего в своих программах в качестве метода ожидания нажатия клавиши вы используете две конструкции: Inkey() и SetKey(). Если вы замените их на AppEvent() и SetAppEvent(), то мышь заработает почти в полном объеме. Естественно, надо дописать ваш обработчик событий и не упустить из виду, что коды клавиш для DOS и Windows ( OS/2 ) различны.

Новые ключи компилятора

bullet

/ga - преобразовать литеральные константы в ANSI формат.

bullet

/go - преобразовать литеральные константы в OEM  формат.

bullet

/omf - создать obj файл формата OMF.

bullet

/coff - создать obj файл формата COFF.

bullet

/wl - выдача предупреждений о наличии не лексических переменных (не объявленных как Local или Static, не включенных в формальный список параметров функций, процедур или методов).

bullet

/wi - выдача предупреждений о наличии лексических переменных, которые не инициализируются, но появляются в выражениях, где переменные должны иметь значение, например Eval().

bullet

/wu - выдача предупреждений о наличии неиспользуемых лексических переменных.

Использование в качестве линкёра Blinker

bullet

создавайте .obj файлы в формате OMF

bullet

используйте Xbase++ .lib формата OMF (...\lib\omf)

bullet

при запуске Blinker из-под PBUILD указывайте - LINKER = blinker /qm (/qm - синтаксис .lnk файлов - Microsoft Link)

bullet

при запуске Blinker из командной строки (или ваши привычные .RMK файлы) добавьте в .LNK файл строки:

bullet

CODEVIEW для включения отладочной информации

bullet

defbegin для обозначения 32 разрядого Windows приложения

bullet

exetype nt subsystem console  для терминального режима

bullet

exetype nt для графического режима

bullet

defend

Вот практически и все отличия Xbase++ от Clipper, которые надо учитывать при начальной стадии перехода с Clipper под Xbase++.

-