1457
IgorA
1
2
3
элемент Text Editor
4
5
6
7
8
9
На главную ↑
10
Оглавление
11
12
Введение
13
Функции
14
15
ted_but_copy
1458
IgorA
16
ted_but_cut
17
ted_but_find_next
18
ted_but_paste
19
ted_but_redo
20
ted_but_reverse
21
ted_but_save_file
22
ted_but_select_word
23
ted_but_sumb_lover
24
ted_but_sumb_upper
25
ted_but_undo
26
ted_can_save
27
ted_clear
28
ted_delete
29
ted_draw
30
ted_init
31
ted_init_scroll_bars
32
ted_init_syntax_file
33
ted_is_select
34
ted_key
35
ted_mouse
36
ted_open_file
37
ted_text_add
38
ted_text_colored
1457
IgorA
39
1458
IgorA
40
Формат файла подсветки *.syn
1464
IgorA
41
Структура tedit
1457
IgorA
42
43
1476
IgorA
44
Элемент text_editor позволяет работать с текстовыми файлами, содержит много функций для редактирования текста.
1457
IgorA
45
46
Внешний вид программы, с элементом text_editor.
47
1476
IgorA
48
Возможности элемента
1457
IgorA
49
50
Открытие (Ctrl+O)/Сохранение файла.
51
Редактирование: Повтор/Отмена действия (Ctrl+Z), Вырезать/Копировать (Ctrl+C)/Вставить (Ctrl+V), Поиск (Ctrl+F, F3).
52
Выделение цветом слов, заданных в файле синтаксиса. Вывод справки по ним, если она есть (нажатием F1 когда курсор на слове).
53
54
1476
IgorA
55
О работе элемента
1457
IgorA
56
Раздел для программистов (и интересующихся людей), в котором расказаны
57
некоторые идеи, на которых построена данная программа.
58
59
Для работы с текстом программа использует структуры:
60
struct symbol
61
c db ? ; +0 символ
62
col db ? ; +1 цвет
63
perv dd ? ; +2
64
next dd ? ; +6 указатели
65
tc dd ? ; +10 врем. создания
66
td dd ? ; +14 врем. удаления
67
ends
68
Каждая из таких структур сохраняет один символ в переменной 'c'. Переменные
69
'perv' и 'next' хранят индексы первого и следующего символов. Благодаря чему
70
текст создается в виде цепочки символов (двунаправленный список).
71
'tc' - время создания символа, при отмене действия текстовый редактор "знает"
72
какие символы отображать, а какие нет (хотя все символы "висят" в памяти).
73
'td' - время удаления символа, заполняется при удалении, при отмене действия
74
удаления символов, текст может быть восстановлен.
1476
IgorA
75
'col' - используется для цветовой разметки, содержит индекс цвета в массиве цветов ted_text_colors.
1457
IgorA
76
77
1476
IgorA
78
Функции на экспорт:
1457
IgorA
79
80
1458
IgorA
81
Функция которая будет вызываться при нажатии на кнопку копирования в буфер или на Ctrl+C . Текст копируется в буфер ted_buffer , максимальный размер буфера указывается в ted_buffer_size .
1457
IgorA
82
Пример использования:
83
stdcall [ted_but_copy], tedit0
84
1458
IgorA
85
86
Функция вырезает выделенный текст и копирует его в буфер.
87
Пример использования:
88
stdcall [ted_but_cut], tedit0
1457
IgorA
89
1458
IgorA
90
91
Функция для поиска текста. Ищет текст из буфера ted_buffer_find , при нахождении перемещает курсор к найденому тексту и выделяет его.
92
Пример использования:
93
stdcall [ted_but_find_next], tedit0
94
95
96
Функция вставляет текст из буфера ted_buffer .
97
Пример использования:
98
stdcall [ted_but_paste], tedit0
99
100
101
Повторяет отмененные действия по редактированию текста.
102
Пример использования:
103
stdcall [ted_but_redo], tedit0
104
105
106
Меняет порядок следования символов в выделенном тексте.
107
Пример использования:
108
stdcall [ted_but_reverse], tedit0
109
110
111
Функция для сохранения файла. Принимает 3 параметра:
112
1) структура tedit,
113
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
114
3) строка с путем и именем файла.
115
Пример использования:
116
stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]
117
118
119
Функция для выделения ключевого слова под курсором. Если ключевые слова не используются, тогда будет выделен весь текст.
120
Пример использования:
121
stdcall [ted_but_select_word], tedit0
122
123
124
Переводит выделенные символы к нижнему регистру.
125
Пример использования:
126
stdcall [ted_but_sumb_lover], tedit0
127
128
129
Переводит выделенные символы к верхнему регистру.
130
Пример использования:
131
stdcall [ted_but_sumb_upper], tedit0
132
133
134
Отменяет действия по редактированию текста. Действия функции ted_but_reverse не отменяются.
135
Пример использования:
136
stdcall [ted_but_undo], tedit0
137
138
139
Функция которая проверяет были ли не сохраненные изменения в тексте. Результат возвращается в регистр al , если изменения были то возвращает 1 иначе 0.
140
Пример использования:
141
push eax
142
stdcall [ted_can_save], tedit0
143
cmp al,1
144
.........
145
pop eax
146
147
148
Очистка текста в окне редактора. Принимает 2 параметра:
149
1) структура tedit,
150
2) параметр определяет будет ли очистка памяти полной.
151
Если 2-й параметр равен 1, то очистка будет полной, при 0 нет. Пользователю нужно вызывать функцию с параметром 1, параметр 0 для внутреннего использования.
152
Пример использования:
153
stdcall [ted_clear], tedit0,1
154
155
156
Деструктор элемента, освобождает память занятую элементом.
157
Пример использования:
158
stdcall [ted_delete], tedit0
159
160
161
Перерисовка всего окна редактора, включая дочерние скроллинги.
162
Пример использования:
163
stdcall [ted_draw], tedit0
164
165
166
Конструктор элемента, выделяет память необходимую для работы текстового редактора.
167
Пример использования:
168
stdcall [ted_init], tedit0
169
170
171
Устанавливает цвет скроллингов и настраивает их размеры в зависимости от размеров окна. Можно вызывать эту функцию при изменении размеров окна в пользовательской программе. Принимает 2 параметра:
172
1) структура tedit,
1459
IgorA
173
2) опции, указывают какие нужно изменить параметры:
174
175
1 - изменить цвета скроллингов
176
2 - изменился размер окна
177
4 - изменился размер документа
178
179
Параметры можно комбинировать через логическое или .
1458
IgorA
180
Пример использования:
181
stdcall [ted_init_scroll_bars], tedit0,2
182
183
184
Функция для загрузки цветов интерфейса и ключевых слов из файла синтаксиса. Принимает 3 параметра:
185
1) структура tedit,
186
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
187
3) строка с путем и именем файла синтаксиса.
188
Пример использования:
189
stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name
190
191
192
Определяет есть в окне редактора выделенный текст. Если есть в регистр al записывается 1 иначе 0. Функция необходима для создания панелей инстрементов, в которых в зависимости от выделения будут доступны или заблокированы определенные кнопки (действия). Например кнопку для копирования в буфер можно заблокировать если нет выбранного текста.
193
Пример использования:
194
push eax edi
195
mov edi,tedit0
196
call [ted_is_select]
197
cmp al,0
198
.........
199
pop edi eax
200
201
202
Функция вызываемая для реакции на клавиатуру. В регистре eax должен быть код нажатой клавиши. Принимает 3 параметра:
203
1) структура tedit,
204
2) таблица для конвертации scan кодов в ascii,
205
3) управляющие символы.
206
Пример использования:
207
mcall 66,3 ;66.3 получить состояние управляющих клавиш
208
xor esi,esi
209
mov ecx,1
210
test al,0x03 ;[Shift]
211
jz @f
212
mov cl,2
213
or esi,KM_SHIFT
214
@@:
215
test al,0x0c ;[Ctrl]
216
jz @f
217
or esi,KM_CTRL
218
@@:
219
test al,0x30 ;[Alt]
220
jz @f
221
mov cl,3
222
or esi,KM_ALT
223
@@:
224
test al,0x80 ;[NumLock]
225
jz @f
226
or esi,KM_NUMLOCK
227
@@:
228
229
mcall 26,2,,conv_tabl ;26.2 получить раскладку клавиатуры
230
mcall 2 ;получаем код нажатой клавиши
231
stdcall [ted_key], tedit0, conv_tabl,esi
232
233
234
Функция на перемещение или нажатие мыши.
235
Пример использования:
236
stdcall [ted_mouse], tedit0
237
238
239
Функция для открытия файла. Принимает 3 параметра:
240
1) структура tedit,
241
2) структура для работы 70-й функции (до вызова функции заполнения не требует),
242
3) строка с путем и именем файла.
1459
IgorA
243
Возвращает 2 параметра:
244
1) eax = код ошибки
245
2) ebx = колличество прочитанных байт
1458
IgorA
246
Пример использования:
1459
IgorA
247
push eax ebx
248
stdcall [ted_open_file], tedit0,run_file_70,[edit1.text]
249
.........
250
pop ebx eax
1458
IgorA
251
252
253
Функция для добавления текста. Принимает 4 параметра:
254
1) структура tedit,
255
2) указатель на буфер с текстом,
256
3) длина текста,
257
4) опции вставки.
258
Пример использования:
1459
IgorA
259
text_buffer db 500 dup(0)
260
.........
261
mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
262
stdcall [ted_text_add], tedit0,text_buffer,30,ebx
1458
IgorA
263
ted_opt_ed_change_time - фиксировать изменения документа, что-бы их можно было отменить. Например если нужно сделать несколько изменений текста, которые будут отменяться за один раз, то 1-е изменение идет с этой константой а остальные нет.
264
ted_opt_ed_move_cursor - константа которая определяет сдвиг курсора после добавления текста.
265
266
267
Функция для разметки текста цветом. Обычно вызывается внутри самой библиотеки, при изменениях текста. В некоторых случаях может понадобиться вызвать принудительно из внешней программы.
268
Пример использования:
269
push edi
270
mov edi,tedit0
271
call [ted_text_colored]
272
pop edi
273
1476
IgorA
274
Внутренние функции:
1457
IgorA
275
ted_get_text_perv_pos - переход на предыдущий символ в цепи (через указатель 'perv')
276
ted_get_text_next_pos - переход на следующий символ в цепи (через указатель 'next')
277
ted_symbol_not_vis - определяет видимый ли указанный символ на экране (в зависимости
278
от значений 'tc' и 'td')
279
ted_iterat_next - переход на следующий видимый символ в цепи. Использует для
280
работы функции ted_get_text_next_pos и ted_symbol_not_vis.
281
ted_iterat_perv - переход на предедущий видимый символ в цепи.
282
283
ted_iterat_next_pos_char - найти следующую позицию указанного символа (edx-поз. начала
284
поиска, bl->код искомого символа)
285
ted_get_pos_by_coords - берет позицию символа по координатам (esi->коорд. x, знак;
286
ecx->коорд. y, строка)
287
ted_go_to_pos - переставляет курсор в указанную позицию, если указанная позиция
288
находится вне экрана, то также переставляются скролинги (ecx->коорд. x, знак; edx->коорд. y, строка)
289
1458
IgorA
290
1457
IgorA
291
292
Элемент Размер (байт)
293
Количество цветов текста
294
4
295
Количество подсвечиваемых слов
296
4
297
Цвета интерфейса
298
4*6
299
Цвета для текста
300
4*(кол. цв. текста)
301
Структуры со свойствами и описаниями слов
302
sizeof(TexColViv)*(кол. слов)
303
Разделительный символ, означающий начало описаний слов (всегда равен 0)
304
1 байт
305
Описания слов (строки текста с 0-ми в конце)
306
(длинна справочного текста + 1)
307
308
Замечания.
309
310
Все слова должны быть расположены в порядке следования их ASCII кодов.
311
Возможно в будущих версиях формат файлов подсветки будет изменен.
312
313
1464
IgorA
314
315
Макроса для создания структуры текстового редактора нет. Потому данные для него задаются вручную. Пример структуры для текстового редактора:
316
align 4
317
tedit0: ;структура текстового редактора
318
.wnd BOX 195,5+20,325,260 ;+ 0
319
.rec BOX 30,13,7,10 ;+16
320
.drag_m db 0 ;+32 выделение от мыши
321
.drag_k db 0 ;+33 выделение от клавиатуры
322
.sel TexSelect 0,0,0,0 ;+34 структура выделения
323
.seln TexSelect ;+50 дополнительная структура выделения
324
.tex dd 0 ;+66 text memory pointer
325
.tex_1 dd 0 ;+70 text first symbol pointer
326
.tex_end dd 0 ;+74 text end memory pointer
327
.cur_x dd 0 ;+78 координата x курсора
328
.cur_y dd 0 ;+82 координата y курсора
329
.max_chars dd 5002 ;+86 максимальное число символов в одном документе
330
.count_colors_text dd 1 ;+90 колличество цветов текста
331
.count_key_words dd 0 ;+94 колличество ключевых слов
332
.color_cursor dd 0xff0000 ;+98 цвет курсора
333
.color_wnd_capt dd 0x0080c0 ;+102 цвет полей вокруг окна
334
.color_wnd_work dd 0x0 ;+106 цвет фона окна
335
.color_wnd_bord dd 0xffffff ;+110 цвет текста на полях
336
.color_select dd 0x0000ff ;+114 цвет выделения
337
.color_cur_text dd 0xffff00 ;+118 цвет символа под курсором
338
.color_wnd_text dd 0x80ffff ;+122 цвет текста в окне
339
.syntax_file dd 0 ;+126 указатель на начало файла синтаксиса
340
.syntax_file_size dd 500 ;+130 максимальный размер файла синтаксиса
341
.text_colors dd 0 ;+134 указатель на массив цветов текста
342
.help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1)
343
.help_id dd -1 ;+142 идентификатор для справки
344
.key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv
345
.tim_ch dd ? ;+150 количество изменений в файле
346
.tim_undo dd ? ;+154 количество отмененных действий
347
.tim_ls dd ? ;+158 время последнего сохранения
348
.tim_co dd ? ;+162 время последней цветовой разметки
349
.el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе
350
.err_save db 0 ;+170 ошибка сохранения файла
351
.panel_id db 0 ;+171 номер открытой панели
352
.key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры
353
.symbol_new_line db 20 ;+173 символ завершения строки
354
.scr_w dd scrol_w1 ;+174 вертикальный скроллинг
355
.scr_h dd scrol_h1 ;+178 горизонтальный скроллинг
356
.arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов
357
.buffer dd buf ;+186 указатель на буфер копирования/вставки
358
.buffer_find dd 0 ;+190 указатель на буфер для поиска
359
.cur_ins db 1 ;+194 режим работы курсора (обычный или замена)
360
.mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.)
361
.mode_invis db 0 ;+196 режим показа непечатаемых символов
362
.gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor
363
.fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла)
364
.fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска)
365
.fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа)
366
.fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S
367
.buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки
368
.fun_find_err dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно
369
.fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса
370
.fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками
371
.fun_draw_panel_find dd 0 ;+230 указатель на функцию рисования панели поиска
372
.fun_draw_panel_syntax dd 0 ;+234 указатель на функцию рисования панели синтаксиса
373
.fun_save_err dd 0 ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно
374
.increase_size dd 225 ;+242 число символов на которые будет увечиваться память при нехватке
6274
IgorA
375
.ptr_free_symb dd ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста)
376
.font_s dd ? ;+250 стили для шрифта (от 0 до 7 множитель для размера, +16 для второго системного шрифта)
1457
IgorA
377
6274
IgorA
378
Документация обновлялась последний раз 21.02.16.
1457
IgorA
379
380
381