Одним из главных приоритетов CLIP является совместимость с Clipper. Но в случаях когда совместимость входит в противоречие с функциональностью, последней отдается предпочтение. Это является причиной некоторых из несовместимостей. Причиной другого рода несовместимостей является различие между платформами DOS и Unix (например, различные файловые системы и "экранные возможности").
GCC 3.2.x have bugs, CLIP does not support it.
Обычно в Unix-системах пользователь должен нажимать ESC два раза. CLIP позволяет избежать этого неудобства путем эмуляции второго нажатия через некоторый промежуток времени. Продолжительность этого интервала управляется командой SET(_SET_ESC_DELAY,<nMilliseconds>). См. также о режиме SCANMODE.
Функция SETBLINK() не работает в CLIP под Unix (она всегда возвращает .T.). При использовании атрибута BLINK (символ '*' в определении цвета) некоторые терминалы показывают мигающий текст, другие - яркий фон. Консоль linux в текстовом режиме VGA мигает, в режиме окна подсвечивает фон. Если Вы используете консоль в текстовом режиме, можете воспользоваться программой SVGATextMode для переключения адаптера VGA в режим подсветки (см. опцию "16color" в /etc/TextConfig). Если Вы используете другой терминал, придется искать другой способ переключения в нужный режим.
Поскольку невозможно управлять режимом подсветки со стороны сервера, может оказаться полезной следующая функция:
blinkattr( [lEnable] ) -> lPrevState
которая позволяет запретить передачу атрибута BLINK от приложения CLIP терминалу. Если не удается переключить терминал в режим подсветки фона, можно отключить передачу атрибута BLINK (blinkattr(.f.)) и текст не будет мигать (но и фон не будет подсвечиваться). Спасибо Przemyslaw Czerpak за информацию.
Некоторые функции RDD (например DBSKIP()) не генерируют ошибку EG_NOTABLE при отсутствии рабочей области в Clipper 5.01. Но при использовании Clipper 5.3 (и Clipper 5.2) ошибка генерируется. В этом случае CLIP работает как Clipper 5.3.
При использовании CLIP под Unix невозможно открыть таблицу в режиме EXCLUSIVE READONLY. В этом случае таблица открывается в режиме SHARED READONLY. Причиной этого является различие в механизмах блокировки файлов, используемых DOS и Unix.
AS и REF являются зарезервированными ключевыми словами. См. описание ключа -q в разделе опции компилятора.
В Clipper CHR(<nConst>) является константой (транслируемой на этапе компиляции). В CLIP CHR() - обычная функция, всегда выполняемая в run-time.
Приложения CLIP могут работать в двух режимах: полноэкранном и потоковом. При старте приложение CLIP работает в потоковом режиме, т.е. весь вывод направляется в поток стандартного вывода (stdout). Приложение продолжает работать в этом режиме до первой полноэкранной операции (например, показ окна, вывод данных в определенную позицию экрана или опрос клавиатуры). При этом инициализируется терминал, производится переключение в полноэкранный режим и прекращается вывод в (stdout).
![]() | Следуйте этим двум простым правилам:
|
В файловых системах Unix, маске файлов *.* соответствуют все файлы, содержащие точку ('.') в имени. Используйте платформо-зависимую константу FILE_MASK вместо '*.*'.
Не используйте ключевых слов (FIELD, WHILE, FOR, CASE, END, и т.д.) в качестве имен переменных.
При некоторых обстоятельствах функция IF(,,) не может быть отличена компилятором от оператора IF ... ELSE ... ENDIF. В таких случаях выдается предупреждающее сообщение.
В Clipper функция TYPE() выполняет некоторые функции (например SUBSTR()), а некоторые не выполняет (например ALERT()). CLIP не выполняет никакие функции и возвращает 'UI' для выражений, содержащих вызовы функций.
В Clipper есть одна странная особенность:
if NIL==0 // generates run-time error if (NIL==0) // OK
Эта особенность не поддерживается в CLIP (оба примера работают).
Файловые системы Unix различают регистр букв в именах файлов (USE table.dbf и USE TABLE.DBF - не равнозначные команды). Для облегчения переноса приложений из DOS в Unix существует команда SET TRANSLATE PATH ON. Когда ON все имена файлов (и директорий) переводятся в нижний регистр. В этом случае полный путь к файлу и имя самого файла на диске должны быть в нижнем регистре. Когда OFF перевода в нижний регистр не производится. В этом случае имена файлов на диске должны соответствовать именам, по которым к ним обращаются.
Имена дисков (C:, D:, и т.д.) могут быть назначены директориям следующим способом:
SET("C:","/home/rust/diskC") SET("D:","/home/rust/diskD")
По умолчанию имя диска C: назначено корневой директории (/).
Функция INDEXEXT() возвращает расширение индекса в нижнем регистре.
Вывод двойной псевдографики невозможен на некоторых терминалах. Это возможно при использовании описателя терминалаtermcap вместо terminfo (установите переменную окружения TERMCAP=/etc/termcap и см. вхождение g1 для символов одинарной псевдографики и g2 для символов двойной псевдографики в файле /etc/termcap).
Вывод символов с кодами меньше 32 невозможен на терминалах Unix. Эти символы отображаются в виде подсвеченных символов с кодами<nSymbol> + 32.
Придется вспомнить о функциях DISPBEGIN(), DISPEND(). Тем, кто давно работает с терминалами, должно быть понятно для чего это нужно. Использовать их необязательно, но желательно, особенно в тех местах, где Вы сами выводите на экран и обрабатываете ввод с клавиатуры. При использовании функций и команд производящих обработку экрана и клавиатуры самостоятельно(PROMPT/MENU, GET/READ, и т.д.), обрамлять их в DISPBEGIN() & DISPEND() не надо.
Отсутствует ограничение длины имен функций/процедур в 10 символов. Для обегчения переноса приложений можно воспользоваться директивой #xdefine (нечувствительный к регистру аналог #define).
Отсутствует ограничение длин строк в 64K.
Отсутствует ограничение размера массивов в 4096/8192 элементов.
Функция MEMOEDIT() основана на классе TEXTEDIT и могут быть некоторые проблемы с пользовательскими функциями для MEMOEDIT().
get:baddate() - метод, а не атрибут.
Визуализация объектов TBrowse отличается от стандартного, зато снимаются некоторые проблемы связанные с определением количества отображаемых столбцов и позиционированием курсора в пользовательских функциях.
Вывод команды RUN портит текущее содержимое экрана. При выводе на терминал эта проблема не может быть полностью решена без некоторых ухтщрений. Рекомендуем использовать что-то подобное:
run &command wait "Press any key" clear screen // or restore screen
И еще одна особенность использования команды RUN - в Unix она запускает командный интерпретатор (shell), который, в свою очередь, запускает нужную программу. Хотя run cd mydir и сработает, но при выходе из shell текущая директория останется той же, что и была раньше.
Имеются некоторые несовместимости в объектах Error.
Рекомендуется использовать inkey(0.1) вместо inkey(), иначе приложение будет занимать слишком много процессорного времени. В частности, пришлось сдлеать некоторые изменения в DBU касающиеся INKEY() и стабилизации объектов TBrowse; эти изменения изолированы директивами #ifdef __CLIP__.
RESTORE FROM всегда работает в режиме ADDITIVE.
Команда SET PROCEDURE не поддерживается и вряд ли будет поддерживаться. Линкуйте приложения из объектных файлов или используйте новые возможности, связанные с PO-файлами; см. описание функции LOAD().
Функция SETCOLOR() оперирует 10-ю парами цветов; дополнительные 5 пар не имеют какого-то специального предназначения и введены для удобства.