Mario79
Скачай пример с моего сайта или с svn, тебе сразу будет понятно как можно это сделать. Я для тебя сделал пример.
Эффективное программирование в KOLIBRI OS
кстати, я какое-то время назад на свн выложил обновленный rdsave (правда вроде на форуме не отписался), где теперь тоже используется путь по умолчанию для эдитбокса.
<Lrz>
Да теперь отображается, спасибо.
Да теперь отображается, спасибо.
Итак сегодня занаменательное событие Я доделал управление shift+mouse. Т.е. сейчас можно выделять мышкой, удерживая shift
Как всегда замечания и предложения прошу высказывать.
Скачать можно тут http://www.lrz.land.ru/dowload/EDITBOX.7z
Как всегда замечания и предложения прошу высказывать.
Скачать можно тут http://www.lrz.land.ru/dowload/EDITBOX.7z
Поддерживается.* сделать выделение текста мышью, а не только shift + стрелки
* будет лучше, если щелчок мыши по эдитбоксу будет снимать выделение
<Lrz>
Возникла пара проблем:
1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
Возникла пара проблем:
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
И так далее ))).
Надеюсь я для тебя прояснил общий алгоритм изменения
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) Я не просил вычислять положение элемента, это я и сам могу сделать, просто было не совсем понятно как в структуру заносить новые значения.
1) Спасибо за разъяснения, просто в исходниках самого компонента описано не все.
Состав структуры типа edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 вообще не был расписан.
По этому и возникли вопросы.
2) Я не просил вычислять положение элемента, это я и сам могу сделать, просто было не совсем понятно как в структуру заносить новые значения.
<Lrz>
Теперь у меня возникла обратная проблема: надо чтобы каждый раз выводился чистый буфер, с установленной в 0 длинной уже введенных символов.
Я пробовал заменять в данных соответствующую позицию, пробовал ставить 0 в начало буфера. Как результат затирается первый символ, а остсальное как выводилось, так и выводится. В чем хитрость?
Теперь у меня возникла обратная проблема: надо чтобы каждый раз выводился чистый буфер, с установленной в 0 длинной уже введенных символов.
Я пробовал заменять в данных соответствующую позицию, пробовал ставить 0 в начало буфера. Как результат затирается первый символ, а остсальное как выводилось, так и выводится. В чем хитрость?
Mario79
Попробуй так:
mov edi, edit1
mov ed_size, dword 0
mov ed_pos, dword 0
call edit_box.draw
Попробуй так:
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+мышь? ИМХО большие возможности это плюс.
Выделенная мышью строка при повторном щелчке мышью не очищается.
А зачем удалил Shift+мышь? ИМХО большие возможности это плюс.
Heavyiron
Пожалуйста, будь внимательнее, когда ты выделяешь всю строку мышью справа налево, то если мышка выходит за пределы editbox, это можно увидеть, как появление белой полосочки рядом с буквой E, если ты конечно не вводил другой текст, в любом случае у первой буквы если ты увидел белую полосочку, это означает, что этот едит бокс не активен. и что кнопка del или backspase и любая другая, ни как не отобразятся. Т.е. ничего не измениться.
Вообще это баг, спасибо, в ближайшее время исправлю.
Пожалуйста, будь внимательнее, когда ты выделяешь всю строку мышью справа налево, то если мышка выходит за пределы editbox, это можно увидеть, как появление белой полосочки рядом с буквой E, если ты конечно не вводил другой текст, в любом случае у первой буквы если ты увидел белую полосочку, это означает, что этот едит бокс не активен. и что кнопка del или backspase и любая другая, ни как не отобразятся. Т.е. ничего не измениться.
Вообще это баг, спасибо, в ближайшее время исправлю.
Марат, обнови editbox, теперь уже при щелчке мышью по выделенному фрагменту выделение снимается
Who is online
Users browsing this forum: No registered users and 1 guest