Как Посчитать Размер Строки В Байтах?

Тема в разделе "Lotus - Программирование", создана пользователем Serduko, 27 янв 2014.

  1. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    У меня есть массив строк, которые я хочу добавить в множественное поле. Но поскольку поле ограничено размером 32 кб, то в случае слишком большого массива, можно потерять информацию. Подскажите как посчитать размер строк в байтах, хочется это сделать до того как добавлять в поле? Возможно это Len, но при добавлении в поле, размер поля увеличивается несоразмерно со строкой, поэтому не уверен. Знаю, что размер поля можно посчитать (Valuelength), но не хочется загружать систему, поскольку придется добавлять каждую ячейку в поле отдельно, а потом проверять ее размер.
     
  2. savl

    savl Well-Known Member
    Команда форума Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.104
    Симпатии:
    155
    А RichText не подойдет?
     
  3. garrick

    garrick Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    26 окт 2009
    Сообщения:
    833
    Симпатии:
    65
    Len - это длина строки в символах, размер каждого символа в байтах зависит от кодировки. Нужно длину строки умножить на кол-во байт в символе (2 или 4 не помню точно) в зависимости от от вашей кодировки.
     
  4. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Думал об этом, интерактивность сложно реализуема.

    Ansi, один байт. Вероятно, все таки поле хранит доп. информацию, наверно, посчитать сколько строка займет места в поле невозможно без добавления.
     
  5. garrick

    garrick Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    26 окт 2009
    Сообщения:
    833
    Симпатии:
    65
    Ansi - на сколько я понимаю, это только латинские буквы, у вас скорее всего unicode.
     
  6. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Что то новое ))

    http://ru.wikipedia.org/wiki/ANSI
     
  7. savl

    savl Well-Known Member
    Команда форума Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.104
    Симпатии:
    155
    Serduko
    Интерактивность? Какого рода?
    Если просто загнать и максимальная функциональность: редактирование, копирование, вставка. RT вполне подойдет.
    Отображать в виде, поиск по значению в базе: не подойдет...
    Если загонять в многозначное текстовое, я бы предварительно весь этот текст обработал: убрал бы пустые сроки, запрещенные символы(неразрывные пробелы, лишние пробелы и т.д.) Это часто бывает при вставке из email.
    Есть еще вариант... подсчитать, но совсем дикий) Записать в файл по байтам весь текст и взвесить.
    Txt файл хранит только текст, размер пустого файла: 11 байт (если не путаю), а размер пустого word 11Кб

    И так, инетерсно, если текст окажется больше, что делать будете?
     
  8. garrick

    garrick Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    26 окт 2009
    Сообщения:
    833
    Симпатии:
    65
    Хранить XML в RTF поле? Удобно разбирать потом будет.
     
  9. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Это некоторое подобие реляционных таблиц. Строка обработана, удалены лишние символы и пр., содержит данные с разделителем.
    Соответственно, программа активно работает с этими данными.

    Если текст будет больше 32, то программа автоматически переносит его на следующее поле (количество полей - любое, просто передаю их в массиве в функцию), ну а если все равно не влазит, тогда массив строк обрезается и выдается ошибка (не критичная). Сейчас массив строк обрезаю "на глаз", но хотелось бы большей эффективности.

    PS благодаря ООП, если будет связь с SQL, с мин затратами переведу на него.

    Добавлено:
    Хм., интересно. Вот только вопрос, как интерактивно менять данные в RT поле не сохраняя и не закрывая документ?
     
  10. garrick

    garrick Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    26 окт 2009
    Сообщения:
    833
    Симпатии:
    65
    Ну тогда у вас по всем законам физики длина строки в символах должна совпадать с количеством байт в этой строке, т.е. используйте Len.
     
  11. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Должна, но не совпадает с полем, где то в 1,5 раза больше (увеличивается в арифметической прогрессии).
     
  12. garrick

    garrick Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    26 окт 2009
    Сообщения:
    833
    Симпатии:
    65
    Не понял. А зачем? Поработайте "интерактивно", держа XML в памяти, по завершению работы сохраните результаты. Вы же не будете пользователю показывать этот XML. Зачем его обновлять в поле?
     
  13. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Полей может быть несколько, + диалоги.
     
  14. savl

    savl Well-Known Member
    Команда форума Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.104
    Симпатии:
    155
    Ничего не понял... Несколько полей? диалоги? Оо
    Вы через документ и эти поля хотите данные в SQL-ую базу транслировать "на лету" что ли?
     
  15. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Да, не хочу, а уже могу )). Просто я привел, вырванный из контекста, пример-проблему хранения данных в теле документа.
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.330
    Симпатии:
    329
    нотусня хранит не вин1251, для русского, по понятным причинам (иначе былоб виндозонли)
    стоит пошукать на тему
    вот здесь чета есть http://planetlotus.org/profiles/andre-guirard_100537
     
  17. Serduko

    Serduko Well-Known Member

    Репутация:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Нашел, спасибо (плюсомет зарядится, атблагадарю)

    Код (LotusScript):
    Function LmbcsLen(x$) As Long
    Dim session As New NotesSession, db As NotesDatabase, docTmp As NotesDocument
    Dim mime As NotesMIMEEntity, streamIn As NotesStream, streamOut As NotesStream
    Set db = session.CurrentDatabase
    Set docTmp = db.CreateDocument
    Set mime = docTmp.CreateMIMEEntity("Body")
    Set streamIn = session.CreateStream
    streamIn.WriteText x
    streamIn.Position = 0
    Call mime.SetContentFromText(streamIn, "text/plain;charset=LMBCS", ENC_NONE)
    Set streamOut = session.CreateStream
    mime.getContentAsBytes streamOut, False
    LmbcsLen = streamOut.Bytes
    End Function
    Теперь надо подумать, целесообразно ли пользоваться этим "извратом", либо искать другой способ отталкиваясь от этого, либо забить. :)
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.330
    Симпатии:
    329
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.330
    Симпатии:
    329
Загрузка...

Поделиться этой страницей