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