Главные отличия Alaska Xbase++ от Clipper связаны с появлением новых возможностей (классов и функций), связанных с разработкой приложений для 32-ух разрядных операционных систем. В этом документе мы не будем рассматривать эти новые возможности, а заострим внимание на тех отличиях, которые могут привести к "нежелательным" или "невразумительным" результатам. Alaska Xbase++: Отличия от Clipper
![]() |
Головная процедура должна иметь имя MAIN (это связано с особенностями работы линкера Alink). При этом любой код, находящийся вне определений Procedure или Function, считается Main процедурой. |
||||||||||
![]() |
Изменился список INIT (APPSYS, ERRORSYS, DBESYS) и EXIT (APPEXIT) процедур. Исходные тексты стандартных процедур приведены в примерах. |
||||||||||
![]() |
Parameters - выполняемый оператор (в принципе, как и в Clipper, начиная с версии 5). Следовательно, определение Local и Static переменных должно идти перед этим оператором. |
||||||||||
![]() |
В связи с особенностями работы ПО в мультисредовых ОС, циклы типа: |
||||||||||
![]() |
Не все команды (функции) поддерживаются. Например, 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 функций:
|
||||||||||
![]() |
Все диалоговые функции, включая @ 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 файл строки:
|
Вот практически и все отличия Xbase++ от Clipper, которые надо учитывать при начальной стадии перехода с Clipper под Xbase++.