Box lib tree list/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(Created page with '==Функции== *tl_data_init Конструктор элемента, нужно вызывать перед использованием элемента для выделе...')
 
No edit summary
Line 1: Line 1:
==Функции==
==Функции==
*tl_data_init
*'''tl_data_init''' - Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
*'''tl_data_clear''' - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
*tl_data_clear
*'''tl_info_clear''' - Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
*'''tl_key''' - Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
*tl_info_clear
*'''tl_mouse''' - функция для событий от мыши.
Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
*'''tl_draw''' - полная перерисовка окна элемента.
*tl_key
*'''tl_info_undo''' - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
*'''tl_info_redo''' - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
*tl_mouse
*'''tl_node_add''' - Добавляет узел, в позицию указанную курсором. Пример добавления узла:
Функция для событий от мыши.
*tl_draw
Полная перерисовка окна элемента.
*tl_info_undo
Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
*tl_info_redo
Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
*tl_node_add
Добавляет узел, в позицию указанную курсором. Пример добавления узла:
<asm>  push dword tree1
<asm>  push dword tree1
   push dword 0x10002
   push dword 0x10002
Line 23: Line 14:
   call dword[tl_node_add]</asm>
   call dword[tl_node_add]</asm>
где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
*tl_node_set_data
*'''tl_node_set_data''' - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
Устанавливает новые данные (пользовательские и подпись) в узел под курсором.
*'''tl_node_get_data''' - берет указатель на данные (пользовательские и подпись) из узла под курсором.
*tl_node_get_data
*'''tl_node_delete''' - удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
Берет указатель на данные (пользовательские и подпись) из узла под курсором.
*'''tl_cur_beg''' - ставит курсор в начало списка, перематывает скроллинг если нужно.
*tl_node_delete
*'''tl_cur_next''' - переносит курсор на одну позицию ниже.
Удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
*'''tl_cur_perv''' - переносит курсор на одну позицию выше.
*tl_cur_beg
*'''tl_node_close_open''' - Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
Ставит курсор в начало списка, перематывает скроллинг если нужно.
*'''tl_node_lev_inc''' - Добавить уровень узла под курсором. Делает узел дочерним.
*tl_cur_next
*'''tl_node_lev_dec''' - Уменьшает уровень узла под курсором. Делает узел родительским.
Переносит курсор на одну позицию ниже.
*'''tl_node_move_up''' - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
*tl_cur_perv
Переносит курсор на одну позицию выше.
*tl_node_close_open
Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
*tl_node_lev_inc
Добавить уровень узла под курсором. Делает узел дочерним.
*tl_node_lev_dec
Уменьшает уровень узла под курсором. Делает узел родительским.
*tl_node_move_up
Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
<asm>  push dword tree1
<asm>  push dword tree1
   call dword[tl_node_move_up] ;переместить узел</asm>
   call dword[tl_node_move_up] ;переместить узел</asm>
где: tree1 - структура tree_list
где: tree1 - структура tree_list
*tl_node_move_down
*'''tl_node_move_down'''
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
<asm>  push dword tree1
<asm>  push dword tree1
   call dword[tl_node_move_down] ;переместить узел</asm>
   call dword[tl_node_move_down] ;переместить узел</asm>
где: tree1 - структура tree_list
где: tree1 - структура tree_list
*tl_node_poi_get_info
*'''tl_node_poi_get_info''' - берет внутренний указатель на структуру описывающую узел.
Берет внутренний указатель на структуру описывающую узел.
*'''tl_node_poi_get_next_info''' - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
*tl_node_poi_get_next_info
*'''tl_node_poi_get_data''' - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.
Берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
*tl_node_poi_get_data
Берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.


Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора. Т. е. можно организовать доступ к даным элемента в "фоновом режиме".
Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора. Т. е. можно организовать доступ к даным элемента в "фоновом режиме".
*tl_save_mem
*'''tl_save_mem''' - Сохраняет информацию об узлах элемента в память. Пример использования функции:
Сохраняет информацию об узлах элемента в память. Пример использования функции:
<asm>  MEM_SIZE equ 5000
<asm>  MEM_SIZE equ 5000
   node_data rb MEM_SIZE
   node_data rb MEM_SIZE
Line 71: Line 48:
   pop eax</asm>
   pop eax</asm>
где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
*tl_load_mem
*'''tl_load_mem''' - Загружает информацию об узлах элемента из памяти. Пример использования функции:
Загружает информацию об узлах элемента из памяти. Пример использования функции:
<asm>  MEM_SIZE equ 5000
<asm>  MEM_SIZE equ 5000
   node_data rb MEM_SIZE
   node_data rb MEM_SIZE
Line 83: Line 59:
   pop eax</asm>
   pop eax</asm>
где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.
где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.
*tl_get_mem_size
*'''tl_get_mem_size''' - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
*'''version_tree_list''' - версия элемента
*version_tree_list
Версия элемента
==Структура tree_list==
==Структура tree_list==
<asm>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
<asm>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
Line 120: Line 94:
   .on_press    dd on_press
   .on_press    dd on_press
}</asm>
}</asm>
*info_size - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
*''info_size'' - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
*info_max_count - максимальное количество узлов, которые можно добавить в элемент.
*''info_max_count'' - максимальное количество узлов, которые можно добавить в элемент.
*style - стили элемента.
*''style'' - стили элемента.
*data_nodes - указатель на внутренние структуры узлов (TreeList).
*''data_nodes'' - указатель на внутренние структуры узлов (TreeList).
*data_img - указатель на изображения с иконками узлов.
*''data_img'' - указатель на изображения с иконками узлов.
*data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
*''data_img_sys'' - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
*capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
*''capt_cy'' - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
*info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
*''info_capt_len'' - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
*p_scrol - указатель на структуру скроллинга, связанного с данным элементом.
*''p_scrol'' - указатель на структуру скроллинга, связанного с данным элементом.
*on_press - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.
*''on_press'' - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.


Пример создания структуры:
Пример создания структуры:
Line 143: Line 117:
*tl_list_box_mode
*tl_list_box_mode
Стиль не отображает уровни (как в ListBox все узлы одного уровня).
Стиль не отображает уровни (как в ListBox все узлы одного уровня).
==Пример==
Пример использования элемента ''tree_list''. Для компиляции в ''include'' нужно указать полный путь к папке ''svn''. Программа использует 2 файла с иконками ''tl_sys_16.bmp'' и ''tl_nod_16.bmp'' из папки ''svn\programs\develop\libraries\box_lib\trunk''.
<asm>use32
org 0x0
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
dd 0x1
dd start
dd i_end ; размер приложения
dd mem
dd stacktop
dd file_name
dd cur_dir_path
include 'svn/programs/macros.inc'
include 'svn/programs/proc32.inc'
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'mem.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0
struct FileInfoBlock
Function dd ?
Position dd ?
Flags dd ?
Count dd ?
Buffer dd ?
db ?
FileName dd ?
ends
fn_icon1 db 'tl_sys_16.bmp',0
fn_icon2 db 'tl_nod_16.bmp',0
bmp_icon dd 0
run_file_70 FileInfoBlock
align 4
start:
sys_load_library  library_name, cur_dir_path, library_path, system_path, \
err_message_found_lib, head_f_l, boxlib_import, err_message_import, head_f_i
;  cmp  eax,-1
;  jz    button.exit
mcall 48,3,sc,sizeof.system_colors
mcall 40,0x27 ;маска ожидаемых событий
mcall 68,11
stdcall dword[tl_data_init], dword tree1
; читаем *.bmp файл с системными иконками
copy_path fn_icon1,cur_dir_path,file_name,0
mov ecx,3*256*13
stdcall mem.Alloc,ecx
mov [bmp_icon],eax
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
mov [run_file_70.Function], 0
mov [run_file_70.Position], 54
mov [run_file_70.Flags], 0
mov [run_file_70.Count], ecx
mov byte[run_file_70+20], 0
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
int 0x40
cmp ebx,0
jl @f
m2m dword[tree1.data_img_sys],dword[bmp_icon]
@@:
; читаем *.bmp файл с иконками узлов
copy_path fn_icon2,cur_dir_path,file_name,0
mov ecx,3*256*13
stdcall mem.Alloc,ecx
mov [bmp_icon],eax
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
;mov [run_file_70.Function], 0
;mov [run_file_70.Position], 54
;mov [run_file_70.Flags], 0
mov [run_file_70.Count], ecx
mov byte[run_file_70+20], 0
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
int 0x40
cmp ebx,0
jl @f
m2m dword[tree1.data_img],dword[bmp_icon]
@@:
;перерисовка окна
align 4
red_win:
  mcall 12,1
  xor eax,eax
  mov ebx,30*65536+320
  mov ecx,25*65536+255
  mov edx,[sc.work]
  or  edx,0x33000000
  mov edi,hed
  mcall
  mov eax,8 ;кнопка
  mov ebx,215*65536+85
  mov ecx,5*65536+15
  mov edx,2
  mov esi,[sc.work_button]
  int 0x40
  mov ebx,215*65536+60
  mov ecx,25*65536+15
  mov edx,3
;  mov esi,0xffd000
  int 0x40
  mov ebx,215*65536+85
  mov ecx,45*65536+15
  mov edx,4
  int 0x40
  mov ecx,65*65536+15
  mov edx,5
  int 0x40
  mov ecx,85*65536+15
  mov edx,6
  int 0x40
  mov ecx,105*65536+15
  mov edx,7
  int 0x40
  mov ecx,125*65536+15
  mov edx,8
  int 0x40
  mov ecx,145*65536+15
  mov edx,9
  int 0x40
  mov ecx,165*65536+15
  mov edx,10
  int 0x40
  mov ecx,185*65536+15
  mov edx,11
  int 0x40
  mov ecx,205*65536+15
  mov edx,12
  int 0x40
  mov ebx,280*65536+20
  mov ecx,25*65536+15
  mov edx,100
  mov esi,0xd0d0
  int 0x40
  mov eax,4 ;рисование текста
  mov ebx,10*65536+25
  mov ecx,[sc.work_button_text]
  or  ecx,0x80000000
  mov edx,dword[node_data]
  int 0x40
  mov eax,4 ;рисование текста
  mov ebx,220*65536+10
  mov edx,txt10
  int 0x40
  mov ebx,220*65536+30
  mov edx,txt11
  int 0x40
  mov ebx,220*65536+50
  mov edx,txt12
  int 0x40
  mov ebx,220*65536+70
  mov edx,txt13
  int 0x40
  mov ebx,220*65536+90
  mov edx,txt14
  int 0x40
  mov ebx,220*65536+110
  mov edx,txt15
  int 0x40
  mov ebx,220*65536+130
  mov edx,txt16
  int 0x40
  mov ebx,220*65536+150
  mov edx,txt17
  int 0x40
  mov ebx,220*65536+170
  mov edx,txt18
  int 0x40
  mov ebx,220*65536+190
  mov edx,txt19
  int 0x40
  mov ebx,220*65536+210
  mov edx,txt20
  int 0x40
  stdcall dword[tl_draw], dword tree1
  stdcall [edit_box_draw], dword edit1
  mov dword[wScr.all_redraw],1
  stdcall [scrollbar_ver_draw], dword wScr
  mcall 12,2
align 4
still:
mcall 10
cmp al,0x1 ;изм. положение окна
jz red_win
cmp al,0x2
jz key
cmp al,0x3
jz button
cmp al,0x6
jz mouse
jmp still
align 4
key:
mcall 2
stdcall [tl_key], dword tree1
stdcall [edit_box_key], dword edit1
jmp still
align 4
button:
  mcall 17 ;получить код нажатой кнопки
  cmp ah,2
  jz  but_clear
  cmp ah,3
  jz  but_add_node
  cmp ah,4
  jz  but_undo
  cmp ah,5
  jz  but_redo
  cmp ah,6
  jz  but_lev_add
  cmp ah,7
  jz  but_lev_dec
  cmp ah,8
  jz  but_node_set_data
  cmp ah,9
  jz  but_node_get_data
  cmp ah,10
  jz  but_node_delete
  cmp ah,11
  jz  but_node_move_up
  cmp ah,12
  jz  but_node_move_down
  cmp ah,100
  jz  but_add_node_2
  cmp ah,1
  jne still
.exit:
;  stdcall mem.Free,[bmp_icon]
  stdcall dword[tl_data_clear], dword tree1
  mcall -1 ;выход из программы
align 4
mouse:
  stdcall [tl_mouse], dword tree1
  stdcall [edit_box_mouse], dword edit1
  jmp still
but_clear:
  stdcall dword[tl_info_clear], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
;добавляем узел (иконка которого будет с индексом 0)
but_add_node:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0, dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
;добавляем узел (иконка которого будет с индексом 1)
but_add_node_2:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0x10000, dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
but_undo:
  stdcall dword[tl_info_undo], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
but_redo:
  stdcall dword[tl_info_redo], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
but_lev_add:
  stdcall dword[tl_node_lev_inc], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
but_lev_dec:
  stdcall dword[tl_node_lev_dec], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
;устанавливаем (новые) данные узла
but_node_set_data:
  stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
;берем указатель на данные узла
but_node_get_data:
  stdcall dword[tl_node_get_data], dword tree1
  pop dword[node_data]
  jmp red_win ;still
;удаляем узел
but_node_delete:
  stdcall dword[tl_node_delete], dword tree1
  stdcall dword[tl_draw], dword tree1
  jmp still
;функция вызываемая при нажатии [Enter]
align 4
fun_on_enter:
  stdcall dword[tl_node_set_data], dword txt_on_enter, dword tree1
  stdcall dword[tl_draw], dword tree1
  ret
but_node_move_up:
  stdcall dword[tl_node_move_up], dword tree1
  jmp still
but_node_move_down:
  stdcall dword[tl_node_move_down], dword tree1
  jmp still
;подписи на кнопки
txt10 db 'List Clear',0
txt11 db 'Node add',0
txt12 db 'List Undo',0
txt13 db 'List Redo',0
txt14 db 'Node lev >>',0
txt15 db 'Node lev <<',0
txt16 db 'Node set data',0
txt17 db 'Node get data',0
txt18 db 'Node delete',0
txt19 db 'Node move ',24,0 ;24 up
txt20 db 'Node move ',25,0 ;25 down
;таблица импортируемых функций
align 4
boxlib_import:
  dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
  edit_box_draw  dd sz_Edit_box_draw
  edit_box_key dd sz_Edit_box_key
  edit_box_mouse dd sz_Edit_box_mouse
  version_ed dd sz_Version_ed
  scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
  scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
  scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
  scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
  version_scrollbar  dd sz_Version_scrollbar
  tl_data_init dd sz_tl_data_init
  tl_data_clear dd sz_tl_data_clear
  tl_info_clear dd sz_tl_info_clear
  tl_key dd sz_tl_key
  tl_mouse dd sz_tl_mouse
  tl_draw dd sz_tl_draw
  tl_info_undo dd sz_tl_info_undo
  tl_info_redo dd sz_tl_info_redo
  tl_node_add dd sz_tl_node_add
  tl_node_set_data dd sz_tl_node_set_data
  tl_node_get_data dd sz_tl_node_get_data
  tl_node_delete dd sz_tl_node_delete
  tl_cur_beg dd sz_tl_cur_beg
  tl_cur_next dd sz_tl_cur_next
  tl_cur_perv dd sz_tl_cur_perv
  tl_node_close_open dd sz_tl_node_close_open
  tl_node_lev_inc dd sz_tl_node_lev_inc
  tl_node_lev_dec dd sz_tl_node_lev_dec
  tl_node_move_up dd sz_tl_node_move_up
  tl_node_move_down dd sz_tl_node_move_down
dd 0,0
  sz_lib_init db 'lib_init',0
  sz_Edit_box_draw  db 'edit_box',0
  sz_Edit_box_key  db 'edit_box_key',0
  sz_Edit_box_mouse db 'edit_box_mouse',0
  sz_Version_ed   db 'version_ed',0
  sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
  sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
  sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
  sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
  sz_Version_scrollbar  db 'version_scrollbar',0
  sz_tl_data_init db 'tl_data_init',0
  sz_tl_data_clear db 'tl_data_clear',0
  sz_tl_info_clear db 'tl_info_clear',0
  sz_tl_key db 'tl_key',0
  sz_tl_mouse db 'tl_mouse',0
  sz_tl_draw db 'tl_draw',0
  sz_tl_info_undo db 'tl_info_undo',0
  sz_tl_info_redo db 'tl_info_redo',0
  sz_tl_node_add db 'tl_node_add',0
  sz_tl_node_set_data db 'tl_node_set_data',0
  sz_tl_node_get_data db 'tl_node_get_data',0
  sz_tl_node_delete db 'tl_node_delete',0
  sz_tl_cur_beg db 'tl_cur_beg',0
  sz_tl_cur_next db 'tl_cur_next',0
  sz_tl_cur_perv db 'tl_cur_perv',0
  sz_tl_node_close_open db 'tl_node_close_open',0
  sz_tl_node_lev_inc db 'tl_node_lev_inc',0
  sz_tl_node_lev_dec db 'tl_node_lev_dec',0
  sz_tl_node_move_up db 'tl_node_move_up',0
  sz_tl_node_move_down db 'tl_node_move_down',0
;структура элемента tree_list
tree1 tree_list 24,500, tl_draw_par_line, 16,16, 0x8080ff,0x0000ff,0xffffff,\
    10,35,200-16,185, 14,4,0, el_focus, wScr,fun_on_enter
;структура для дочернего скроллинга
align 4
wScr:
.x:
.size_x    dw 16 ;+0
.start_x    dw 210-16 ;+2
.y:
.size_y    dw 185 ;+4
.start_y    dw 35 ;+6
.btn_high  dd 15 ;+8
.type     dd 1  ;+12
.max_area  dd 100  ;+16
.cur_area  dd 30  ;+20
.position  dd 0  ;+24
.bckg_col  dd 0xeeeeee ;+28
.frnt_col  dd 0xbbddff ;+32
.line_col  dd 0  ;+36
.redraw    dd 0  ;+40
.delta     dw 0  ;+44
.delta2    dw 0  ;+46
.run_x:
.r_size_x  dw 0  ;+48
.r_start_x  dw 0  ;+50
.run_y:
.r_size_y  dw 0 ;+52
.r_start_y  dw 0 ;+54
.m_pos     dd 0 ;+56
.m_pos_2    dd 0 ;+60
.m_keys    dd 0 ;+64
.run_size  dd 0 ;+68
.position2  dd 0 ;+72
.work_size  dd 0 ;+76
.all_redraw dd 0 ;+80
.ar_offset  dd 1 ;+84
;структура элемента editbox
edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13
ed_buffer: db 'dataNode Text',0
  rb 69
txt_on_enter db '1111Enter',0
hed db 'Tree (Image) List 13.06.10',0
sc system_colors
;-------------------------------------------------------------------------------
err_message_import db 'Ошибка при импорте box_lib.obj',0
  err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
  head_f_i:
  head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
  system_path db '/sys/lib/'
  library_name db 'box_lib.obj',0
node_data dd 0
el_focus dd tree1
mouse_dd dd ?
i_end: ;конец кода
  rb 1024
  cur_dir_path rb 4096
  library_path rb 4096
  file_name rb 4096
stacktop:
mem:</asm>

Revision as of 21:12, 13 June 2010

Функции

  • tl_data_init - Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
  • tl_data_clear - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
  • tl_info_clear - Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
  • tl_key - Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
  • tl_mouse - функция для событий от мыши.
  • tl_draw - полная перерисовка окна элемента.
  • tl_info_undo - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
  • tl_info_redo - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
  • tl_node_add - Добавляет узел, в позицию указанную курсором. Пример добавления узла:

<asm> push dword tree1

 push dword 0x10002
 push dword data_buffer
 call dword[tl_node_add]</asm>

где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.

  • tl_node_set_data - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
  • tl_node_get_data - берет указатель на данные (пользовательские и подпись) из узла под курсором.
  • tl_node_delete - удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
  • tl_cur_beg - ставит курсор в начало списка, перематывает скроллинг если нужно.
  • tl_cur_next - переносит курсор на одну позицию ниже.
  • tl_cur_perv - переносит курсор на одну позицию выше.
  • tl_node_close_open - Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
  • tl_node_lev_inc - Добавить уровень узла под курсором. Делает узел дочерним.
  • tl_node_lev_dec - Уменьшает уровень узла под курсором. Делает узел родительским.
  • tl_node_move_up - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:

<asm> push dword tree1

 call dword[tl_node_move_up] ;переместить узел</asm>

где: tree1 - структура tree_list

  • tl_node_move_down

Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции: <asm> push dword tree1

 call dword[tl_node_move_down] ;переместить узел</asm>

где: tree1 - структура tree_list

  • tl_node_poi_get_info - берет внутренний указатель на структуру описывающую узел.
  • tl_node_poi_get_next_info - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
  • tl_node_poi_get_data - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.

Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора. Т. е. можно организовать доступ к даным элемента в "фоновом режиме".

  • tl_save_mem - Сохраняет информацию об узлах элемента в память. Пример использования функции:

<asm> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 push dword tree1
 push dword 0
 push dword node_data
 push dword MEM_SIZE
 call dword[tl_save_mem]
 pop eax</asm>

где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.

  • tl_load_mem - Загружает информацию об узлах элемента из памяти. Пример использования функции:

<asm> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 push dword tree1
 push dword 0
 push dword node_data
 push dword MEM_SIZE
 call dword[tl_load_mem]
 pop eax</asm>

где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.

  • tl_get_mem_size - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
  • version_tree_list - версия элемента

Структура tree_list

<asm>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\

   col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
   info_capt_len,el_focus, p_scrol,on_press {
 .data_info  dd 0
 .info_size  dw info_size
 .info_max_count dd info_max_count
 .style      dd style
 .data_nodes dd 0
 .data_img   dd 0
 .img_cx     dw img_cx
 .img_cy     dw img_cy
 .data_img_sys dd 0
 .ch_tim     dd 0
 .ls_tim     dd 0
 .tim_undo   dd 0
 .cur_pos    dd 0
 .col_bkg    dd col_bkg
 .col_zag    dd col_zag
 .col_txt    dd col_txt
 .box_left   dd box_l
 .box_top    dd box_t
 .box_width  dd box_w
 .box_height dd box_h
 .capt_cy    dw capt_cy
 .info_capt_offs dw info_capt_offs
 .info_capt_len  dw info_capt_len
 .el_focus    dd el_focus
 .p_scrol     dd p_scrol
 rb 4
 .on_activate dd 0
 .on_press    dd on_press

}</asm>

  • info_size - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
  • info_max_count - максимальное количество узлов, которые можно добавить в элемент.
  • style - стили элемента.
  • data_nodes - указатель на внутренние структуры узлов (TreeList).
  • data_img - указатель на изображения с иконками узлов.
  • data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
  • capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
  • info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
  • p_scrol - указатель на структуру скроллинга, связанного с данным элементом.
  • on_press - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.

Пример создания структуры: <asm>tree1 tree_list 24,500, tl_draw_par_line+tl_list_box_mode, 16,16,\

   0x8080ff,0x0000ff,0xffffff, 10,35,200-16,285, 14,4,0,\
   el_focus, wScr,fun_on_enter</asm>

Стили элемента

  • tl_key_no_edit

Элемент нельзя редактировать на клавиатуре (изменять уровни, удалять). Ставьте этот стиль если нужно создать элемент только для просмотра данных.

  • tl_draw_par_line

Рисовать линии к родительскому узлу.

  • tl_list_box_mode

Стиль не отображает уровни (как в ListBox все узлы одного уровня).

Пример

Пример использования элемента tree_list. Для компиляции в include нужно указать полный путь к папке svn. Программа использует 2 файла с иконками tl_sys_16.bmp и tl_nod_16.bmp из папки svn\programs\develop\libraries\box_lib\trunk. <asm>use32 org 0x0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 0x1 dd start dd i_end ; размер приложения dd mem dd stacktop dd file_name dd cur_dir_path

include 'svn/programs/macros.inc' include 'svn/programs/proc32.inc' include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac' include 'svn/programs/develop/libraries/box_lib/load_lib.mac' include 'mem.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc

@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0

struct FileInfoBlock Function dd ? Position dd ? Flags dd ? Count dd ? Buffer dd ? db ? FileName dd ? ends

fn_icon1 db 'tl_sys_16.bmp',0 fn_icon2 db 'tl_nod_16.bmp',0 bmp_icon dd 0 run_file_70 FileInfoBlock

align 4 start:

sys_load_library library_name, cur_dir_path, library_path, system_path, \ err_message_found_lib, head_f_l, boxlib_import, err_message_import, head_f_i

cmp eax,-1
jz button.exit

mcall 48,3,sc,sizeof.system_colors mcall 40,0x27 ;маска ожидаемых событий mcall 68,11

stdcall dword[tl_data_init], dword tree1

читаем *.bmp файл с системными иконками

copy_path fn_icon1,cur_dir_path,file_name,0

mov ecx,3*256*13 stdcall mem.Alloc,ecx mov [bmp_icon],eax

mov [run_file_70.Buffer], eax mov eax,70 ;load icon file mov [run_file_70.Function], 0 mov [run_file_70.Position], 54 mov [run_file_70.Flags], 0 mov [run_file_70.Count], ecx mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name mov ebx,run_file_70 int 0x40 cmp ebx,0 jl @f m2m dword[tree1.data_img_sys],dword[bmp_icon] @@:

читаем *.bmp файл с иконками узлов

copy_path fn_icon2,cur_dir_path,file_name,0

mov ecx,3*256*13 stdcall mem.Alloc,ecx mov [bmp_icon],eax

mov [run_file_70.Buffer], eax mov eax,70 ;load icon file ;mov [run_file_70.Function], 0 ;mov [run_file_70.Position], 54 ;mov [run_file_70.Flags], 0 mov [run_file_70.Count], ecx mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name mov ebx,run_file_70 int 0x40 cmp ebx,0 jl @f m2m dword[tree1.data_img],dword[bmp_icon] @@:

перерисовка окна

align 4 red_win:

 mcall 12,1
 xor eax,eax
 mov ebx,30*65536+320
 mov ecx,25*65536+255
 mov edx,[sc.work]
 or  edx,0x33000000
 mov edi,hed
 mcall
 mov eax,8 ;кнопка
 mov ebx,215*65536+85
 mov ecx,5*65536+15
 mov edx,2
 mov esi,[sc.work_button]
 int 0x40
 mov ebx,215*65536+60
 mov ecx,25*65536+15
 mov edx,3
mov esi,0xffd000
 int 0x40
 mov ebx,215*65536+85
 mov ecx,45*65536+15
 mov edx,4
 int 0x40
 mov ecx,65*65536+15
 mov edx,5
 int 0x40
 mov ecx,85*65536+15
 mov edx,6
 int 0x40
 mov ecx,105*65536+15
 mov edx,7
 int 0x40
 mov ecx,125*65536+15
 mov edx,8
 int 0x40
 mov ecx,145*65536+15
 mov edx,9
 int 0x40
 mov ecx,165*65536+15
 mov edx,10
 int 0x40
 mov ecx,185*65536+15
 mov edx,11
 int 0x40
 mov ecx,205*65536+15
 mov edx,12
 int 0x40
 mov ebx,280*65536+20
 mov ecx,25*65536+15
 mov edx,100
 mov esi,0xd0d0
 int 0x40
 mov eax,4 ;рисование текста
 mov ebx,10*65536+25
 mov ecx,[sc.work_button_text]
 or  ecx,0x80000000
 mov edx,dword[node_data]
 int 0x40
 mov eax,4 ;рисование текста
 mov ebx,220*65536+10
 mov edx,txt10
 int 0x40
 mov ebx,220*65536+30
 mov edx,txt11
 int 0x40
 mov ebx,220*65536+50
 mov edx,txt12
 int 0x40
 mov ebx,220*65536+70
 mov edx,txt13
 int 0x40
 mov ebx,220*65536+90
 mov edx,txt14
 int 0x40
 mov ebx,220*65536+110
 mov edx,txt15
 int 0x40
 mov ebx,220*65536+130
 mov edx,txt16
 int 0x40
 mov ebx,220*65536+150
 mov edx,txt17
 int 0x40
 mov ebx,220*65536+170
 mov edx,txt18
 int 0x40
 mov ebx,220*65536+190
 mov edx,txt19
 int 0x40
 mov ebx,220*65536+210
 mov edx,txt20
 int 0x40
 stdcall dword[tl_draw], dword tree1
 stdcall [edit_box_draw], dword edit1
 mov dword[wScr.all_redraw],1
 stdcall [scrollbar_ver_draw], dword wScr
 mcall 12,2

align 4 still: mcall 10

cmp al,0x1 ;изм. положение окна jz red_win cmp al,0x2 jz key cmp al,0x3 jz button cmp al,0x6 jz mouse jmp still

align 4 key: mcall 2 stdcall [tl_key], dword tree1 stdcall [edit_box_key], dword edit1 jmp still

align 4 button:

 mcall 17 ;получить код нажатой кнопки
 cmp ah,2
 jz  but_clear
 cmp ah,3
 jz  but_add_node
 cmp ah,4
 jz  but_undo
 cmp ah,5
 jz  but_redo
 cmp ah,6
 jz  but_lev_add
 cmp ah,7
 jz  but_lev_dec
 cmp ah,8
 jz  but_node_set_data
 cmp ah,9
 jz  but_node_get_data
 cmp ah,10
 jz  but_node_delete
 cmp ah,11
 jz  but_node_move_up
 cmp ah,12
 jz  but_node_move_down
 cmp ah,100
 jz  but_add_node_2
 cmp ah,1
 jne still

.exit:

stdcall mem.Free,[bmp_icon]
 stdcall dword[tl_data_clear], dword tree1
 mcall -1 ;выход из программы


align 4 mouse:

 stdcall [tl_mouse], dword tree1
 stdcall [edit_box_mouse], dword edit1
 jmp still

but_clear:

 stdcall dword[tl_info_clear], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
добавляем узел (иконка которого будет с индексом 0)

but_add_node:

 stdcall dword[tl_node_add], dword ed_buffer, dword 0, dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
добавляем узел (иконка которого будет с индексом 1)

but_add_node_2:

 stdcall dword[tl_node_add], dword ed_buffer, dword 0x10000, dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still

but_undo:

 stdcall dword[tl_info_undo], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still

but_redo:

 stdcall dword[tl_info_redo], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still

but_lev_add:

 stdcall dword[tl_node_lev_inc], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still

but_lev_dec:

 stdcall dword[tl_node_lev_dec], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
устанавливаем (новые) данные узла

but_node_set_data:

 stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
берем указатель на данные узла

but_node_get_data:

 stdcall dword[tl_node_get_data], dword tree1
 pop dword[node_data]
 jmp red_win ;still
удаляем узел

but_node_delete:

 stdcall dword[tl_node_delete], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
функция вызываемая при нажатии [Enter]

align 4 fun_on_enter:

 stdcall dword[tl_node_set_data], dword txt_on_enter, dword tree1
 stdcall dword[tl_draw], dword tree1
 ret

but_node_move_up:

 stdcall dword[tl_node_move_up], dword tree1
 jmp still

but_node_move_down:

 stdcall dword[tl_node_move_down], dword tree1
 jmp still
подписи на кнопки

txt10 db 'List Clear',0 txt11 db 'Node add',0 txt12 db 'List Undo',0 txt13 db 'List Redo',0 txt14 db 'Node lev >>',0 txt15 db 'Node lev <<',0 txt16 db 'Node set data',0 txt17 db 'Node get data',0 txt18 db 'Node delete',0 txt19 db 'Node move ',24,0 ;24 up txt20 db 'Node move ',25,0 ;25 down

таблица импортируемых функций

align 4 boxlib_import:

 dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
 edit_box_draw  dd sz_Edit_box_draw
 edit_box_key	 dd sz_Edit_box_key
 edit_box_mouse dd sz_Edit_box_mouse
 version_ed	 dd sz_Version_ed
 scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
 scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
 scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
 scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
 version_scrollbar   dd sz_Version_scrollbar
 tl_data_init dd sz_tl_data_init
 tl_data_clear dd sz_tl_data_clear
 tl_info_clear dd sz_tl_info_clear
 tl_key dd sz_tl_key
 tl_mouse dd sz_tl_mouse
 tl_draw dd sz_tl_draw
 tl_info_undo dd sz_tl_info_undo
 tl_info_redo dd sz_tl_info_redo
 tl_node_add dd sz_tl_node_add
 tl_node_set_data dd sz_tl_node_set_data
 tl_node_get_data dd sz_tl_node_get_data
 tl_node_delete dd sz_tl_node_delete
 tl_cur_beg dd sz_tl_cur_beg
 tl_cur_next dd sz_tl_cur_next
 tl_cur_perv dd sz_tl_cur_perv
 tl_node_close_open dd sz_tl_node_close_open
 tl_node_lev_inc dd sz_tl_node_lev_inc
 tl_node_lev_dec dd sz_tl_node_lev_dec
 tl_node_move_up dd sz_tl_node_move_up
 tl_node_move_down dd sz_tl_node_move_down

dd 0,0

 sz_lib_init db 'lib_init',0
 sz_Edit_box_draw  db 'edit_box',0
 sz_Edit_box_key   db 'edit_box_key',0
 sz_Edit_box_mouse db 'edit_box_mouse',0
 sz_Version_ed	  db 'version_ed',0
 sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
 sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
 sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
 sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
 sz_Version_scrollbar   db 'version_scrollbar',0
 sz_tl_data_init db 'tl_data_init',0
 sz_tl_data_clear db 'tl_data_clear',0
 sz_tl_info_clear db 'tl_info_clear',0
 sz_tl_key db 'tl_key',0
 sz_tl_mouse db 'tl_mouse',0
 sz_tl_draw db 'tl_draw',0
 sz_tl_info_undo db 'tl_info_undo',0
 sz_tl_info_redo db 'tl_info_redo',0
 sz_tl_node_add db 'tl_node_add',0
 sz_tl_node_set_data db 'tl_node_set_data',0
 sz_tl_node_get_data db 'tl_node_get_data',0
 sz_tl_node_delete db 'tl_node_delete',0
 sz_tl_cur_beg db 'tl_cur_beg',0
 sz_tl_cur_next db 'tl_cur_next',0
 sz_tl_cur_perv db 'tl_cur_perv',0
 sz_tl_node_close_open db 'tl_node_close_open',0
 sz_tl_node_lev_inc db 'tl_node_lev_inc',0
 sz_tl_node_lev_dec db 'tl_node_lev_dec',0
 sz_tl_node_move_up db 'tl_node_move_up',0
 sz_tl_node_move_down db 'tl_node_move_down',0


структура элемента tree_list

tree1 tree_list 24,500, tl_draw_par_line, 16,16, 0x8080ff,0x0000ff,0xffffff,\

   10,35,200-16,185, 14,4,0, el_focus, wScr,fun_on_enter
структура для дочернего скроллинга

align 4 wScr: .x: .size_x dw 16 ;+0 .start_x dw 210-16 ;+2 .y: .size_y dw 185 ;+4 .start_y dw 35 ;+6 .btn_high dd 15 ;+8 .type dd 1  ;+12 .max_area dd 100  ;+16 .cur_area dd 30  ;+20 .position dd 0  ;+24 .bckg_col dd 0xeeeeee ;+28 .frnt_col dd 0xbbddff ;+32 .line_col dd 0  ;+36 .redraw dd 0  ;+40 .delta dw 0  ;+44 .delta2 dw 0  ;+46 .run_x: .r_size_x dw 0  ;+48 .r_start_x dw 0  ;+50 .run_y: .r_size_y dw 0 ;+52 .r_start_y dw 0 ;+54 .m_pos dd 0 ;+56 .m_pos_2 dd 0 ;+60 .m_keys dd 0 ;+64 .run_size dd 0 ;+68 .position2 dd 0 ;+72 .work_size dd 0 ;+76 .all_redraw dd 0 ;+80 .ar_offset dd 1 ;+84

структура элемента editbox

edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13 ed_buffer: db 'dataNode Text',0

 rb 69

txt_on_enter db '1111Enter',0 hed db 'Tree (Image) List 13.06.10',0 sc system_colors

-------------------------------------------------------------------------------

err_message_import db 'Ошибка при импорте box_lib.obj',0

 err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
 head_f_i: 
 head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
 system_path db '/sys/lib/'
 library_name db 'box_lib.obj',0

node_data dd 0 el_focus dd tree1 mouse_dd dd ?

i_end: ;конец кода

 rb 1024
 cur_dir_path rb 4096
 library_path rb 4096
 file_name rb 4096

stacktop: mem:</asm>