Глупые вопросы

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2395
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Глупые вопросы

Сообщение Дед Пахом »

vic7tar писал(а):
23 Январь 2020, 23:12
А что за нюансы?
А Вам зачем?
С уважением, ДП

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Дед Пахом писал(а):
23 Январь 2020, 23:33
А Вам зачем?
Ну да, согласно названию данного форума.
C10, Win10x64

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

В окне есть Rtf-контрол:

Код: Выделить всё

...
   TEXT,AT(15,228,182,27),USE(?StrVal),BOXED,TRN,FLAT,VSCROLL,FONT('Times New Roman',11,,,CHARSET:CYRILLIC),RTF(TEXT:FIELD)
...
В ?StrVal записываю юникодовскую строку -> крякизубры.
Вставка содержимого этой строки в TEXT через клипбоард -> всё нормально.
В чём разница?
C10, Win10x64

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2395
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Глупые вопросы

Сообщение Дед Пахом »

vic7tar писал(а):
04 Февраль 2020, 18:53
В ?StrVal записываю юникодовскую строку -> крякизубры.
Наверное есть промежуточный шаг: записываю юникодовскую строку -> Clarion посылает в контрол строку в ANSI кодировке -> крюкожабры
С уважением, ДП

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

А версию используемого в кларионе RTF-контрола как-нибудь можно выяснить?
C10, Win10x64

kreator
✯ Ветеран ✯
Сообщения: 3626
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Глупые вопросы

Сообщение kreator »

Если верить хелпу, всё зависит от файла RichEdxx.DLL в системном каталоге Винды. Другое дело - что нам с этого?
We are hard at work… for you. :)

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Версия 3.0, в MS пишут:
UTF-8 RTF This is recommended for cutting, copying, and pasting operations.
Значит опять SendMessage.
C10, Win10x64

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Ну как же можно напороться!:

Код: Выделить всё

Program
    Map.

bw  long(134)
pf  long(24)
st  long

    Code
      st = (  ( (bw * pf) + 31 )  /  32  )  * 4      !!!! st = 405
      message(st)
    Return
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4544
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Глупые вопросы

Сообщение Игорь Столяров »

С точки зрения математики - всё верно.
Проблема в том, что это упрощённый вариант алгоритма расчёта размера буфера.
Почему бы не использовать нормальный (из FreeImage) ?

Код: Выделить всё

        ! Calculate the size of the image data(accounts for 32 bit alignment of scan lines) {0FFFFFFE0h = "~31"}
        nImageSize = ABS(bih.biHeight) * BShift( Band( ((bih.biWidth * bih.biBitCount) + 31 ) , 0FFFFFFE0h), -3)
«V» значит Вендетта !

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Игорь Столяров писал(а):
25 Февраль 2020, 22:49
С точки зрения математики - всё верно.
Проблема в том, что это упрощённый вариант алгоритма расчёта размера буфера.
Почему бы не использовать нормальный (из FreeImage) ?
КОД: ВЫДЕЛИТЬ ВСЁ

! Calculate the size of the image data(accounts for 32 bit alignment of scan lines) {0FFFFFFE0h = "~31"}
nImageSize = ABS(bih.biHeight) * BShift( Band( ((bih.biWidth * bih.biBitCount) + 31 ) , 0FFFFFFE0h), -3)
Да не нужны мне эти формулы, своих хватает.
Вопрос стоит почему результат 405.
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4544
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Глупые вопросы

Сообщение Игорь Столяров »

vic7tar писал(а):
25 Февраль 2020, 23:18
своих хватает
Извините ! Я думал Вас интересует причина … ;)
Бобина-то считает всё правильно, по Вашему примеру (использовал калькулятор):

(134 * 24) + 31 = 3247
3247 / 32 = 101.46875
101.46875 * 4 = 405.875
Long = 405.875 = 405

К какой именно строке расчёта примера стоит вопрос ?
«V» значит Вендетта !

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Если использовать калькулятор, то использовать не "Инженерный", а "Программист"
Игорь Столяров писал(а):
25 Февраль 2020, 23:38
К какой именно строке расчёта примера стоит вопрос ?
vic7tar писал(а):
25 Февраль 2020, 22:13
st = ( ( (bw * pf) + 31 ) / 32 ) * 4
Результат должен быть однозначен - 404.
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4544
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Глупые вопросы

Сообщение Игорь Столяров »

vic7tar писал(а):
25 Февраль 2020, 23:47
не "Инженерный", а "Программист"
Не, у меня обычный, на батарейках. :)
Просто выведите по шагам расчёт примера в Clarion - получите то же самое … ;)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2395
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Глупые вопросы

Сообщение Дед Пахом »

Промежуточные вычисления хранятся в дробном виде:
Clarion has a Binary Coded Decimal (BCD) library of operations and procedures that execute in a manner similar to the manner in which decimal arithmetic is performed on paper. These operations use internal intermediate values with 31 digits accuracy on both sides of the decimal point.
С уважением, ДП

Аватара пользователя
vic7tar
Ветеран
Сообщения: 323
Зарегистрирован: 09 Февраль 2017, 20:12

Глупые вопросы

Сообщение vic7tar »

Я так и понял, что придём к внутренним преобразованиям.
Но от этого не легче, 405 это не 404, выражение вычисляется неверно.
Мне что теперь, каждую формулу с целочисленной арифметикой проверять вручную или , как тут советовали, писать столбиком?:

Код: Выделить всё

      st  = bw * pf
      st += 31
      st /= 32
      st *= 4
Кстати, примерчик, что привёл выше, в том же кларионе, но в сишном исполнении, даёт правильный результат.
C10, Win10x64

Ответить