» Простой текстовый редактор Borland Delphi. . . Блог программистов


Блог программистов




200830 Авг

Простой текстовый редактор

Копирование статьи без копирайта запрещено!
www.prowares.ru © by Simply-Art

Каждый год у студентов возникает такая задача – сделать текстовый редактор. Я сделал редактор с минимум функций. Но главные функции этого редактора – работающие (что я не нашел в Интернете) процедуры поиска и замены.
Итак приступим к началу. Создаем новый проект, и кидаем на форму следующие компоненты:
MainMenu1, Memo1 (Standard)
OpenDialog1, SaveDialog1, FindDialog1, ReplaceDialog1 (Dialogs)
Кликним два раза по MainMenu1 которая лежит на форме. Создаем меню:
1. Файл
1.1. Открыть
1.2. Сохранить
1.3. Выход
2. Правка
2.1. Отмена
2.2. Вырезать
2.3. Копировать
2.4. Вставить
2.5. Удалить
2.6. Найти …
2.7. Найти далее
2.8. Замена
2.9. Выделить всё
Теперь перейдем непосредственно к коду. Выделяем компонент FindDialog1 и в Events щелкаем на OnFind. Там пишем следующий код:


procedure TForm1.FindDialog1Find(Sender: TObject);
var
FTPos:Integer; // Переменная для текущей позиции
IText,FText:String; // Исходный текст, Искомый текст
begin
Memo1.SetFocus; // Устанавливаем фокус ввода на Мемо иначе мы ничего не увидим
if not (frMatchCase in FindDialog1.Options) then
FText:=AnsiLowerCase(FindDialog1.FindText) else // Если в диалоги ищем без учета регистра
FText:=FindDialog1.FindText; // Если в диалоги ищем c учета регистра
if frDown in FindDialog1.Options then
begin // Поиск Вниз
IText:=copy(Memo1.Text,Memo1.SelStart+Memo1.SelLength+1,Length(Memo1.Text));
// Задаем исходный текст после текущей позиции курсора
if not (frMatchCase in FindDialog1.Options) then IText:=AnsiLowerCase(IText);
// Если в диалоги ищем без учета регистра
FTPos:=pos(FText,IText); // Собственно сам поиск
if FTPos=0 then Exit; // Если ничего не нашли то выходим из процедуры
FTPos:=FTPos+Memo1.SelStart+Memo1.SelLength;
// Делаем поправку на текущее положение курсора
Memo1.SelStart:=FTPos-1;Memo1.SelLength:=Length(FText); // Выделяем текст
end else // Поиск Вверх
begin
IText:=copy(Memo1.Text,0,Memo1.SelStart);
// Задаем исходный текст до текущей позиции курсора
if not (frMatchCase in FindDialog1.Options) then IText:=AnsiLowerCase(IText);
// Если в диалоги ищем без учета регистра
for FTPos:=length(IText)-length(FText) downto 1 do // Перебераем текст с конца до начала
if copy(IText,FTPos,length(FText))=FText then // Если фрагмент текста совпал с искомым то
begin
Memo1.SelStart:=FTPos-1;Memo1.SelLength:=Length(FText); // Выделяем текст
Exit; // Выходим из процедуры
end;
end;
end;

Переходим к ReplaceDialog1. В Events > OnFind пишем:


procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
FindDialog1.Options:=ReplaceDialog1.Options;
// Устанавливаем в диалоге поиска такие-же опции как и в диалоге замены
FindDialog1.FindText:=ReplaceDialog1.FindText; // Аналогично делаем с текстом
FindDialog1Find(Sender); // Вызываем процедуру поиска
end;

В Events > OnReplace пишем:


procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
FindDialog1.Options:=ReplaceDialog1.Options; // Всё аналогично предедущей процедуре
FindDialog1.FindText:=ReplaceDialog1.FindText; // Аналогично
with Sender as TReplaceDialog do // Заменяем пока можем
while True do
begin
if Memo1.SelText <> FindText then FindDialog1Find(Sender);
// Если нет выделеного текста то ищем
if Memo1.SelLength = 0 then Break; // Если так и не нашли текст то выходим из цикла
Memo1.SelText := ReplaceText; // Заменяем текст
if not (frReplaceAll in Options) then Break;
// Если нам надо один раз заменить то выходим из цикла
end;
end;

Это было основой. Теперь вверху формы есть меню. Щелкаем Файл>Открыть и там пишем:


begin
if OpenDialog1.Execute then // Если запущен диалог
Memo1.Lines.LoadFromFile(OpenDialog1.FileName); // Загружаем файл
end;

Аналогично Файл>Сохранить:


begin
if SaveDialog1.Execute then // Аналогично
Memo1.Lines.SaveToFile(SaveDialog1.FileName); // Сохраняем
end;

И Файл>Выход:


begin
Form1.Close; // Закрываем программу
end;

Теперь перейдем к меню Правка, Аналогично щелкаем и в OnClick пишем для каждого отдельно:


Memo1.Undo; // Отмена
Memo1.CutToClipboard; // Вырезает текст в буфер обмена
Memo1.CopyToClipboard; // Копирует текст в буфер обмена
Memo1.PasteFromClipboard;
// Вставляет текст из буфера обмена в текущую позицию (там где курсор) мемо
SendMessage(Memo1.Handle, WM_KEYDOWN, Ord(VK_DELETE), 0); // Нажимаем клавишу Del :)

А сейчас самое главное, Правка>Найти:


FindDialog1.Execute; // Запускаем диалог поиска

Найти далее:


FindDialog1Find(Sender); // Ищем далее

Заменить:


ReplaceDialog1.Execute; // Запускаем диалог замены

Ну и на последок Правка>Выделить всё:


Memo1.SelectAll; // Выделяем весь текст в мемо

Ну вот и всё думаю, если что буду исправлять и дополнять статью.

Исходник прилагается (для Delphi 7). Если есть предложения по улучшению кода пишите.

Комментарии

  1. Сентябрь 28th, 2008 | 21:01

    спасибо классный скрипт, буду пользоваться

  2. Октябрь 1st, 2008 | 18:59

    Спасибо давно такой искал!!!

  3. Декабрь 9th, 2008 | 18:01

    О сколько текстовых редакторов уже написано. О сколько текстовых редакторов еще будет написано.

    Желательно было поместить в заметку скрин текстового редактора.

  4. Январь 27th, 2009 | 18:01

    Спасибо, полезная статейка, мне какраз в универе нужно сделать подобное 😳

  5. Январь 28th, 2009 | 14:49

    Здорово если бы готовый dpr выложили

  6. Февраль 10th, 2009 | 00:28

    Хех, я на третьем курсе похожее ваял, только на визуал бейсике. Законную тройку получил, ностальгия, блин.

  7. Март 21st, 2009 | 14:17

    to Олег
    *.dpr и прочие файлы есть, внизу статьи ссылка — http://prowares.ru/library/informatics/programming/load/textedit.zip
    Код выложен как примера работы с текстом для студентов и просто интересующимся людям, и не претендует на заменители блокнота.

  8. Июнь 8th, 2009 | 17:54

    Скоро буду поступать на факультет вычислительной техники, неужели будем там такое программировать? Интересно!

  9. Ноябрь 28th, 2009 | 14:54

    Мамочки родный, как Вы во всем этом разбираетесь?!!! тут же можно голову сломать!

  10. Март 11th, 2010 | 22:17

    Классный скрипт,спасибо

  11. Март 13th, 2010 | 18:56

    Все гениальное — просто.

  12. Fess
    Апрель 17th, 2010 | 08:24

    Спасибо за скрипт случайно попал на ссылку и как раз мне было интересно, как происходит поиск, а то сам не мог домыслить(у меня он был очень кривой=) ). Спасибо большое!

  13. Clemm
    Ноябрь 9th, 2010 | 15:50

    Только процедуры сохранить/открыть вообще маленькие. Втаком виде они не будут правильно работать….

  14. Koshka
    Март 24th, 2011 | 22:07

    Огромнейшее спасибо автору))) просто спас мне жизнь 😉

  15. Александр
    Декабрь 4th, 2011 | 20:44

    Плохо сделано, кнопка найти не работает так, как надо, программа не предлагает пользователю сохранить изменения в документе, когда он пытается открыть или создать новый

  16. Февраль 24th, 2012 | 21:21

    Я однажды создал что то подобное но такая програмка не имеет большого применения на практике. Эсли уж создавать то уже офысный пакет.

  17. Эралы
    Апрель 26th, 2012 | 19:15

    Спасибо