Page 5 of 8
Posted: Fri Mar 09, 2007 9:28 am
by <Lrz>
Mario79
Скачай пример с моего сайта или с svn, тебе сразу будет понятно как можно это сделать. Я для тебя сделал пример.
Posted: Fri Mar 09, 2007 11:31 am
by Heavyiron
кстати, я какое-то время назад на свн выложил обновленный rdsave (правда вроде на форуме не отписался), где теперь тоже используется путь по умолчанию для эдитбокса.
Posted: Fri Mar 09, 2007 1:19 pm
by Mario79
<Lrz>
Да теперь отображается, спасибо.
Posted: Fri Mar 09, 2007 2:17 pm
by <Lrz>
Итак сегодня занаменательное событие

Я доделал управление shift+mouse. Т.е. сейчас можно выделять мышкой, удерживая shift
Как всегда замечания и предложения прошу высказывать.
Скачать можно тут
http://www.lrz.land.ru/dowload/EDITBOX.7z
* сделать выделение текста мышью, а не только shift + стрелки
* будет лучше, если щелчок мыши по эдитбоксу будет снимать выделение
Поддерживается.
Posted: Fri Mar 16, 2007 8:21 am
by Mario79
<Lrz>
Возникла пара проблем:
1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
Posted: Fri Mar 16, 2007 9:42 am
by <Lrz>
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
И так далее ))).
Надеюсь я для тебя прояснил общий алгоритм изменения
Posted: Fri Mar 16, 2007 9:53 am
by Mario79
<Lrz>
1) Спасибо за разъяснения, просто в исходниках самого компонента описано не все.
Состав структуры типа edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 вообще не был расписан.
По этому и возникли вопросы.
2) Я не просил вычислять положение элемента, это я и сам могу сделать, просто было не совсем понятно как в структуру заносить новые значения.
Posted: Fri Mar 16, 2007 11:27 pm
by Mario79
<Lrz>
Теперь у меня возникла обратная проблема: надо чтобы каждый раз выводился чистый буфер, с установленной в 0 длинной уже введенных символов.
Я пробовал заменять в данных соответствующую позицию, пробовал ставить 0 в начало буфера. Как результат затирается первый символ, а остсальное как выводилось, так и выводится. В чем хитрость?
Posted: Sat Mar 17, 2007 12:12 am
by Serge
Mario79
Попробуй так:
mov edi, edit1
mov ed_size, dword 0
mov ed_pos, dword 0
call edit_box.draw
Posted: Sat Mar 17, 2007 11:17 am
by Mario79
Serge
Спасибо, помогло.
Posted: Fri Mar 30, 2007 8:40 am
by <Lrz>
Обновил EditBox, теперь можно выделять мышкой, текст в editbox, при этом не нужно удерживать shift. Доступно на svn и на моем сайте. Удачного программирования !
Posted: Mon Apr 02, 2007 3:15 pm
by Heavyiron
Обнаружил еще один глюк в editbox (446). Если выделить всю строку мышью справа налево, то она не удаляется del-ом
Posted: Mon Apr 02, 2007 4:06 pm
by Mario79
<Lrz>
Выделенная мышью строка при повторном щелчке мышью не очищается.
А зачем удалил Shift+мышь? ИМХО большие возможности это плюс.
Posted: Mon Apr 02, 2007 4:16 pm
by <Lrz>
Heavyiron
Пожалуйста, будь внимательнее, когда ты выделяешь всю строку мышью справа налево, то если мышка выходит за пределы editbox, это можно увидеть, как появление белой полосочки рядом с буквой E, если ты конечно не вводил другой текст, в любом случае у первой буквы если ты увидел белую полосочку, это означает, что этот едит бокс не активен. и что кнопка del или backspase и любая другая, ни как не отобразятся. Т.е. ничего не измениться.
Вообще это баг, спасибо, в ближайшее время исправлю.
Posted: Mon Apr 02, 2007 4:18 pm
by Heavyiron
Марат, обнови editbox, теперь уже при щелчке мышью по выделенному фрагменту выделение снимается