Мультистрочный виджет

Тема в разделе "WASM.ASSEMBLER", создана пользователем Rockphorr, 10 сен 2009.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    для текстового режима (консоль или командная сторка DOS) написал я виджет "однострочное поле ввода"

    там суть алгоритма сводится к тому что есть 3 основных параметра

    base - смещение 1го отображаемого
    pointer - смещение с курсором
    counter всего символов в строке

    и дополнительные координаты размер и прочее
    логика алгоритма - как только курсор выходит из отрезка [base, base+frame_size] корретируется значение base и курсор остается на своем месте у границы

    кто нить писал чтонить аналогичное но только многострочное?
    идеи по поводу вычисления длины фрагмента если там символы перехода на наовую строку ?

    может мануал кто встречал???
    нехочется особо тяжелую логику реализовывать - аля глифы и все такое
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    по ходу никто этим не заморачивался ..... :dntknw:
    буду копать в гордом одиночестве
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну, насколько я вижу из неприведённого кода, с переносом посреди пакета придётся дела иметь как раз таки посредством сложной логики .)
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Comer_

    код привести не проблема
    только он у меня 16 разрядный под дос

    и сколько кода привести - только код компонента или поноценной маленькой программы ???
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    вот фрагментик ответственный за вывод поля без учета символов разрыва строки

    Код (Text):
    1. ;=======[ SUBROUTINE ]============================
    2. ; Write field text
    3. ;-------------------------------------------------
    4. ; Parameters:
    5. ; DS:SI - seg:ofs(Widget)
    6. @Activity\; 0FFh is active, 000h is passive
    7.     =   -08h
    8. ;-------------------------------------------------
    9. @Routine_private\
    10.     Fld_Write_Text
    11.     push    BX
    12.     push    CX
    13.     push    DX
    14.     push    AX
    15.     ;-----------------------------------------
    16.     mov CX,(Widget PTR [SI])\
    17.         .Widget_Total
    18.     stc
    19.     jcxz    $exit
    20.     call    Fld_Get_Capacity
    21.     mul AH
    22.     mov DX,AX
    23.     mov BX,(Widget PTR [SI])\
    24.         .Widget_Arrow
    25.     sub BX,(Widget PTR [SI])\
    26.         .Widget_Base
    27.     jc  $less
    28.     cmp     BX,DX
    29.     jae $greater
    30.     jmp\
    31.     short   $tail
    32.     ;-----------------------------------------
    33. $less:
    34.     add (Widget PTR [SI])\
    35.         .Widget_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 (Widget PTR [SI])\
    45.         .Widget_Base,AX
    46.     ;-----------------------------------------
    47. $tail:
    48.     mov CX,DX
    49. $loop:
    50.     push    [BP+@Activity]
    51.     mov AX,DX
    52.     sub AX,CX
    53.     push    AX
    54.     push    (Widget PTR [SI])\
    55.         .Widget_Total
    56.     push    (Widget PTR [SI])\
    57.         .Widget_Arrow
    58.     push    (Widget PTR [SI])\
    59.         .Widget_Base
    60.     mov AX,(Widget PTR [SI])\
    61.         .Widget_Coords
    62.     push    AX
    63.     call    Fld_Write_Tail
    64.     loop    $loop
    65.     clc
    66.     ;-----------------------------------------
    67. $exit:
    68.     pop AX
    69.     pop DX
    70.     pop CX
    71.     pop BX
    72. @Routine_end
    73.  
    74. ;=======[ SUBROUTINE ]============================
    75. ; Write tail
    76. ;-------------------------------------------------
    77. ; Parameters:
    78. ; DS:SI - seg:ofs(widget)
    79. @Activity\
    80.     =   0Eh
    81. @Ordinal\
    82.     =   0Ch
    83. @Total\
    84.     =   0Ah
    85. @Arrow\
    86.     =   8
    87. @Base\
    88.     =   6
    89. @Coords\
    90.     =   4
    91. ;-------------------------------------------------
    92. @Routine_private\; my macro of std prologue
    93.     Fld_Write_Tail
    94.     push    DS
    95.     push    ES
    96.     push    SI
    97.     push    DI
    98.     push    CX
    99.     push    DX
    100.     ;-----------------------------------------
    101.     call    Fld_Seek_Style
    102.     ;-----------------------------------------
    103.     mov AX,ES:(Field PTR [DI])\
    104.         .Field_Symbol_Quantity
    105.     or  AL,AL
    106.     jz  $exit
    107.     or  AH,AH
    108.     jz  $exit
    109.     ;-----------------------------------------
    110.     lds SI,(Widget PTR [SI])\
    111.         .Widget_Stuff_Address
    112.     mov AX,ES:(Field PTR [DI])\
    113.         .Field_Coords
    114.     add [BP+@Coords],AL
    115.     add [BP+@Coords]+1,AH
    116.     ;-----------------------------------------
    117.     mov AX,[BP+@Ordinal]
    118.     div ES: BYTE PTR (Field PTR [DI])\
    119.         .Field_Symbol_Quantity
    120.     xchg    AL,AH
    121.     add AL,[BP+@Coords]
    122.     add AH,[BP+@Coords]+1
    123.     ;-----------------------------------------
    124.     IF  @Alone
    125. @P_Locate\
    126.         AX
    127. @Call_far\
    128.     field_dso,@Set_AX_Coords_ID
    129.     ELSE   
    130. @Locate\
    131.         AX
    132.     ENDIF
    133.     ;-----------------------------------------
    134.     mov DX,[BP+@Ordinal]
    135.     add DX,[BP+@Base]
    136.     mov CX,[BP+@Activity]
    137.     jcxz    $passive
    138.     cmp DX,[BP+@Arrow]
    139.     jne $active
    140.     call    ES:(Field PTR [DI])\
    141.         .Field_Method_Cursor; set cur coord
    142.     ;-----------------------------------------
    143. $active:
    144.     mov AX,CS:Field_Palette
    145.     xchg    AL,AH
    146.     jmp\
    147.     short   $color
    148. $passive:
    149.     mov AX,CS:Field_Palette
    150.     ;-----------------------------------------
    151.     IF  @Alone
    152. @P_Color\
    153.         AX,Color
    154. @Call_far\
    155.     field_dso,@Set_Color_ID
    156. @Call_far\
    157.     field_affix,@Measure_String_ID
    158.     ELSE
    159. @Color
    160.     call    Measure_String
    161.     ENDIF
    162.     ;-----------------------------------------
    163.     inc AX
    164.     cmp AX,[BP+@Total]
    165.     jbe $inside
    166.     mov AX,[BP+@Total]
    167.     ;-----------------------------------------
    168. $inside:
    169.     cmp DX,AX
    170.     jae $space
    171.     add SI,DX
    172.     lodsb
    173.     or  AL,AL
    174.     jnz $write
    175.     ;-----------------------------------------
    176. $space:
    177.     mov AL,ES:(Field PTR [DI])\
    178.         .Field_Space_Symbol
    179.     ;-----------------------------------------
    180. $write:
    181.     IF  @Alone
    182. @P_Out_One\
    183.         AL
    184. @Call_far\
    185.     field_dso,@Out_AL_Symbol_ID
    186.     ELSE
    187. @Out_One
    188.     ENDIF
    189.     ;-----------------------------------------
    190. $exit:
    191.     pop DX
    192.     pop CX
    193.     pop DI
    194.     pop SI
    195.     pop ES
    196.     pop DS
    197. @Routine_end    0Ch
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Comer_
    вопреки ожимданиям приведенный код не помог ...
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Com[e]r
    http://www.cracklab.ru/f/index.php?action=vthread&forum=6&topic=16566
    аууууу