Простой текстовый редактор
Копирование статьи без копирайта запрещено!
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). Если есть предложения по улучшению кода пишите.
спасибо классный скрипт, буду пользоваться
Спасибо давно такой искал!!!
О сколько текстовых редакторов уже написано. О сколько текстовых редакторов еще будет написано.
Желательно было поместить в заметку скрин текстового редактора.
Спасибо, полезная статейка, мне какраз в универе нужно сделать подобное 😳
Здорово если бы готовый dpr выложили
Хех, я на третьем курсе похожее ваял, только на визуал бейсике. Законную тройку получил, ностальгия, блин.
to Олег
*.dpr и прочие файлы есть, внизу статьи ссылка — http://prowares.ru/library/informatics/programming/load/textedit.zip
Код выложен как примера работы с текстом для студентов и просто интересующимся людям, и не претендует на заменители блокнота.
Скоро буду поступать на факультет вычислительной техники, неужели будем там такое программировать? Интересно!
Мамочки родный, как Вы во всем этом разбираетесь?!!! тут же можно голову сломать!
Классный скрипт,спасибо
Все гениальное — просто.
Спасибо за скрипт случайно попал на ссылку и как раз мне было интересно, как происходит поиск, а то сам не мог домыслить(у меня он был очень кривой=) ). Спасибо большое!
Только процедуры сохранить/открыть вообще маленькие. Втаком виде они не будут правильно работать….
Огромнейшее спасибо автору))) просто спас мне жизнь 😉
Плохо сделано, кнопка найти не работает так, как надо, программа не предлагает пользователю сохранить изменения в документе, когда он пытается открыть или создать новый
Я однажды создал что то подобное но такая програмка не имеет большого применения на практике. Эсли уж создавать то уже офысный пакет.
Спасибо