Сейчас на форуме: ManHunter, _MBK_, tyns777, UniSoft (+10 невидимых)

 eXeL@B —› Программирование —› Перенос строк
Посл.ответ Сообщение

Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 09 августа 2010 11:33
· Личное сообщение · #1

пишу текстовый редактор (на самом деле просто виджет)
читаю строку с окончанием из двух байт 0A 0D из файла
меряю ее длину - и тут возникает вопрос что делать если ширина виджета на 1 меньше длины- другими словами перенос разрывает 0A 0D

как современные редакторы обрабатывают 0A 0D




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 09 августа 2010 11:55 · Поправил: Coderess
· Личное сообщение · #2

Не совсем понятен вопрос.

как современные редакторы обрабатывают 0A 0D

Пока не(конец_файла)
{
пока не(конец_строки)
{
читаем строку;
}
}

np++ с исходным кодом

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 09 августа 2010 12:36
· Личное сообщение · #3

Тоже не понял вопроса. Перенос строки не отображается, так что какая разница что и где разрывает его?



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 09 августа 2010 15:02
· Личное сообщение · #4

Coderess

чтоб было понятнее -пишу с нуля на асме под текстовый режим

вот есть у меня строка допустим длиной 11 символов (9 букв и 2 символа конца строки)

пусть есть окно шириной 10 символов в которое я вывожу этот текст

если я вывожу побайтно, то эта строка займет две линейки - первую целиком и один символ второй (остальное добиваю пробелами)

если же фильтровать эти два байта - то как ??? - как организовать объединение двух строк разделенных EOL и как разбить строку на две


Coderess пишет:
Пока не(конец_файла)
{
пока не(конец_строки)
{
читаем строку;
}
}


у меня несколько по другому - читаю небольшой текстовый файл целиком в буфер
курсор связывается со смещением относительно начала буфера

если применять побайтный подход, то все более менее решается, но некрасиво - два байта с ероглифами портят картину
если фильтровать EOL то как на него навести курсор чтобы удалить ???



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 09 августа 2010 15:25 · Поправил: HandMill
· Личное сообщение · #5

Rockphorr пишет:
под текстовый режим

если мне не изменяет память - вы обычно пишите для консольного режима(если текстовый и консольный это одно и тоже - прошу прощения)
Azur1d пишет:
Тоже не понял вопроса. Перенос строки не отображается, так что какая разница что и где разрывает его?

Я так понял ТС желает отображать символ "0x0A" в том случае если последующий символ не равен "0x0D" и ширина виджета позволяет произвести вместить в себе отображение этого символа.
Rockphorr пишет:
если я вывожу побайтно, то эта строка займет две линейки - первую целиком и один символ второй (остальное добиваю пробелами)

если же фильтровать эти два байта - то как ???


Ну допустим вот такой алгоритм:
Code:
  1. int iFileLen;
  2. char* cANSIstring;
  3. int i=0;
  4.  
  5. iFileLen=GetFileLenght("somefile.txt");
  6. cANSIstring=new char[iFileLen];
  7. // так как вы написали что выводите побайтно, то:
  8. for(i;i<iFileLen;i++)
  9. {
  10.    if(*cANSIstring[i]!=0x0A)  // Если отображаемый байт не равен 0x0A
  11.    {
  12.       if(((i+1)<=iFileLen)&&(*cANSIstring[i+1]!=0x0D))  // Если счётчик последующего символа не превышает
  13.                                                                                    // размер файла и последующий символ не равен 0x0D
  14.       {
  15.          // измеряем ширину виджета и длинну строки (в пикселах или как вашей душе угодно)
  16.          // если не вмещается - тогда увеличиваем счётчик строк и выводим следующий символ с новой строки
  17.       }
  18.       else
  19.          // нормально отображаем символ
  20.    }
  21.    else
  22.       // нормально отображаем символ
  23. }
  24. delete cANSIstring;


-----
все багрепорты - в личные сообщения




Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 августа 2010 15:44
· Личное сообщение · #6

Rockphorr
Тоже не понимающий, что надо смотреть не на 0x0D, 0x0A, а только и исключительно на 0x0A. Т.к. 0x0D это не фича виндовых редакторов, а символ перевода каретки на начало строки. Не знаю зачем виндовые редакторы ее суют постоянно, но мой совет опираться только на байт на 0x0A , конечно если он не экранирован



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 09 августа 2010 16:05 · Поправил: Rockphorr
· Личное сообщение · #7

Azur1d пишет:
Тоже не понял вопроса. Перенос строки не отображается, так что какая разница что и где разрывает его?


проблема в том как навести курсор на символ EOL (безразлично один это байт или 2) чтоб например его удалить

я только что посмотрел в нотепаде - он подлец позволяет поставить курсор до символа и после

а так как в текстовом режиме такой вкусности нету то остается добавить справа поле в 1 символ, куда будет заходить курсор в случае когда строка превышает ширину виджета на 2 символа eol



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 09 августа 2010 16:14 · Поправил: Rockphorr
· Личное сообщение · #8

HandMill пишет:

# if(((i+1)<=iFileLen)&&(*cANSIstring[i+1]!=0x0D)) // Если счётчик последующего символа не превышает
# // размер файла и последующий символ не равен 0x0D
# {
# // измеряем ширину виджета и длинну строки (в пикселах или как вашей душе угодно)
# // если не вмещается - тогда увеличиваем счётчик строк и выводим следующий символ с новой строки
# }
# else
# // нормально отображаем символ



ветка иначе меня смущает - какже мы "// нормально отображаем символ [/i]" если находимся за пределами буфера ???


ЗЫ: давайте возьмем паузу - я приведу свои наработки в читаемый вид и тогда продолжим предметно



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 09 августа 2010 16:24 · Поправил: HandMill
· Личное сообщение · #9

Code:
  1. for(i;i<iFileLen;i++)
  2. {
  3.          if(*cANSIstring<I>!=0x0A) // Если отображаемый байт не равен 0x0A
  4.          {
  5.                  if(((i+1)<=iFileLen)&&(*cANSIstring[i+1]!=0x0D)) // Если счётчик последующего символа не превышает
  6.                  // размер файла и последующий символ не равен 0x0D
  7.                  {
  8.                         // измеряем ширину виджета и длинну строки (в пикселах или как вашей душе угодно)
  9.                         // если не вмещается - тогда увеличиваем счётчик строк и выводим следующий символ с новой строки
  10.                  }
  11.                  else if((i+1)<=iFileLen) // Если счётчик последующего символа не превышает размер файла
  12.                         // нормально отображаем символ
  13.          }
  14.          else
  15.          // нормально отображаем символ
  16. }

[i]Rockphorr пишет:
ЗЫ: давайте возьмем паузу - я приведу свои наработки в читаемый вид и тогда продолжим предметно
давайте

-----
все багрепорты - в личные сообщения




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 09 августа 2010 16:48
· Личное сообщение · #10

Я опять нифига не понял - зачем тебе отборажать LF/CR ?

Rockphorr пишет:
а так как в текстовом режиме такой вкусности нету то остается добавить справа поле в 1 символ, куда будет заходить курсор в случае когда строка превышает ширину виджета на 2 символа eol

А в текстовом режиме есть другая вкусность - BackSpace удаляет символ слева от курсора, Delete удаляет символ под курсором.

sys_dev пишет:
0x0D это не фича виндовых редакторов, а символ перевода каретки на начало строки. Не знаю зачем виндовые редакторы ее суют постоянно

Потому что 0x0A - это всего лишь line feed - перевод курсора на строку вниз с сохранением позиции, чтобы вернуть курсор в начало строки используется дополнительно carriage return. Да, в зависимости от реализации достаточно одного символа, но этот подход гарантированно правильный.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 09 августа 2010 20:57
· Личное сообщение · #11

Больше похоже на парсер чем на текстовый редактор, ждем кода

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 09 августа 2010 21:02
· Личное сообщение · #12

Coderess пишет:
Больше похоже на парсер


ага.. парсер логов троя

-----
aLL rIGHTS rEVERSED!




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 10 августа 2010 08:19
· Личное сообщение · #13

Azur1d пишет:
Я опять нифига не понял - зачем тебе отборажать LF/CR ?


не в отображении проблема - можно преобразовывать отображение в пробел - проблема в форматировании в случаях когда этот символ на границе строк виджета




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 10 августа 2010 10:55
· Личное сообщение · #14

Rockphorr пишет:
как современные редакторы обрабатывают 0A 0D

Нет здесь никакой проблемы, данная комбинация рассматривается и обрабатывается как один символ - символ новой строки. Только, вообще-то правильно наоборот - 0D 0A

-----
Everything is relative...




Ранг: 53.9 (постоянный), 19thx
Активность: 0.040
Статус: Участник

Создано: 11 августа 2010 02:51
· Личное сообщение · #15

Vamit пишет:
Только, вообще-то правильно наоборот - 0D 0A

А мож он под мак пишет

По проблеме - может просто вообще не отображать (имеется ввиду не заменять на пробел итп), просто при нажатии на del находясь перед переводом или backspace находясь после него, "убирать" разрыв строк.
В случае когда он на границе (я так понимаю там wordwrap у виджета) при первом нажатии "ничего не делать", а дальше символы тереть.



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 11 августа 2010 14:32 · Поправил: Rockphorr
· Личное сообщение · #16

Вот более предметно некрасивое побайтное решение, еще не полное - сролинг глючит
в атаче фрагмент исходника и скомпилированный exe с int 3 в том же месте где она стоит в фрагменте исходника
с нетерпением жду конструктивной критики

http://www.exelab.ru/f/action=vthread&forum=12&topic=15903 &page=-1#14

Code:
  1.  
  2. ;=======[ SUBROUTINE ]============================
  3. ; Write Ladle text
  4. ;-------------------------------------------------
  5. ; Parameters:
  6. ; DS:SI - seg:ofs(Wijet)
  7. @Focus\; 0FFh is active, 000h is passive
  8.          =       -08h 
  9. ;-------------------------------------------------
  10. @Routine_private\
  11.          Ldl_Write_Text
  12.          push    BX
  13.          push    CX
  14.          push    DX
  15.          push    AX
  16.          ;-----------------------------------------
  17.          mov     CX,(Wijet PTR [SI])\
  18.                  .Wijet_Total; ¬ Єб. Ґ¬Є®бвм ЎгдҐа
  19.          stc
  20.          jcxz    $exit
  21.          call    Ldl_Get_Capacity
  22.          mov     DX,AX
  23.          mov     BX,(Wijet PTR [SI])\
  24.                  .Wijet_Glint
  25.          sub     BX,(Wijet PTR [SI])\
  26.                  .Wijet_Base
  27.          jc      $less
  28.          cmp     BX,DX
  29.          jae     $greater
  30.          jmp\
  31.          short   $tail
  32.          ;-----------------------------------------
  33. $less:
  34.          add     (Wijet PTR [SI])\
  35.                  .Wijet_Base,BX
  36.          mov     AX,BX
  37.          jmp\
  38.          short   $tail
  39.          ;-----------------------------------------
  40. $greater:
  41.          mov     AX,BX
  42.          sub     AX,DX
  43.          inc     AX
  44.          add     (Wijet PTR [SI])\
  45.                  .Wijet_Base,AX
  46.          ;-----------------------------------------
  47. $tail:
  48.          ; нв в®зЄ ®бв ­®ў ўбЇ«лўҐв Ї®б«Ґ
  49.          ; § ЇгбЄ Їа®ЈЁ Ї®¤ ®в« ¤Є®©
  50.          ; зв®Ўл Їа®йҐ Ўл«® ®аЁҐ­вЁа®ў вмбп
  51.          int     3
  52.          mov     CX,DX
  53. $loop:
  54.          mov     BX,DX
  55.          sub     BX,CX
  56.          mov     AX,[BP+@Focus]
  57.          call    Ldl_Write_Slice
  58.          loop    $loop
  59.          clc
  60.          ;-----------------------------------------
  61. $exit:
  62.          pop     AX
  63.          pop     DX
  64.          pop     CX
  65.          pop     BX
  66. @Routine_end
  67.  
  68. ;=======[ SUBROUTINE ]============================
  69. ; Get capacity
  70. ;-------------------------------------------------
  71. ; Parameters:
  72. ;-------------------------------------------------
  73. @Service_private\
  74.          Ldl_Get_Capacity
  75.          push    ES
  76.          push    DI
  77.          ;-----------------------------------------
  78.          call    Ldl_Seek_Style
  79.          ;Ї®б«Ґ ES:DI гЄ §лў ов ­ Ї а ¬Ґвал бвЁ«п
  80.          ;-----------------------------------------
  81.          mov     AX,ES: (Ladle PTR [DI])\
  82.                  .Ladle_Symbol_Quantity
  83.          ;Ї®б«Ґ ў AL иЁаЁ­ Ё ў AH ўлб®в ўЁ¤¦Ґв
  84.          mov     DX,AX
  85.          mul     AH
  86.          ; Ґ¬Є®бвм д३¬ ўЁ¤¦Ґв
  87.          ;-----------------------------------------
  88. $exit:
  89.          pop     DI
  90.          pop     ES
  91. @Service_end
  92.  
  93. ;=======[ SUBROUTINE ]============================
  94. ; Locate Slice in Ladle
  95. ;-------------------------------------------------
  96. ; Parameters:
  97. ; AX - glint
  98. ; BX - ordinal
  99. ;-------------------------------------------------
  100. @Service_private\
  101.          Ldl_Locate_Slice
  102.          push    ES
  103.          push    DI
  104.          push    CX
  105.          push    DX
  106.          ;-----------------------------------------
  107.          mov     CX,AX
  108.          call    Ldl_Seek_Style
  109.          ;-----------------------------------------
  110.          mov     DX,(Wijet PTR [SI])\
  111.                  .Wijet_Coords
  112.          mov     AX,ES: (Ladle PTR [DI])\
  113.                  .Ladle_Coords
  114.          add     DL,AL
  115.          add     DH,AH
  116.          ;-----------------------------------------
  117.          mov     AX,BX
  118.          div     ES: BYTE PTR (Ladle PTR [DI])\
  119.                  .Ladle_Symbol_Quantity
  120.          xchg    AL,AH
  121.          add     AL,DL
  122.          add     AH,DH
  123.          ;-----------------------------------------
  124.          IF      @Alone
  125. @P_Locate\
  126.                  AX
  127. @Call_far\
  128.          Ladle_dso,@Set_AX_Coords_ID
  129.          ELSE    
  130. @Locate\
  131.                  AX
  132.          ENDIF
  133.          ;-----------------------------------------
  134.          cmp     BX,CX
  135.          jne     $exit
  136.          call    ES: (Ladle PTR [DI])\
  137.                  .Ladle_Method_Cursor
  138.          ;-----------------------------------------
  139. $exit:   
  140.          pop     DX
  141.          pop     CX
  142.          pop     DI
  143.          pop     ES
  144. @Service_end
  145.  
  146. ;=======[ SUBROUTINE ]============================
  147. ; Measure Slice
  148. ;-------------------------------------------------
  149. ; Return:
  150. ; AX = length()
  151. ; DX = volume()
  152. ;-------------------------------------------------
  153. ; Parameters:
  154. ; AX - length()
  155. ;-------------------------------------------------
  156. @Service_private\
  157.          Ldl_Measure_Slice
  158.          push    ES
  159.          push    DI
  160.          ;-----------------------------------------
  161.          mov     DX,AX
  162.          call    Ldl_Seek_Style
  163.          ;-----------------------------------------
  164.          div     ES: BYTE PTR (Ladle PTR [DI])\
  165.                  .Ladle_Symbol_Quantity
  166.          or      AH,AH
  167.          jz      $skip
  168.          inc     AL
  169. $skip:
  170.          mul     ES: BYTE PTR (Ladle PTR [DI])\
  171.                  .Ladle_Symbol_Quantity
  172.          xchg    AX,DX
  173.          ;-----------------------------------------
  174.          pop     DI
  175.          pop     ES
  176. @Service_end
  177.  
  178. ;=======[ SUBROUTINE ]============================
  179. ; Find Next EOL
  180. ; ў®§ўа й Ґв Є®«ЁзҐбвў® бЁ¬ў®«®ў ®в Ў §л ¤®
  181. ; б«Ґ¤го饣® EOL ў да Ј¬Ґ­вҐ ЎгдҐа
  182. ; гЄ § ­­®Ј® а §¬Ґа (volume)
  183. ;-------------------------------------------------
  184. ; Return:
  185. ; AX = length()
  186. ; DX = volume()
  187. ;-------------------------------------------------
  188. ; Parameters:
  189. ; AX - base
  190. ; DX - volume
  191. ;-------------------------------------------------
  192. @Service_private\
  193.          Ldl_Next_EOL
  194.          push    DS
  195.          push    SI
  196.          push    CX
  197.          ;-----------------------------------------
  198.          lds     SI,(Wijet PTR [SI])\
  199.                  .Wijet_Stuff_Address
  200.          ;§ Јаг¦ Ґ¬ ¤аҐб ЎгдҐа б ⥪б⮬ ў DS:SI
  201.          add     SI,AX
  202.          mov     CX,DX
  203.          mov     DX,SI
  204.          inc     SI
  205.          ;-----------------------------------------
  206. $loop:
  207.          dec     SI
  208.          cld
  209.          lodsw
  210.          cmp     AX,0A0Dh
  211.          je      $ready
  212.          or      AL,AL
  213.          loopnz  $loop
  214.          ;-----------------------------------------
  215.          dec     SI
  216. $ready:
  217.          lea     AX,[SI]
  218.          sub     AX,DX
  219.          ;-----------------------------------------
  220.          pop     CX
  221.          pop     SI
  222.          pop     DS
  223. @Service_end
  224.  
  225. ;=======[ SUBROUTINE ]============================
  226. ; Write Slice in Ladle
  227. ;-------------------------------------------------
  228. ; Parameters:
  229. ; BX - Ordinal
  230. ; AX - Focus
  231. @Slice\
  232.          =       -2
  233. @Base\
  234.          =       -4
  235. @Gap\
  236.          =       -6
  237. @Capacity\
  238.          =       -8
  239. ;-------------------------------------------------
  240. @Routine_private\
  241.          Ldl_Write_Slice
  242.          sub     SP,8
  243.          push    CX
  244.          push    DX
  245.          ;-----------------------------------------
  246.          mov     CX,AX
  247.          ;-----------------------------------------
  248.          call    Ldl_Get_Capacity
  249.          or      AX,AX
  250.          jz      $exit
  251.          mov     [BP+@Capacity],AX
  252.          ;-----------------------------------------
  253.          mov     AX,CS:Ladle_Palette
  254.          jcxz    $Color
  255.          xchg    AL,AH
  256.          ;-----------------------------------------
  257.          IF      @Alone
  258. @P_Color\
  259.                  AX,Color
  260. @Call_far\
  261.          Ladle_dso,@Set_Color_ID
  262.          ELSE
  263. @Color
  264.          ENDIF
  265.          ;-----------------------------------------
  266.          xor     AX,AX
  267.          mov     [BP+@Base],AX
  268.          mov     [BP+@Gap],AX
  269.          mov     [BP+@Slice],AX
  270.          ;-----------------------------------------
  271. $loop:
  272.          mov     AX,(Wijet PTR [SI])\
  273.                  .Wijet_Base
  274.          add     AX,[BP+@Base]
  275.          mov     DX,[BP+@Capacity]
  276.          sub     DX,[BP+@Slice]
  277.          call    Ldl_Next_EOL
  278.          ;-----------------------------------------
  279.          call    Ldl_Measure_Slice
  280.          add     [BP+@Slice],DX
  281.          sub     DX,AX
  282.          add     [BP+@Base],AX
  283.          ;-----------------------------------------
  284.          mov     AX,(Wijet PTR [SI])\
  285.                  .Wijet_Glint
  286.          sub     AX,(Wijet PTR [SI])\
  287.                  .Wijet_Base
  288.          add     AX,[BP+@Gap]
  289.          call    Ldl_Locate_Slice
  290.          ;-----------------------------------------
  291.          cmp     BX,[BP+@Slice]
  292.          jb      $write
  293.          add     [BP+@Gap],DX
  294.          jmp     $loop
  295.          ;-----------------------------------------
  296. $write:
  297.          mov     AX,[BP+@Base]
  298.          sub     BX,[BP+@Gap]
  299.          call    Ldl_Get_Symbol
  300.          ;-----------------------------------------
  301.          IF      @Alone
  302. @P_Out_One\
  303.                  AL
  304. @Call_far\
  305.          Ladle_dso,@Out_AL_Symbol_ID
  306.          ELSE
  307. @Out_One
  308.          ENDIF
  309.          ;-----------------------------------------
  310. $exit:
  311.          pop     DX
  312.          pop     CX
  313. @Routine_end
  314.  
  315. ;=======[ SUBROUTINE ]============================
  316. ; Get Slice Symbol
  317. ;-------------------------------------------------
  318. ; Parameters:
  319. ; AX - bound
  320. ; BX - ordinal
  321. ;-------------------------------------------------
  322. @Service_private\
  323.          Ldl_Get_Symbol
  324.          cmp     BX,AX
  325.          jl      $load
  326.          ;-----------------------------------------
  327.          push    ES
  328.          push    DI
  329.          ;-----------------------------------------
  330.          call    Ldl_Seek_Style
  331.          mov     AL,ES: (Ladle PTR [DI])\
  332.                  .Ladle_Space_Symbol
  333.          pop     DI
  334.          pop     ES
  335.          ;-----------------------------------------
  336.          jmp\
  337.          short   $exit
  338.          ;-----------------------------------------
  339. $load:
  340.          push    DS
  341.          push    SI
  342.          ;-----------------------------------------
  343.          mov     AX,BX
  344.          add     AX,(Wijet PTR [SI])\
  345.                  .Wijet_Base
  346.          lds     SI,(Wijet PTR [SI])\
  347.                  .Wijet_Stuff_Address
  348.          add     SI,AX
  349.          cld
  350.          lodsb
  351.          ;-----------------------------------------
  352.          pop     SI
  353.          pop     DS
  354.          ;-----------------------------------------
  355. $exit:
  356. @Service_end
  357.  
  358.  




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 11 августа 2010 14:37
· Личное сообщение · #17

Zorn пишет:
может просто вообще не отображать (имеется ввиду не заменять на пробел итп), просто при нажатии на del находясь перед переводом или backspace находясь после него, "убирать" разрыв строк.
В случае когда он на границе (я так понимаю там wordwrap у виджета) при первом нажатии "ничего не делать", а дальше символы тереть.


вы б описали вашу логику перемещения курсора с учетом скролинга в виде алгоритма




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 12 августа 2010 19:50 · Поправил: Isaev
· Личное сообщение · #18

ответ в общем виде был в первом посте, расписали, разжували, осталость только редактор за тебя дописать
Зачем из тривиальной задачи делать проблему?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 13 августа 2010 09:06 · Поправил: Rockphorr
· Личное сообщение · #19

Isaev
да уж разжевали - пиши - нехочу
вчера до 2 ночи просидел толку - 3%
пол беды вывод с разрывом на eol - основная проблема скроллинг




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 13 августа 2010 09:45
· Личное сообщение · #20

Rockphorr пишет:
основная проблема скроллинг

У вас что скроллинг по диагонали???

-----
Everything is relative...




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 13 августа 2010 11:11
· Личное сообщение · #21

Vamit
если вы про демку то там скролинг в зачаточном состоянии - к курсору добавляются величины кратные ширине


вот фрагмент уже приведенного кода отвечающего за скролл
Code:
  1.          mov     BX,(Wijet PTR [SI])\
  2.                   .Wijet_Glint
  3.           sub     BX,(Wijet PTR [SI])\
  4.                   .Wijet_Base
  5.           jc      $less
  6.           cmp     BX,DX
  7.           jae     $greater
  8.           jmp\
  9.           short   $tail
  10.           ;-----------------------------------------
  11.  $less:
  12.           add     (Wijet PTR [SI])\
  13.                   .Wijet_Base,BX
  14.           mov     AX,BX
  15.           jmp\
  16.           short   $tail
  17.           ;-----------------------------------------
  18.  $greater:
  19.           mov     AX,BX
  20.           sub     AX,DX
  21.           inc     AX
  22.           add     (Wijet PTR [SI])\
  23.                   .Wijet_Base,AX
  24.           ;-----------------------------------------




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 16 августа 2010 16:03
· Личное сообщение · #22

кодил все выходные - в результате скролинг вперед начал работать сносно - к курсору добавляются величины кратные ширине (ну или просто ширина линии текста) - при выходе за границу отображаемого фрагмента автоматически рассчитывается сколько строк надо прокрутить,
единственная заморочка, в том если ширина большая а строки короткие то одно нажатие вниз приводит к сдвигу сразу на несколько строк, что не совсем адекватно с точки зрения юзера

завтра выложу



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 23 августа 2010 09:37
· Личное сообщение · #23

завтра затянулось, но

http://www.exelab.ru/f/action=vthread&forum=12&topic=15903 &page=-1#16



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 20 ноября 2010 19:56
· Личное сообщение · #24

Vamit пишет:
У вас что скроллинг по диагонали???


в коде виджета на основе которого писался новый - да скролинг по диагонали
да и в новом учтиывая тот факт что есть автоперенос строк иначе как по диагонали сролинг не сделаешь
без переноса - да можно разделить горизонтальный и вертикальный скрол



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 16 мая 2012 11:55
· Личное сообщение · #25

добился небольшого успеха - понял и реализовал следующую вещь -
если нужно строку с отступами (табуляцией) и символами конца строки длиной n+1
разместить в окне шириной n символов то лучше всего разбивка на n-1 символ на одной строке и 2 символа конца строки на следующей



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 16 мая 2012 13:31 · Поправил: Alchemistry
· Личное сообщение · #26

Не удержался, уж простите. Небольшой успех это за полтора года?:D

http://en.wikipedia.org/wiki/Word_wrap



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 16 мая 2012 16:34 · Поправил: Rockphorr
· Личное сообщение · #27

Alchemistry
нет успех последних 2х недель втыкания в код после более чем годовой паузы
у вики по ссылке алгос даже круче чем мой


 eXeL@B —› Программирование —› Перенос строк
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати