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