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