Эффективное программирование в KOLIBRI OS

Assembler programming questions
  • кстати, я какое-то время назад на свн выложил обновленный rdsave (правда вроде на форуме не отписался), где теперь тоже используется путь по умолчанию для эдитбокса.
  • <Lrz>
    Да теперь отображается, спасибо.
  • Итак сегодня занаменательное событие :) Я доделал управление shift+mouse. Т.е. сейчас можно выделять мышкой, удерживая shift
    Как всегда замечания и предложения прошу высказывать.
    Скачать можно тут http://www.lrz.land.ru/dowload/EDITBOX.7z
    * сделать выделение текста мышью, а не только shift + стрелки
    * будет лучше, если щелчок мыши по эдитбоксу будет снимать выделение
    Поддерживается.
  • <Lrz>
    Возникла пара проблем:
    1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
    2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
  • Mario79

    1) Длинна набираемого текста ограничена, вот смотри:
    edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 - это пример инициализации editbox
    Итак попорядку:
    Это макрос инициализации структуры
    struc edit_box width,left,top,color,focus_border_color,blur_border_color,text_color,max,text,flags,size
    {
    .width dd width
    .left dd left
    .top dd top
    .color dd color
    .focus_border_color dd focus_border_color
    .blur_border_color dd blur_border_color
    .text_color dd text_color
    .max dd max
    .text dd text
    .flags dw flags+0
    .size dd size+0
    .pos dd 0 - где будет находиться курсор
    .offset dd 0
    .cl_curs_x dd 0
    .cl_curs_y dd 0
    .shift dd 0
    .shift_old dd 0
    }
    250 - это длинна editbox width
    5 - отступ от левого края left
    30 - отступ с верха top
    0xffffff - цвет внутри editbox
    0 - focus_border_color цвет рамки editbox, когда в фокусе т.е. активен editbox
    0 - blur_border_color цвет рамки editbox, когда в не фокусе т.е. не активен editbox
    0 - text_color цвет текста editbox.
    308 - max максимальное кол-во текста которое можноввести (ответ на твой вопрос, обрати внимание на то что это значение должно быть меньше на 2 чем размер буффера!! Иначе у тебя будут затерты 2 байта следующие после буффера!)
    hed - tex указатель на начало буффера
    ed_focus - флаг(и0 в данном случае установить фокус этому Editbox'у - flags
    53 - текущее значение размера size. его необходимо указывать, если тебе нужно уже отображать существующий текст. Или можно еще сделать так, ты указываешь, буфер с текстом, но тут ничего не пишешь, или 0, тогда, если человек начинает вводить свой, существующий текст уже будет автоматом затерт.

    <DATA> - тут расположен сам буффер, + текст.
    hed db 'EDITBOX optimization and retype <Lrz> date 09.03.2007',0 ; итого 54 символа
    rb 256 ; 256+54 =310 у меня указан размер 308 - 2 байта на систеиные нужды (по идее должно хватать одного, но где - то есть косяк в коде)

    2) Изменять положение при изменении размеров окна. Вообще это не задача editbox, но это достаточно просто сделать,
    .width dd width
    .left dd left
    .top dd top
    Вот часть стуктуры.

    editboxes:
    edit1 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
    edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53
    edit3 edit_box 35,5,50,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only
    edit4 edit_box 16,5,70,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only
    editboxes_end:

    А это пример инициализации
    Итак получаем
    lea eax, editboxes - в еах указатель на данные боксов.
    Далее вносим по адресу
    mov dword [eax], новое значение width
    mov dword [eax+4], новое значение left
    mov dword [eax+8], новое значение top

    Это все для первого editbox
    для второго
    add eax,ed_struc_size
    ; это размерность в байтах записи длинны одного editbox
    И снова
    mov dword [eax], новое значение width
    mov dword [eax+4], новое значение left
    mov dword [eax+8], новое значение top
    Это уже для второго editbox

    И так далее ))).
    Надеюсь я для тебя прояснил общий алгоритм изменения
  • <Lrz>
    1) Спасибо за разъяснения, просто в исходниках самого компонента описано не все.
    Состав структуры типа edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 вообще не был расписан.
    По этому и возникли вопросы.
    2) Я не просил вычислять положение элемента, это я и сам могу сделать, просто было не совсем понятно как в структуру заносить новые значения.
  • <Lrz>
    Теперь у меня возникла обратная проблема: надо чтобы каждый раз выводился чистый буфер, с установленной в 0 длинной уже введенных символов.
    Я пробовал заменять в данных соответствующую позицию, пробовал ставить 0 в начало буфера. Как результат затирается первый символ, а остсальное как выводилось, так и выводится. В чем хитрость?
  • Mario79

    Попробуй так:

    mov edi, edit1
    mov ed_size, dword 0
    mov ed_pos, dword 0
    call edit_box.draw
  • Serge
    Спасибо, помогло.
  • Обновил EditBox, теперь можно выделять мышкой, текст в editbox, при этом не нужно удерживать shift. Доступно на svn и на моем сайте. Удачного программирования !
  • Обнаружил еще один глюк в editbox (446). Если выделить всю строку мышью справа налево, то она не удаляется del-ом
  • <Lrz>
    Выделенная мышью строка при повторном щелчке мышью не очищается.
    А зачем удалил Shift+мышь? ИМХО большие возможности это плюс.
  • Heavyiron
    Пожалуйста, будь внимательнее, когда ты выделяешь всю строку мышью справа налево, то если мышка выходит за пределы editbox, это можно увидеть, как появление белой полосочки рядом с буквой E, если ты конечно не вводил другой текст, в любом случае у первой буквы если ты увидел белую полосочку, это означает, что этот едит бокс не активен. и что кнопка del или backspase и любая другая, ни как не отобразятся. Т.е. ничего не измениться.
    Вообще это баг, спасибо, в ближайшее время исправлю.
  • Марат, обнови editbox, теперь уже при щелчке мышью по выделенному фрагменту выделение снимается
  • Who is online

    Users browsing this forum: No registered users and 4 guests