Интерпретируй ЭТО! Диман Dr.X (xdiman@mail.ru) Xakep, номер #067, стр. 067-086-3 {Твои действия по поиску текста} end; {skipped} else if func='INSERT': begin {Вставка текста} end; Каждому понятно, что между begin и end должны стоять действия, связанные с данной командой. Так как всю функцию анализирующего модуля выполняет эта структура, то совместим анализирующий и исполнительный модули в одной процедуре. Теперь можно приступить к написанию заключительного кода. Анализирующе-исполнительный модуль Для начала объявим две переменные в коде кнопки: currentline и currentchar, обе типа integer. Они будут указывать текущее положение курсора: линию и позицию на строке. Также объяви те переменные для названия функции и параметров: func, param1, param2, param3. Вначале напишем код, считывающий построчно из файла команды и записывающий эти данные в массив. А теперь будем писать код для каждой команды. Например, чтобы переместиться на линию и определенное количество символов, требуется всего лишь присвоить значения координатным переменным: if func='GOLINE' then Val(param1,currentline,NULL); if func='GOCHAR' then Val(param1,currentchar,NULL); Теперь курсор будет находиться в определенном месте текста. Для вставки можно объявить дополнительную переменную h для упрощения кода и использовать следующую конструкцию (текст находится в Memo1): Вставка if func='INSERT' then begin h:=Memo1.Lines.Strings[currentline]; h:=Concat(copy(h,1,currentchar),param1,copy(h,currentchar+1,length(h)-currentchar)); Memo1.Lines.Strings[currentline]:=h; end; Аналогично создаются и операции удаления, с помощью конкатенации и копирования. И последние две операции - REPLACE и FIND, их реализация не должна вызвать у тебя каких-либо затруднений. Тестирование: обработка текстов Вот и написан простенький текстовый редактор с поддержкой скриптов для обработки текста. Уверен, что ты сможешь найти ему множество применений, если часто приходится редактировать различные тексты по одному правилу. Например, преобразование текста в html - преобразование всех >,<, пробелов в записи типа . Кроме того, набор команд легко дополним, а изложенные здесь методы можно будет легко приспособить для работы в других целях. На этом все. Будет интересно узнать о реализации какой-либо функции - пиши мне, помогу. Матрица: Продвижение Конечно, написанный нами исходник довольно прост и понятен каждому кодеру. Но все же, если ты рано или поздно займешься серьезным проектом, стоит подумать о некоторых вещах. Например, описанная нами структура: while not EOF(fin) do begin readln(fin, temp); parser(temp,func,param1,param2,param3); if func='GOLINE' then ...; … if func='DELAFTER' then ...; end; - конечно, вполне корректна и будет работать. Но заметь, что во всех проходах цикла while not EOF(fin) do будут выполняться ВСЕ проверки по "if". А теперь представь, что операторов типа GOLINE, GOCHAR и т.п. пара сотен? Сколько времени уйдет на парсинг и исполнение входного файла, если в нем несколько тысяч строк? Для повышения скорости обработки можно, конечно, в каждый оператор if после выполнения всех операций по then вставить процедуру Continue (которая компилируется в одну ассемблерную команду). Однако есть способ лучше. Пусть процедура |