Некоторые особенности при работе с BSTRING и ASTRING #3

YF> А поподробнее про этот тип данных можно?  В частности, можно ли писать Use(Bstring)? Например, Use(Astring) в CW5 не работало, а в CW55 вроде работает….

Да про нее и писать-то особенно нечего!

Данный тип автоматически преобразует записанные в него данные согласно универсальной символьной таблице, когда на каждый символ выделяется два байта.

Т.е.,если делаем присвоение, например, BStr = ‘12345’, то в памяти эта строка будет храниться как ‘1<0>2<0>3<0>4<0>5<0>’. Национальные символы будут преобразованы в соответствующие им двухбайтовые последовательности. Для программы это все делается прозрачно. Этот тип позволяет нормально работать с API-функциями, которые в качестве строковых параметров требуют строки такого формата. Раньше для этого приходилось формировать такие строки вручную.

В отличии от ASTRING, выделенная память для BSTRING никак Кларионом не учитывается. Это обстоятельство, кстати, уменьшает накладные расходы памяти для BSTRING до 4 байт, которые стоят непосредственно перед строкой и содержат длину данной строки (с учетом 2байта/символ).

А что касается USE, я так и не понял, что у тебя не работало в C5? У меня в тестовом примере на C5eeb нормально работает окно с двумя строковыми полями для ввода — ASTRING и BSTRING.

Некоторые особенности при работе с BSTRING и ASTRING #2

AN>     Я, может и щас глупость скажу, но ИМХО сей ASTRING есть ни что иное, как виндовый атом и такое поведение для него вполне естественно, т.е. при создании строки RTL лезет в таблицу атомов, ежели там такой нет, то добавляет, если есть, то увеличивает счетчик обращений к этой строке и возвращает уже ея.  При удалении строка физически удаляется из таблицы только ежели счетчик равен 0. (ну прям как FileManager в ABC с откр/закр фалов :)).

Так, ASTRING именно так и заявлена разработчиками. Как аналог атома. Я с виндовыми атомами не разбирался, но, исходя из твоего описания, могу сказать, что ASTRING несколько отличается от атома:

  • у ASTRING нет счетчика
  • она физически удаляется ТОЛЬКО при завершении программы.

Кстати, на каждую ASTRING уходит, как минимум, от 14 до 22 байт доп. памяти.

Некоторые особенности при работе с BSTRING и ASTRING

Думаю всем будет полезно узнать, что при использовании типа BSTRING в группах/очередях/классах надо запомнить следующее правило:

  • если группа/очередь/класс объявлены в глобальных данных, то в конце программы надо ОБЯЗАТЕЛЬНО ставить Clear(GROUP/CLASS). В случае использования очереди надо ОБЯЗАТЕЛЬНО пройтись по каждой записи и или очистить ее всю или сделать Clear() полям BSTRING.
  • если группа/очередь/класс объявлены как локальные для процедуры, то в конце процедуры надо выполнить аналогичные действия как и для глобальной.

В случае использования BSTRING в очередях Читать далее

DynaView

Заинтересовалось несколько человек. Спасибо! Брошу пример и библиотеку чуть позже. Просто добавил еще пару возможностей. В частности — возможность создания динамической группы на основе уже созданной другой. Что-то типа виртуального LIKE. Так что, как протестирую — сразу брошу.

Хотя, вот с примером — проблема в том, какой сделать пример? Моя тестовая программка для этого не годится — слишком много в ней лишней служебной информации. Так что — принимаются любые предложения. Читать далее

Некоторые особенности при работе с CLASS`ами

Я думаю многие обрадуются, если я сообщу, что есть возможность работать с любыми переменными любых классов!
Независимо от атрибута Private или Protected!

Особенно это актуально при работе с ABC-шаблонами, чьи классы организованы не самым лучшим образом! Теперь, для доступа к Private-переменным, нет необходимости в модификации исходников.

Все очень просто решается использованием функций What/Who/Where! Читать далее

Ошибка компилятора С5-55

В очередной раз, «копаясь» во внутренностях Клары, обнаружил довольно неприятную ошибку порождаемую компилятором.

  Map
    MyFunc(),*STRING
  End

Str &STRING

  Code
  Str &= MyFunc()
  if ~(Str &= Null) then Message(Str).
  Return

MyFunc Procedure

  Code
  Return Null

Стандартная, казалось-бы, ситуация.
Есть функция, которая возвращает указатель на строку. Неважно, как она формирует эту строку. Важно (ОЧЕНЬ!!!), что она может вернуть нулевой указатель, если, например, из-за ошибки она не смогла сформировать для возврата нужную строку. И в программе мы всегда можем после вызова данной функции проверить Читать далее

Некоторые вопросы по внутренней организации структур на базе GROUP

Здравствуйте, Алексей.

Заранее прошу прощения, если мое письмо заставило Вас оторваться от более важных дел!

Сразу оговорюсь — речь идет о версиях Clarion С5/C55.

Разбираясь с внутренней организацией структур типа GROUP/QUEUE/CLASS/FILE обратил внимание на некоторые особенности описания OVER-полей. Это, впрочем, касается только OVER-полей, размер которых МЕНЬШЕ перекрываемой ими структуры. В этом случае поле, следующее за таким OVER-полем, описывается также как OVER-поле.
Причем сдвиг для данного поля задается таким образом, что область перекрытия начинается с точки, равной Address(BaseField)+Size(OverField). Читать далее

Некоторые особенности работы QUEUE

Не так давно по эхам «пробегало» письмо, в котором автор сетовал на невозможность сортировки очереди по полям типа $STRING.

Это действительно так. Но! Это — не глюк Клариона! Это — особенность внутренней реализации структур, основанных на GROUP.

Дело в том, что структуры на основе GROUP имеют как бы двойной интерфейс доступа к полям.

Первый интерфейс — прямое обращение к полю структуры по его метке, которое обрабатывается компилятором на этапе создания программы. При этом, естественно, компилятору доступна ВСЯ информация по типам переменных. Соответственно этим типам ведется и работа с такими полями. Читать далее

Внутренняя реализация Клариона #3

СЧ> Я не совсем понял что есть «процедура обработки» и что она не обрабатывает?

«Процедура обработки» для View, как и для QUEUE кстати, это практически тот-же драйвер в терминологии FILE. Т.е. при инициализации обьекта типа View или Queue Кларой создается заголовок для них, строится описание их внутренней структуры и в заголовок записывается адрес точки входа в процедуру  обработки. Для Class, вероятно, так-же. Еще не смотрел. Для всех однотипных конструкций — одна и та-же процедура обработки. Читать далее

Внутренняя реализация Клариона #2

СЧ> Если выбирать, то второй, как более гибкий.
СЧ> Но лучше и тот и другой.
СЧ> И еще не забудь про JOIN — он более сложен чем описан у тебя.
СЧ> Лично меня сейчас в JOIN особенно интересует возможность
СЧ> включать/отключать INNER на ходу.

Ну JOIN не такой уж и сложный! По крайней мере — внутренне.
А если ты имеешь ввиду большую глубину вложенности или много JOIN на одинаковых уровнях, так это все реализуется как-бы автоматом. Главное — правильно научиться формировать главный и первый уровни View. А это я уже умею!
Что касается INNER — кто мешает управлять им через PROP:Inner?
Или я не правильно понял? И что значит «на ходу»?
Если ты имеешь ввиду — во время выборки, то ничего не получиться!
Все установки для View дают эффект ТОЛЬКО перед Open(View)!
После этого по этим установкам формируется результирующая выборка, которую и читают по Next/Previous. Читать далее