VS> А вот что с Clarion’oм делать? Ждать документирования BString? Или попробовать ее заюзать?
А чего ждать? Я, кажется, недавно описывал суть, возможности и способы использования строк этого типа. На всякий случай, напомню:
- строки данного типа представляют собой хранилища данных в юникоде динамического размера.
- при присваивании значения такой строке, сначала освобождается ранее занятая ею память (если уже была инициализация), после чего выделяется новый блок памяти размером, как минимум, равным удвоенной длине нового значения + 4(2 для 16-бит) байта для длины.
- при записи нового значения в выделенную память происходит конвертация обычного ANSI-текста в юникод.
- при считывании значения такой строки автоматом происходит обратная конвертация юникода в ANSI-текст.
- до первого присваивания поле такого типа содержит нулевой указатель, что, впрочем, не приведет к ошибке при операции типа: Str = BStr, т.к. функции ядра по манипулированию данными в стеке корректно обрабатывают нулевые указатели.
Т.е., само по себе такое поле представляет обычный 4-байтовый указатель на сконвертированную строку. Непосредственно перед данными располагается поле длины строки в юникоде (UNSIGNED).
BSize UNSIGNED BStr BSTRING Code BStr = 'Проверка' Peek(Address(BStr),Addr#) ! в Addr# - адрес первого байта строки в юникоде Peek((Addr#-Size(BSize)),BSize) ! в BSize - длина строки в юникоде ! Size(BStr) или Len(BStr) вернут результат = BSize/2
Хотя строки данного типа не разрешены в описании структуры записи файла, тем не менее, используя приведенную выше информацию, их можно записывать/считывать, используя обычные строки достаточной длинны. Или Memo/Blob. В принципе, в каком-то смысле возможна и корректная сортировка по таким юникод-строкам независимо от языка записанных данных, т.к. в юникоде любой символ любого языка(ну, или почти любого) имеет уникальный код.