Страница 9 из 14

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

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

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

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

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

Добавлено: 04 Февраль 2020, 18:53
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 через клипбоард -> всё нормально.
В чём разница?

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

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

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

Добавлено: 05 Февраль 2020, 15:40
vic7tar
А версию используемого в кларионе RTF-контрола как-нибудь можно выяснить?

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

Добавлено: 06 Февраль 2020, 10:55
kreator
Если верить хелпу, всё зависит от файла RichEdxx.DLL в системном каталоге Винды. Другое дело - что нам с этого?

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

Добавлено: 08 Февраль 2020, 14:43
vic7tar
Версия 3.0, в MS пишут:
UTF-8 RTF This is recommended for cutting, copying, and pasting operations.
Значит опять SendMessage.

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

Добавлено: 25 Февраль 2020, 22:13
vic7tar
Ну как же можно напороться!:

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

Program
    Map.

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

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

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

Добавлено: 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)

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

Добавлено: 25 Февраль 2020, 23:18
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.

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

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

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

К какой именно строке расчёта примера стоит вопрос ?

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

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

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

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

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

Добавлено: 26 Февраль 2020, 0:08
Дед Пахом
Промежуточные вычисления хранятся в дробном виде:
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.

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

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

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

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