Неофициальный FAQ по языку Topspeed Clarion [Dos/Windows]

1. Как во время выполнения программы менять размеры Control элементов? (CW)

2. Как заставить выводить сообщение Tip по-русски? (CW)

3. Как ввести минус (-) в Entry поле формата @N-10.2? (CW)

4. Как сделать в окне с двума ListBox интерфейс а-ля Win95 Explorer и чтобы можно
было красиво менять размер ListBox? (CW)

5. При работе с MS SQL и Clarion 2.0 с ODBC драйвером при каждом обращении к таблицам требуется
вводить пароль (иногда несколько раз). Как стандартными путями побороть это? (CW)

6. Есть ли драйверы ODBC для кларионовских файлов (драйвера Clarion и
TopSpeed, .dat и .tps соответственно)? (CW)

7. Как присваивать из MEMO в STRING в соответствии с переносами строк
в MEMO? Или как найти сам код переноса строки в MEMO? (CW)

8. Как избежать следующего сообщения при линковке? (CW)
Making ProgName.exe
Link error: Group, or Segclass exceed 64 k.

9. Как в ListBox Tree, построенному по QUEUE, сворачивать-разворачивать ветви? (CW)

10. Почему в ListBox с деревом не работает скролинг по горизонтали? (CW)

11. Как читать числа из dbf? (CDD)

12. Хотелось бы знать, влияет ли на надежность, то что все таблицы (кроме справочников) я храню в
одном физическом файле? А также, влияет ли шифрование? (CW/CDD)

13. Как заставить REPORT не ограничивать размеры бумаги, если принтер этот
формат не поддерживает? (CW)

14. Как удалить файл, зная только его имя? (CDD)

15. Где взять русифицированные темплейты для CW2003? (CW)

16. Где взять русские темплейты для C4? (CW)

17. Для чего в Clarion используется вид связи между файлами INNER-JOIN? (CW)

18. А можно ли где галочек понаставить, чтобы мне пpога одним .exe вылезала,
а не пpиходилось к ней кучку .dll пpилагать? (CW)

19. Как передать событие из одного thread в другой? (CW)

20. Как отдать квант времени другим задачам из LOOP? (CW)

21. В отчете необходимо вывести подсчеты сумм по некоторым признакам. (CW)

22. Как построить сложный фильтр данных для БД? (CW)

23. Как отследить попытку ввода в BYTE по формату @N3 числа больше 255? (CW)

24. Как синхронизировать два Browse в одном окне? (CW)

25. А можно подpобнее о виpтуальных listbox’ах? (CW)

26. Как сделать, чтобы некоторый элемент (например, прямоугольник) изменял
свой цвет в зависимости от выбранной в «Свойствах экрана» цветовой
схемы Windows? (CW)

27. Возможно ли в Menu под пункты выбора выводить символьную строку,
текст которой формируется и меняется в процесе работы? (CW)

28. Существует ли способ перевода русских символов в базах данных из
DOS в Windows? (CW/CDD)

29. Какой embed нужно использовать для установки фильтра для browse в CW4?

30. Как заставить работать программы, скомпиленные под CDD 3.0 на
Pentium II-300? (CDD)

31. Каковы ограничения для передавемых и получаемых строк в функциях
GETINI/PUTINI? (CW20)

32. Существует ли в CW, возможность управлять классами пользователя? (CW)

33. Как поместить иконку в ITEM/MENU и менять её во время выполнения
программы? (CW)

34. Возможноли получить «Стандарты Кларион» по почте? (CW)

35. Как сконвертировать БД из одно формата в другой? (CW/CDD)

36. Как конвертировать массивы в DAT файле из OEM в ANSI? (CW)

37. Что нужно сделать для того, что бы поле поиска активизировалось
при нажатии русских букв и работало? (CDD)

38. Что такое MS SQL Accelerator? А так же SQL Anywhere Accelerator? (CW)

39. Как сделать связь One-To-One от одного файла к нескольким? (CW)

40. Можно ли сделать опциональный HIDE пунктов в PopUp меню в RunTime? (CW)

41. Можно ли находясь в окне на ListBox по нажатию MouseRight вызвать
всплывающее меню? (CW)

42. Как сделать окно always on top? (CW)

43. Как передать параметры командной строки приложению запущенному из среды
Clarion? (CW)

44. Как получить полный путь к исполняемому файлу приложения? (CW)

45. Как на этапе выполнения программы изменить некое свойство элемента
отчета? (CW)

46. Как перевести русские символы в БД, созданной в ДОС, для ее просмотра
в приложениях под Windows? (CW)

47. Как засунуть свой обработчик окна в класс — CallWindowProc? (CW)

48. Как запустить программу с параметрами? (CW/CDD)

49. Как правильно использовать оператор RUN в конструкции
RUN(‘nver.exe > aaa.txt’) для перенаправления результатов в файл? (CDD)

50. Как получить/выводить наименования месяцев, дней недели на русском
языке? (CW)

51. В embed-редакторе обнаружил «новое» событие у кнопок и полей ввода.
Что это за событие? (CW)

52. Как записать DOS-файл в BLOB? (CW)

53. Как можно произвести автоматическое переключение раскладки клавиатуры
в зависимости от алфавита (русский/латинский) букв в поле ввода? (CW)

54. Как избежать ошибки General Protection Fault при выборе True Type
шрифта при работе под Windows 98? (CW)

55. Как узнать пароль, с помощью которого зашифрованы базы данных? (CW/CDD)

56. Как проще всего в Browse закрепить одну(левую) колонку? (CW)

57. Как сделать надпись на кнопке в несколько строк? (CW/CDD)

58. Каким образом можно задать в словаре переменное имя для файла
данных? (CW)

59. Как в отчете вывести только одну выбранную в BROWSE запись? (CW/CDD)

60. Как создать итоговое поле по странице которое будет суммировать
только положительные значения? (CW,Legacy)

61. Подскажите, как менять цвет текста в поле, делаю ?stroka1{PROP:COLOR} = 000000FFh
меняет цвет фона а как текста

62. Когда вывожу sndPlaySound(SoundFile,0), система стоит ,когда звук закончился все опять движется,
возможно как то по другому что и звук был и работать можно.

63. Я снова потерял доку, что нужно править в реестре win2k, чтобы не вылетала
клара при наведении на кнопки управления окна.

1. Как во время выполнения программы менять размеры Control элементов? (CW)
Отлавливай события EVENT:Size и/или EVENT:Sized и используй свойства
элементов {PROP:XPos}, {PROP:YPos}, {PROP:Width}, {PROP:Height}. В
CW2002 и далее данные операции поддерживаются на уровне темплейтов.

2. Как заставить выводить сообщение Tip по-русски? (CW)
Убить все нерусские шрифты (какие возможно). Изменить файл WIN.INI примерно
(хотя бы только Arial) следующим образом:

[FontSubstitutes]
Tms Rmn=Time Roman
Times=Time Roman
Times New Roman=TimesDL
Times New Roman,0=TimesDL,204
Times New Roman,204=TimesDL,204
Arial=Arial Cyr
Arial,0=Arial Cyr,204
System,0=System,204
Fixedsys,0=Fixedsys,204
Small Fonts,0=Small Fonts,204
MS Sans Serif,0=MS Sans Serif,204

Аналогичные действия для WinNT, только в Registry. На моей странице есть еще рекомендации.
В C5b появилось свойство SYSTEM{PROP:CharSet}, которое позволяет избежать всего выше описанного.

3. Как ввести минус (-) в Entry поле формата @N-10.2? (CW)

Сначала набираешь цифры, затем жмешь минус. Он же работает как Enter.

4. Как сделать в окне с двума ListBox интерфейс а-ля Win95
Explorer и чтобы можно было красиво менять размер ListBox? (CW)

Вешаешь на границу Listbox’ов REGION (невидимый ). У него есть
интересные события:

EVENT:MousIn    ! Мышь попала в область региона
EVENT:MouseOut  ! Мышь ушла из область региона
EVENT:MouseMove ! Мышь движется в области региона
EVENT:MouseDown ! Событие движения
EVENT:MouseUp   ! Left Button отжата

Еще для красоты движения границы на регион накладывается LINE Control
Ну, а дальше

EVENT:MouseIn   - меняем курсор на стрелочки лево & право
EVENT:MouseOut  - восстанавливаем курсор
EVENT:MouseMove - UNHIDE(LINE Control)
EVENT:MouseDown - ?Line{PROP:Xpos} = MouseX()
?Region{PROP:XPos} = MOUSEX()
EVENT:MouseUp - ?Line{PROP:Hide} = TRUE
?List1{PROP:Width} = ?Region{PROP:XPos} - ?List1{PROP:XPos}
I#                 = ?List2{PROP:XPos}
?List2{PROP:Xpos}  = ?Region{PROP:XPos}  + ?Region{PROP:Width}
?List2{PROP:Width} = ?List2{PROP:Width} - I# + ?List2{PROP:XPos}

У региона должен быть арибут IMM и TRN.

5. При работе с MS SQL и Clarion 2.0 с ODBC драйвером при каждом
обращении к таблицам требуется вводить пароль (иногда несколько
раз). Как стандартными путями побороть это? (CW)

Путей по меньшей мере два:
Использовать PROP:ConnectString — см. раздел «Undeclared Properties»
в документации.
Если существует открытая таблица, то данные для login’а лишний раз
не запрашиваются. Соответственно, решение в том, чтобы в начале
исполнения программы открыть на сервере какую-либо левую таблицу и
держать ее открытой до выхода из программы.

6. Есть ли драйверы ODBC для кларионовских файлов (драйвера Clarion и
TopSpeed, .dat и .tps соответственно)? (CW)

Есть только для драйвера TopSpeed.

7. Как присваивать из MEMO в STRING в соответствии с переносами строк в
MEMO? Или как найти сам код переноса строки в MEMO? (CW)

Перенос строки в MEMO — это код <13,10>. Отсюда делай выводы как и что
можно отловить.

8. Как избежать следующего сообщения при линковке? (CW)
Making ProgName.exe
Link error: Group, or Segclass exceed 64 k.

Clarion тут ни при чем. Для 16-битовых моделей размер сегмента не
может превосходить 64К. Код, полученный компиляцией одного исходного
модуля, попадает в один сегмент. Если пытаться всю программу с парой
сотен процедур засунуть в один исходник, то результат будет
соответствующим. Как видно из вопроса, в одном исходном модуле
находятся тексты методов нескольких классов. Поэтому, первый шаг в
решении проблемы 64К, — это разнесение методов разных классов по
разным исходным модулям. Если класс настолько развесистый, что даже
один он приводит к превышению ограничения 64К, то следует длинные
логически законченные фрагменты текста выделять в процедуры (не методы)
и определить их в других исходных модулях. Хотя с моей точки зрения,
просто не надо так писать программы.

9. Как в ListBox Tree, построенному по QUEUE, сворачивать-разворачивать ветви? (CW)

Примерная структура Queue:

Queue        QUEUE,PRE(QKB)
NameOfBranch   STRING(60) ! Что показываем
NormalFG       LONG       ! Цветовое
NormalBG       LONG       ! решение
SelectedFG     LONG       ! строк
SelectedBG     LONG       ! дерева
Icon           SHORT      ! Номера иконок
Level          SHORT      ! Уровень ветви
             END

Изменяя знак (+/-) Queue.Indent можно сворачивать/разворачивать
ветви дерева. ListBox реагирует после выполнения ADD(Queue). Не
забывайте отслеживать «листья» дерева — при изменении знака боксики
с (+/-) могут появляться и у «листьев».

10. Почему в ListBox с деревом не работает скролинг по горизонтали? (CW)

Чтобы заработал скроллинг надо в ListBox-formatter-е в Properties…
выбрать закладку Field, установить флажок Scroll Bar и поставить
нужный Size поля прокрутки.

11. Как читать числа из dbf? (CDD)

Пример: Number — это Numeric 4 0
Описываешь так:
NumberEMPLOYERS STRING(4),NAME(Number=N(4))
В Dictonary это прописывается в External Name.
ИМХО достаточно описать так:
Number STRING(@n_4.0), где 0 — количество десятичных знаков.

12. Хотелось бы знать, влияет ли на надежность, то что все таблицы
(кроме справочников) я храню в одном физическом файле? А также,
влияет ли шифрование? (CW/CDD)
Если грохнется, то грохнется вся база — поддержание целостности 🙂
Шифрование не влияет.

13. Как заставить REPORT не ограничивать размеры бумаги, если принтер
этот формат не поддерживает? (CW)

Купить другой принтер… 😉

14. Как удалить файл, зная только его имя? (CDD)

Можно воспользоваться сишной процедурой:

MODULE('C Standard Library')
  RemoveFile(*CSTRING),SHORT,RAW,NAME('_remove')
END

А можно и описать временный файл в EMBED’ах. Поскольку его никто
открывать не собирается, REMOVE замечательно сработает.
Hапример, так (в Global…)

FileName CSTRING(65),STATIC
Tmp      FILE,DRIVER('DOS'),NAME(FileName)  ! Или любой другой драйвер
Record     RECORD
S1           STRING(1)
           END
         END

В коде процедуры:

CODE
FileName = имя файла
REMOVE(Tmp)

15. Где взять русифицированные темплейты для CW2003? (CW)

На моем FAQ-сервере находится последняя версия темплейтов от
Вадима Синявского для CW2003. Для того, чтобы их получить,
перейдите на страницу «Интересные места».
http://www.dvgu.ru/lemoi/clafaq/faqcgi.cgi?

16. Где взять русские темплейты для C4? (CW)

На моем FAQ-сервере имеется русифицированная версия шаблонов
для C4 класс Clarion от Вадима Синявского. Для класса ABC —
на страницах Кирилла Щербы.
http://www.dvgu.ru/lemoi/clafaq/faqcgi.cgi?
http://www.dol.ru/ (уточняется)…

17. Для чего в Clarion используется вид связи между файлами INNER-JOIN? (CW)

Если у потомка нет записи, соответствующей родительской, то при
OUTER JOIN запись потомка появится, но будет обнуленной, а при
INNER JOIN не появится даже родительская запись.

18. А можно ли где галочек понаставить, чтобы мне пpога одним .exe
вылезала, а не пpиходилось к ней кучку .dll пpилагать? (CW)

Project -> Propertis -> Run-time Library -> Local

19. Как передать событие из одного thread в другой? (CW)

Делаешь глобальную пеpеменную, напpимеp с именем Process.
Далее, на EVENT:OpenWindow, EVENT:GainFocus и т.п. в окне
пpописываешь Process = THREAD(). После этого, по нажатию кнопочки
в твоем Source делаешь так:

POST(400h,,Process) ! 400h — номеp твоего собственного события.

Таким обpазом, пpоизойдет событие под номеpом 400h в твоем
_конкpетном_ окне. А там уж его отлавливаешь и делаешь,
что нужно.

Дополнительно, пользовательские события определяются, начиная с
номера 400h. В файле equates.clw определены две полезные
макроподстановки:

EVENT:User EQUATE(400h)  - самое первое пользовательское событие
EVENT:Last EQUATE(0FFFh) - самое последнее событие.

20. Как отдать квант времени другим задачам из LOOP? (CW)

Используй оператор YIELD.

21. В отчете необходимо вывести подсчеты сумм по некоторым признакам. (CW)

Для решения подобной проблемы лично я делаю ряд магических
телодвижений: 🙂

Завести новую DETAIL.
Всем элементам Report присвоить имена для USE(?detail ets.).
В параметрах отчета -> DETAIL_фильтр для основной detail
создать фильтр XXX# = XXX# и поставить галочку
«Исключить нефильтруемые Detail».
В Embeds «После печати Detail структур» выполняем суммирование.
В Embeds «Перед печатью препросмотра» печатаем detail с результатами.

22. Как построить сложный фильтр данных для БД? (CW)

В Embed «Validate record-Filter checking» пишешь:

IF условие не верно THEN EXIT.

И можно использовать любые переменные

Я делаю несколько по другому. Пишу функцию, которая возвращает 1/0
и вставляю ее в фильтр. Функция должна возвращать STRING. Для
использования в фильтре ее нужно сначала BIND. Вернее, здесь
нужно заглянуть в HELP и посмотреть соглашения для использования
функций в BIND. В таком случае получается фильтр, который можно
использовать в различных поцедурах без переделки.

23. Как отследить попытку ввода в BYTE по формату @N3 числа больше 255? (CW)

Объявляем локальную переменную типа SHORT, к ней формат @N3 и
верхнюю границу 255. Перед записью на диск:
ПеременнаяБазы = Локальная переменная. Все должно быть ОК.

24. Как синхронизировать два Browse в одном окне? (CW)

Объяви одно из полей (желательно уникальное) одного броузера,
как «Сторожевое поле» («Reset Field») для второго броузера.

25. А можно подpобнее о виpтуальных listbox’ах? (CW)

Смотрите описание PROP:VLBproc и PROP:VLBval в Language Reference.

26. Как сделать, чтобы некоторый элемент (например, прямоугольник)
изменял свой цвет в зависимости от выбранной в «Свойствах экрана»
цветовой схемы Windows? (CW)

При выборе цвета надо указать не «Basic Colors», а
«Standard Colors». Например, для случая цвета фона активного
окна выбираем в DropBox «Standard Colors» элемент «Active Caption».

27. Возможно ли в Menu под пункты выбора выводить символьную строку,
текст которой формируется и меняется в процесе работы? (CW)

Изменять текст в пунктах меню можно традиционно: