Элемент text_editor позволяет работать с текстовыми файлами, содержит много функций для редактирования текста.
Внешний вид программы, с элементом text_editor.
Раздел для программистов (и интересующихся людей), в котором расказаны некоторые идеи, на которых построена данная программа.
Для работы с текстом программа использует структуры:
struct symbol c db ? ; +0 символ col db ? ; +1 цвет perv dd ? ; +2 next dd ? ; +6 указатели tc dd ? ; +10 врем. создания td dd ? ; +14 врем. удаления ends
Каждая из таких структур сохраняет один символ в переменной 'c'. Переменные 'perv' и 'next' хранят индексы первого и следующего символов. Благодаря чему текст создается в виде цепочки символов (двунаправленный список).
'tc' - время создания символа, при отмене действия текстовый редактор "знает" какие символы отображать, а какие нет (хотя все символы "висят" в памяти).
'td' - время удаления символа, заполняется при удалении, при отмене действия удаления символов, текст может быть восстановлен.
'col' - используется для цветовой разметки, содержит индекс цвета в массиве цветов ted_text_colors.
Функция которая будет вызываться при нажатии на кнопку копирования в буфер или на Ctrl+C. Текст копируется в буфер ted_buffer, максимальный размер буфера указывается в ted_buffer_size.
Пример использования:
stdcall [ted_but_copy], tedit0
Функция вырезает выделенный текст и копирует его в буфер.
Пример использования:
stdcall [ted_but_cut], tedit0
Функция для поиска текста. Ищет текст из буфера ted_buffer_find, при нахождении перемещает курсор к найденому тексту и выделяет его.
Пример использования:
stdcall [ted_but_find_next], tedit0
Функция вставляет текст из буфера ted_buffer.
Пример использования:
stdcall [ted_but_paste], tedit0
Повторяет отмененные действия по редактированию текста.
Пример использования:
stdcall [ted_but_redo], tedit0
Меняет порядок следования символов в выделенном тексте.
Пример использования:
stdcall [ted_but_reverse], tedit0
Функция для сохранения файла. Принимает 3 параметра:
1) структура tedit,
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
3) строка с путем и именем файла.
Пример использования:
stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]
Функция для выделения ключевого слова под курсором. Если ключевые слова не используются, тогда будет выделен весь текст.
Пример использования:
stdcall [ted_but_select_word], tedit0
Переводит выделенные символы к нижнему регистру.
Пример использования:
stdcall [ted_but_sumb_lover], tedit0
Переводит выделенные символы к верхнему регистру.
Пример использования:
stdcall [ted_but_sumb_upper], tedit0
Отменяет действия по редактированию текста. Действия функции ted_but_reverse не отменяются.
Пример использования:
stdcall [ted_but_undo], tedit0
Функция которая проверяет были ли не сохраненные изменения в тексте. Результат возвращается в регистр al, если изменения были то возвращает 1 иначе 0.
Пример использования:
push eax stdcall [ted_can_save], tedit0 cmp al,1 ......... pop eax
Очистка текста в окне редактора. Принимает 2 параметра:
1) структура tedit,
2) параметр определяет будет ли очистка памяти полной.
Если 2-й параметр равен 1, то очистка будет полной, при 0 нет. Пользователю нужно вызывать функцию с параметром 1, параметр 0 для внутреннего использования.
Пример использования:
stdcall [ted_clear], tedit0,1
Деструктор элемента, освобождает память занятую элементом.
Пример использования:
stdcall [ted_delete], tedit0
Перерисовка всего окна редактора, включая дочерние скроллинги.
Пример использования:
stdcall [ted_draw], tedit0
Конструктор элемента, выделяет память необходимую для работы текстового редактора.
Пример использования:
stdcall [ted_init], tedit0
Устанавливает цвет скроллингов и настраивает их размеры в зависимости от размеров окна. Можно вызывать эту функцию при изменении размеров окна в пользовательской программе. Принимает 2 параметра:
1) структура tedit,
2) опции, указывают какие нужно изменить параметры:
Параметры можно комбинировать через логическое или.
Пример использования:
stdcall [ted_init_scroll_bars], tedit0,2
Функция для загрузки цветов интерфейса и ключевых слов из файла синтаксиса. Принимает 3 параметра:
1) структура tedit,
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
3) строка с путем и именем файла синтаксиса.
Пример использования:
stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name
Определяет есть в окне редактора выделенный текст. Если есть в регистр al записывается 1 иначе 0. Функция необходима для создания панелей инстрементов, в которых в зависимости от выделения будут доступны или заблокированы определенные кнопки (действия). Например кнопку для копирования в буфер можно заблокировать если нет выбранного текста.
Пример использования:
push eax edi mov edi,tedit0 call [ted_is_select] cmp al,0 ......... pop edi eax
Функция вызываемая для реакции на клавиатуру. В регистре eax должен быть код нажатой клавиши. Принимает 3 параметра:
1) структура tedit,
2) таблица для конвертации scan кодов в ascii,
3) управляющие символы.
Пример использования:
mcall 66,3 ;66.3 получить состояние управляющих клавиш xor esi,esi mov ecx,1 test al,0x03 ;[Shift] jz @f mov cl,2 or esi,KM_SHIFT @@: test al,0x0c ;[Ctrl] jz @f or esi,KM_CTRL @@: test al,0x30 ;[Alt] jz @f mov cl,3 or esi,KM_ALT @@: test al,0x80 ;[NumLock] jz @f or esi,KM_NUMLOCK @@: mcall 26,2,,conv_tabl ;26.2 получить раскладку клавиатуры mcall 2 ;получаем код нажатой клавиши stdcall [ted_key], tedit0, conv_tabl,esi
Функция на перемещение или нажатие мыши.
Пример использования:
stdcall [ted_mouse], tedit0
Функция для открытия файла. Принимает 3 параметра:
1) структура tedit,
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
3) строка с путем и именем файла.
Возвращает 2 параметра:
1) eax = код ошибки
2) ebx = колличество прочитанных байт
Пример использования:
push eax ebx stdcall [ted_open_file], tedit0,run_file_70,[edit1.text] ......... pop ebx eax
Функция для добавления текста. Принимает 4 параметра:
1) структура tedit,
2) указатель на буфер с текстом,
3) длина текста,
4) опции вставки.
Пример использования:
text_buffer db 500 dup(0) ......... mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor stdcall [ted_text_add], tedit0,text_buffer,30,ebx
ted_opt_ed_change_time - фиксировать изменения документа, что-бы их можно было отменить. Например если нужно сделать несколько изменений текста, которые будут отменяться за один раз, то 1-е изменение идет с этой константой а остальные нет.
ted_opt_ed_move_cursor - константа которая определяет сдвиг курсора после добавления текста.
Функция для разметки текста цветом. Обычно вызывается внутри самой библиотеки, при изменениях текста. В некоторых случаях может понадобиться вызвать принудительно из внешней программы.
Пример использования:
push edi mov edi,tedit0 call [ted_text_colored] pop edi
ted_get_text_perv_pos - переход на предыдущий символ в цепи (через указатель 'perv')
ted_get_text_next_pos - переход на следующий символ в цепи (через указатель 'next')
ted_symbol_not_vis - определяет видимый ли указанный символ на экране (в зависимости от значений 'tc' и 'td')
ted_iterat_next - переход на следующий видимый символ в цепи. Использует для работы функции ted_get_text_next_pos и ted_symbol_not_vis.
ted_iterat_perv - переход на предедущий видимый символ в цепи.
ted_iterat_next_pos_char - найти следующую позицию указанного символа (edx-поз. начала поиска, bl->код искомого символа)
ted_get_pos_by_coords - берет позицию символа по координатам (esi->коорд. x, знак; ecx->коорд. y, строка)
ted_go_to_pos - переставляет курсор в указанную позицию, если указанная позиция находится вне экрана, то также переставляются скролинги (ecx->коорд. x, знак; edx->коорд. y, строка)
Элемент | Размер (байт) |
---|---|
Количество цветов текста | 4 |
Количество подсвечиваемых слов | 4 |
Цвета интерфейса | 4*6 |
Цвета для текста | 4*(кол. цв. текста) |
Структуры со свойствами и описаниями слов | sizeof(TexColViv)*(кол. слов) |
Разделительный символ, означающий начало описаний слов (всегда равен 0) | 1 байт |
Описания слов (строки текста с 0-ми в конце) | (длинна справочного текста + 1) |
Макроса для создания структуры текстового редактора нет. Потому данные для него задаются вручную. Пример структуры для текстового редактора:
align 4 tedit0: ;структура текстового редактора .wnd BOX 195,5+20,325,260 ;+ 0 .rec BOX 30,13,7,10 ;+16 .drag_m db 0 ;+32 выделение от мыши .drag_k db 0 ;+33 выделение от клавиатуры .sel TexSelect 0,0,0,0 ;+34 структура выделения .seln TexSelect ;+50 дополнительная структура выделения .tex dd 0 ;+66 text memory pointer .tex_1 dd 0 ;+70 text first symbol pointer .tex_end dd 0 ;+74 text end memory pointer .cur_x dd 0 ;+78 координата x курсора .cur_y dd 0 ;+82 координата y курсора .max_chars dd 5002 ;+86 максимальное число символов в одном документе .count_colors_text dd 1 ;+90 колличество цветов текста .count_key_words dd 0 ;+94 колличество ключевых слов .color_cursor dd 0xff0000 ;+98 цвет курсора .color_wnd_capt dd 0x0080c0 ;+102 цвет полей вокруг окна .color_wnd_work dd 0x0 ;+106 цвет фона окна .color_wnd_bord dd 0xffffff ;+110 цвет текста на полях .color_select dd 0x0000ff ;+114 цвет выделения .color_cur_text dd 0xffff00 ;+118 цвет символа под курсором .color_wnd_text dd 0x80ffff ;+122 цвет текста в окне .syntax_file dd 0 ;+126 указатель на начало файла синтаксиса .syntax_file_size dd 500 ;+130 максимальный размер файла синтаксиса .text_colors dd 0 ;+134 указатель на массив цветов текста .help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1) .help_id dd -1 ;+142 идентификатор для справки .key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv .tim_ch dd ? ;+150 количество изменений в файле .tim_undo dd ? ;+154 количество отмененных действий .tim_ls dd ? ;+158 время последнего сохранения .tim_co dd ? ;+162 время последней цветовой разметки .el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе .err_save db 0 ;+170 ошибка сохранения файла .panel_id db 0 ;+171 номер открытой панели .key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры .symbol_new_line db 20 ;+173 символ завершения строки .scr_w dd scrol_w1 ;+174 вертикальный скроллинг .scr_h dd scrol_h1 ;+178 горизонтальный скроллинг .arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов .buffer dd buf ;+186 указатель на буфер копирования/вставки .buffer_find dd 0 ;+190 указатель на буфер для поиска .cur_ins db 1 ;+194 режим работы курсора (обычный или замена) .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) .mode_invis db 0 ;+196 режим показа непечатаемых символов .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor .fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска) .fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа) .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки .fun_find_err dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно .fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса .fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками .fun_draw_panel_find dd 0 ;+230 указатель на функцию рисования панели поиска .fun_draw_panel_syntax dd 0 ;+234 указатель на функцию рисования панели синтаксиса .fun_save_err dd 0 ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно .increase_size dd 225 ;+242 число символов на которые будет увечиваться память при нехватке .ptr_free_symb dd ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста) .font_s dd ? ;+250 стили для шрифта (от 0 до 7 множитель для размера, +16 для второго системного шрифта)
Документация обновлялась последний раз 21.02.16.