|
Возможные проблемыselect 0 ; dbskip() - некоторые функции типа dbskip() в клиппер50 не выдают ошибку EG_NOTABLE, а в клиппер53 - выдают ошибку, в клипе сделано как в клиппер53.
Клип поддерживает синтаксис в стиле CAVO и Flagship
static a:= chr(13) + chr(10)
FULLSCREEN/stream - clip умеет работать в двух режимах: a = fileseek(currdrive()+"/"+CurDir() + "/*.*", FA_DIRECTORY) // если в каталоге нет ни одного файла, то получаем пустой массив // если же имеем хоть один файл, то получим и список директорий // если инициализировать как: // a = fileseek(currdrive()+"/"+CurDir(), FA_DIRECTORY) // то проходит все нормально maska *.* - это досовская, а в DOS, даже если нет расширения, все равно предполагается, что в имени файла точка присутствует. В UNIX нет разделения на имя и расширение, поэтому получается что маска *.* будет искать файл/каталоги, у которых в имени имеется точка ! Для UNIX правильная маска в данном случае - "*". В clip~е объявлен #define FILE_MASK "*" зависимый от особенностей ОСи. Лучше использовать его. Наборы символов FIELD, WHILE, FOR, CASE, END и некоторые другие не всегда могут определяться как имена переменных или полей, поэтому лучше не использовать имена ключевых слов в качестве имен переменных. Не всегда честно определяется функция IF(,,) от оператора IF .. ELSE .. ENDIF. В тех местах, где возможна неопределенность - выдается ошибка. Не поддерживаются строковые константы, ограниченные символами []. Вернее, эти строки будут "интернационализированы". В данном случае лучше использовать "экранирование" в виде ключевых символов "&\", в частности можно использовать а-ля-сишные псевдо-константы &\n &\t &\r &\" &\' && и т.п. Проблема type(): в clipper - type("substr('asdf')") -> вызывается substr() type('alert()') -> не вызывается alert() Т.е., в clipper есть некоторые псевдо-функции, которые могут вызываться. В clip, в данный момент, никакие функции не вызываются из type(). Не поддерживаются FKLABEL(), FKMAX(). Не поддерживаются обнаруженная ошибка Clipper, выражающаяся в том, что на конструкцию if NIL==0 он выдает ошибку сравнения; а на выражение if (NIL==0) ошибка не выдается - хотя по правилам сравнения с NIL - в первом выражении ошибка не должна выдаваться. Мы считаем, что эта особенность Clipper не имеет практического применения и не поддерживается в Clip~е. Файловые функции, которым в качестве параметра назначается путь: - путь будет оттранслирован - символы '\' в '/' - символы "c:","d:" будут заменены на соответствующие установки, возвращаемые/устанавливаемые через SET("C:","/usr/home/c:"), - все символы в пути будут переведены в нижний регистр, если командой set translate path установлен режим ON (default - OFF). При указании имени диска в SET указывайте имя DOS-диска ("C:") именно большими буквами. - по умолчанию, в clipper-программе автоматически объявляется один диск "C:" и назначается в юниксовый каталог "/", не забывайте вставить в "init procedure" свои назначения дисков. Будьте осторожны с досовским символом "слеш", вместо него лучше использовать предопределенный в config.ch PATH_DELIM. indexExt() возвращает строку в нижнем регистре. Это связано с тем, что unix-файловые системы чувствительны к регистру букв, а имена файлов и их расширения все-таки принято называть мелкими буквами. Вывод двойной псевдографики невозможно описать через terminfo, зато можно через termcap (немножко нестандартно, используются вхождения g1 и g2, пришло от старого Demos Commander). Сделайте 'setenv TERMCAP /etc/termcap', и если в описании вашего типа терминала все в порядке с псевдографикой, то будут и двойные и одинарные линии. Если псевдографики нет вообще или вместо нее абракадабра - пишите, поможем разобраться. Вывод символов с кодами менее 32 на терминал невозможен, поэтому эти символы выводятся sym+32 и подсвечиваются другим цветом. Придется вам вспомнить о функциях DISPBEGIN(), DISPEND(). Тем, кто давно работает с терминалами, должно быть понятно для чего это нужно. А вот новичкам - советую почитать внимательнее описание этих функций и представить, как информация бегает от сервера к терминалам по узким каналам связи и в каком месте грузиться процессор при выводе "якобы на экран". Использовать их не обязательно, но желательно, особенно в тех местах, где вы сами выводите на экран и обрабатываете ввод с клавиатуры. В тех функциях и командах (PROMPT/MENU, GET/READ ...), где обработка экрана и клавиатуры производиться самостоятельно, уже используется оптимальный вывод на экран. Так что обрамлять их в BEGIN() & END() не надо. Снято ограничение на размер имени функции/процедуры в 10 символов. То же самое касается и имен переменных. И, для облегчения перехода на длину более 10 символов, в clip-препроцессоре введен еще одна команда "#xdefine lang_name small_name", которую можно использовать для быстрой замены всех длинных имен на старые короткие. Снято ограничение на размер строки в 64k. Снято ограничение на размер массива в 4096/8192 элемента. MEMOEDIT сделан на базе класса textedit, возможны проблемы с пользовательскими функциями для memoedit. get:baddate() - оформлен как метод, а не как атрибут. tbrowse-объект визуализирует не совсем так, как стандартный. Но снимает множество проблем, связанных с количеством полей в просматриваемой БД и позиционированием курсора при перемещении по таблице в пользовательских функциях. Вывод команды RUN портит экран. При выводе на терминал, данная проблема не может быть полностью решена без дьявольских ухищрений, так как получается, что несколько программ выводят независмо друг от друга на одно устройство. Примерно так же, как если бы несколько программ, не зная друг о друге, выводили бы информацию в один COM-порт. Советую использовать что-то типа: ..... run &command wait "Press any key" clear screen // или restore screen ..... И еще одна особенность команды run. В UNIX эта команда запускает shell-оболочку и потом shell выполняет команду. Так вот, команда "run cd mydir" хотя и сработает, но, при выходе из shell, текущий каталог вернется на место! Используйте функцию dirchange(new_cur_dir) для смены текущего каталога. Имеется некоторая несовместимость в error-объекте.
Там, где в программах стоит inkey() без параметров, надо поставить хотя бы inkey(0.1). Иначе программа будет поедать слишком много процессорного времени. "restore from" работает всегда с "additive". "save all like "asdf:=xxx", то такие переменные можно сохранить только явным перечислением: save asdf to my_file В DBU пришлось кое-что изменить на предмет inkey() и стабилизации в BROWSE - эти изменения обрамлены #ifdef __CLIP__. Не поддерживается, и, видимо, не будет поддерживаться команда set procedure. Используйте сборку всей программы на этапе линковки или новые возможности CLIP, связанные с po-файлами, читайте описание функции load(). setcolor() оперирует 10 парами цветов, новые 5 пар нигде явно не используются и не имеют специального назначения, введены для удобства программирования юзерных приложений. |