diff --git a/programs/develop/examples/editbox/trunk/EDITBOX.INC b/programs/develop/examples/editbox/trunk/EDITBOX.INC index 278e47f1f1..e11531c16e 100644 --- a/programs/develop/examples/editbox/trunk/EDITBOX.INC +++ b/programs/develop/examples/editbox/trunk/EDITBOX.INC @@ -1,4 +1,5 @@ -; 23.01.2007 пофиксел баги вызваные не правильным кодом )). +; 26.01.2007 нормальная работа компанента исправил фукцию .check_offset +; 24.01.2007 пофиксел баги вызваные не правильным кодом )). ; 22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase ; 20.01.2007 реализовал выделение текста по shift ; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! @@ -100,14 +101,14 @@ ret ; div ecx ;разделить - остаток в edx ; push edx ;положить в стек ; ;dec edi ;смещение необходимое для записи с конца строки - ; call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx +; call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx ; pop eax ; @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) ; ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает ; ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) ; or al,0x30 ;данная команда короче чем две выше ; stosb ;записать элемент из регистра al в ячеку памяти es:edi - ; +; ; ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться ;---------------------------------------------------------- @@ -281,40 +282,42 @@ ret ;---------------------------------------------------------- .check_offset: pushad - push dword ed_offset ;сохраним смещение + mov ecx,ed_pos + mov ebx,ed_offset + cmp ebx,ecx + ja .sub_8 + + push ebx call .get_n ;получим кол-во символов в паре регистров edx:eax - mov ebx,eax - mov eax,ed_pos - xor edx,edx - idiv ebx - xor edx,edx - imul eax,ebx - mov ed_offset,eax pop ebx - cmp ax,bx - je @f -;;;;;;;; данные для закрашивания всей полосы прямоугольника - mov ebx,ed_left - inc ebx - shl ebx,16 - mov bx,ed_width - dec ebx - mov edx,ed_color - call .draw_bg_eax - mov dword [esp+28],0 -@@: popad - ret -;========================================================== -;=== обработка клавиатуры ================================= -;========================================================== -.key: -pusha - test word ed_flags,ed_focus ; если не в фокусе, выходим - je .no_figure ;@f + mov edx,ebx + add edx,eax ;ed_offset+width editbox + cmp edx,ecx + ja @f + + mov edx,ed_size + sub edx,eax + cmp edx,8 + jbe .add_8 + mov ebx,edx +; add ebx,8 + jmp .chk_d + +.sub_8: cmp ecx,0 + je .sub_min + cmp ebx,8 + jbe .sub_min + sub ebx,8 ;ebx=ed_offset + jmp .chk_d +.sub_min: + xor ebx,ebx + jmp .chk_d + +.add_8: mov ebx,edx ; ;----------- отладка ; pushad ; mov [data_of_code],0 -; mov eax,edi;word ed_flags +; mov eax,ebx;ed_offset ; mov edi,data_of_code ; call .str ; ;рисование фона @@ -333,6 +336,49 @@ pusha ; popad ; ;----------- отладка +.chk_d: mov ed_offset,ebx + + call .draw_bg + mov dword [esp+28],-1 + popad + ret + +@@: + mov dword [esp+28],0 + popad + ret + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; mov ebx,eax +; mov eax,ed_pos +; xor edx,edx +; idiv ebx +; xor edx,edx +; imul eax,ebx +; mov ed_offset,eax +; pop ebx +; cmp ax,bx +; je @f +;;;;;;;; данные для закрашивания всей полосы прямоугольника +; mov ebx,ed_left +; inc ebx +; shl ebx,16 +; mov bx,ed_width +; dec ebx +; mov edx,ed_color +; call .draw_bg_eax +; mov dword [esp+28],0 +;@@: popad +; ret +;========================================================== +;=== обработка клавиатуры ================================= +;========================================================== +.key: +pusha + test word ed_flags,ed_focus ; если не в фокусе, выходим + je .no_figure ;@f + xor ecx,ecx push eax inc ecx @@ -453,9 +499,9 @@ pusha ; вставляем код клавиши туда, где курсор ; увеличиваем значение размера и позиции inc dword ed_size - call .draw_all2 inc dword ed_pos - jmp .shift;.draw_cursor_text + call .draw_all2 + jmp .shift;.draw_cursor_text .delete: mov edx,ed_size mov ecx,ed_pos @@ -509,7 +555,13 @@ pusha and word ed_flags,ed_shift_cl call .clear_cursor call .check_offset - call .get_n +;;;;;;;;;;;;;;; + cmp eax,0 + je @f + call .draw_bg + ret +;;;;;;;;;;;;;;; +@@: call .get_n push eax mov ebx,ed_offset add eax,ebx ;eax = w_off= ed_offset+width @@ -591,7 +643,7 @@ pusha .shift: ;;;;;;;SHIFT - call .draw_bg + call .draw_bg ;не оптимально test word ed_flags,ed_shift je .f_exit ;;;;;;SHIFT end diff --git a/programs/develop/examples/editbox/trunk/editbox.asm b/programs/develop/examples/editbox/trunk/editbox.asm index 9ee1f88b25..9c4694f268 100644 --- a/programs/develop/examples/editbox/trunk/editbox.asm +++ b/programs/develop/examples/editbox/trunk/editbox.asm @@ -92,7 +92,7 @@ edit2 edit_box 168,10,30,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only edit3 edit_box 35,10,70,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only edit4 edit_box 16,10,90,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only editboxes_end: -data_of_code dd 0 +;data_of_code dd 0 ed_buffer: .1: rb 513;256 .2: rb 100 @@ -101,7 +101,7 @@ ed_buffer: ;text_b: db 'Кол-во символов' ;buffer: dd 0 buffer_end: -hed db 'EDITBOX optimization and retype date 24.01.2007' +hed db 'EDITBOX optimization and retype date 26.01.2007' i_end1: rb 2048 i_end: