Продолжение.
В прошлый раз мы остановились на том, что расположили все необходимые, для создания программы, компоненты и задали им нужные свойства. Сегодня мы поговорим о том, как заставить программу выполнять все те действия, которые были задуманы. Ниже я приведу код, который обеспечит Twedit всеми основными функциями, которые могут потребоваться Вам - дорогие читатели. Для начала рассмотрим основные операции над текстом: это копирование, удаление, вставка, выделение и прочее, без которых текстовые редактор потеряет своё название и превратиться в ерунду.
Откроем наш проект и нажмём два раза на компонент
PopupMenu. Перед нами откроется тот список полей, которые мы создали прошлый раз. Нажмите два раза на команду "Вырезать" и впишите туда код, который служит для "вырезания" текста:
| PopupMenu -> "Вырезать" |
procedure TForm1.N14Click(Sender: TObject);
begin
SynEdit1.CutToClipboard;
end;
|
|
Соответственно для пункта "Копировать", напишем:
| PopupMenu -> "Копировать" |
procedure TForm1.N15Click(Sender: TObject);
begin
SynEdit1.CopyToClipboard;
end;
|
|
Для "Вставить":
| PopupMenu -> "Вставить" |
procedure TForm1.N16Click(Sender: TObject);
begin
SynEdit1.PasteFromClipboard;
end;
|
|
Для "Удалить":
| PopupMenu -> "Удалить" |
procedure TForm1.N16Click(Sender: TObject);
begin
SynEdit1.ClearSelection;
end;
|
|
Для "Выделить всё":
| PopupMenu -> "Выделить всё" |
procedure TForm1.N16Click(Sender: TObject);
begin
SynEdit1.SelectAll;
end;
|
|
Это меню будет выскакивать тогда, когда при редактировании текста мы нажмём правую кнопку мыши. Вы можете найти много разных полезных функций компонента
SynEdit1. Для этого, допустим, при нажатии на какую-нибудь кнопку пишете
SynEdit1. (после названия ставите точку) и появится список, в котором будут указаны все функциональные возможности этого компонента.
Выполните для тех же пунктов меню, только компонента
MainMenu те же операции, что мы только что проделали с
PopupMenu, т.е. для пунктов
"Вырезать", "Копировать", "Вставить", "Удалить", "Выделить всё". И чтобы закончить с разделом "Правка", сделаем функциональным пункты "Найти" и "Заменить" . Для этого из вкладки "Dialogs", поместим два компонента:
FindDialog и
ReplaceDialog. Их свойства менять не будем.
| MainMenu20001 -> "Правка" -> "Найти" |
procedure TForm1.N26Click(Sender: TObject);
begin
FindDialog1.Execute;
end;
|
|
Но если Вы могли заметить, у нас нет связи компонента поиска с самим текстом. Для этого есть событие компонента
FindDialog, которое отвечает за поиск:
OnFind
| FindDialog1 -> Events -> OnFind |
procedure TForm1.FindDialog1Find(Sender: TObject);
var
Buff,P,FT: PChar;
BuffLen: Word;
begin
with Sender as TFindDialog do
begin
GetMem(FT, Length(FindText) + 1);
StrPCopy(FT, FindText);
BuffLen:= SynEdit1.GetTextLen + 1;
GetMem(Buff, BuffLen);
SynEdit1.GetTextBuf(Buff, BuffLen);
P:= Buff + SynEdit1.SelStart + SynEdit1.SelLength;
P:= StrPos(P, FT);
if P=nil then MessageBeep(0)
else
begin
SynEdit1.SelStart:= P - Buff;
SynEdit1.SelLength:= Length(FindText);
end;
FreeMem(FT, Length(FindText) + 1);
FreeMem(Buff, BuffLen);
end;
end;
|
|
Мы организовали небольшую процедуру, при вызове которой ищется нужный текст и выделяется. Если он не найден, то ничего не происходит. Перейдём к замене текста.
| MainMenu20001 -> "Правка" -> "Заменить" |
procedure TForm1.N27Click(Sender: TObject);
begin
ReplaceDialog1.Execute;
end;
|
|
Чтобы компонент мог искать текст, напишем процедуру:
| ReplaceDialog1 -> Events -> OnFind |
procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
with Sender as TReplaceDialog do
while True do
begin
if SynEdit1.SelText <> FindText then
FindDialog1Find(Sender);
if SynEdit1.SelLength = 0 then Break;
SynEdit1.SelText:= ReplaceText;
if not (frReplaceAll in Options) then Break;
end;
end;
|
|
Что должен, сделать грубо, говоря компонент, после того, как он найдёт заданный текст? Правильно, его заменить.
| ReplaceDialog1 -> Events -> OnReplace |
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
label 10;
begin
SynEdit1.HideSelection:=true;
10:
if pos(ReplaceDialog1.FindText,SynEdit1.Text)<>0 then
begin
SynEdit1.SelStart:=pos(ReplaceDialog1.FindText,SynEdit1.Text)-1;
SynEdit1.SelLength:=Length(ReplaceDialog1.FindText);
SynEdit1.SelText:=ReplaceDialog1.ReplaceText;
goto 10;
end;
SynEdit1.HideSelection:=false;
end;
|
|
Если Вы всё правильно сделали, то всё должно работать. Перейдём к следующему пункту меню - это "Создать". Ну здесь - легко, вписываете процедуру:
| MainMenu20001 -> "Файл" -> "Создать" |
procedure TForm1.N31Click(Sender: TObject);
begin
SynEdit1.Lines.Clear;
end;
|
|
Для открытия документа необходимо поместить компонент из вкладки "Dialogs", который отвечает за это. (
OpenDialog)
| MainMenu20001 -> "Файл" -> "Открыть" |
procedure TForm1.N2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
EditFile:=OpenDialog1.FileName;
SynEdit1.Lines.LoadFromFile(EditFile);
Form1.Caption:="Документ - "+ExtractFileName(EditFile);
end;
end;
|
|
Для закрытия файл, можно просто написать Form1.Close, т.к. у компонента я такого свойства не нашёл. Переходим к сохранению текста в файл. Для удобства, будем сохранять новый докукмент в формат *.txt. Для этого, вновь заглянем в палитру компонентов и выберем вкладку "Dialogs". Оттуда возьмём компонент
SaveDialog и поместим на форму. Для пункта "Сохранить" напишем:
| MainMenu20001 -> "Файл" -> "Сохранить" |
procedure TForm1.N5Click(Sender: TObject);
begin
if SaveDialog1.Execute then
SynEdit1.Lines.SaveToFile(EditFile);
if SynEdit1.Modified then SynEdit1.Modified:=false;
end;
|
|
Аналогично сделаем для "Сохранить как..."
| MainMenu20001 -> "Файл" -> "Сохранить как..." |
procedure TForm1.N6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
EditFile:=SaveDialog1.FileName;
SynEdit1.Lines.SaveToFile(EditFile);
Form1.Caption:="Документ - "+ExtractFileName(EditFile);
if SynEdit1.Modified then SynEdit1.Modified:=false;
end;
end;
|
|
Здесь мы присваиваем заголовку формы имя файла, для того, чтобы было легче с ним работать. Не забудьте объявить глобальную переменную
EditFile типа
string; в секции
var. Далее осуществим работу с принтером. Из той же вкладки возьмём два компонента:
PrintDialog и
PrinterSetupDialog.
| MainMenu20001 -> "Файл" -> "Настройка печати" |
procedure TForm1.N7Click(Sender: TObject);
begin
PrinterSetupDialog1.Execute;
end;
|
|
Чтобы распечатать документ, воспользуемся этим кодом:
| MainMenu20001 -> "Файл" -> "Печать" |
procedure TForm1.N8Click(Sender: TObject);
var
Stroka:System.TextFile;
i:integer;
begin
if PrintDialog1.Execute then
begin
AssignPrn(Stroka);
Rewrite(Stroka);
Printer.Canvas.Font:=SynEdit1.Font;
for i:=0 to SynEdit1.Lines.Count-1 do
Writeln(Stroka,SynEdit1.Lines[i]);
System.CloseFile(Stroka);
end;
end;
|
|
Добавьте модуль
Printers в раздел
uses. Перейдём к последней части разработки программы: изменения цвета и шрифта.
| MainMenu20001 -> "Формат" -> "Шрифт" |
procedure TForm1.N28Click(Sender: TObject);
begin
if FontDialog1.Execute then SynEdit1.Font:=FontDialog1.Font;
end;
|
|
| MainMenu20001 -> "Формат" -> "Цвет текста" |
procedure TForm1.N29Click(Sender: TObject);
begin
if ColorDialog1.Execute then SynEdit1.Font.Color:=ColorDialog1.Color;
end;
|
|
| MainMenu20001 -> "Формат" -> "Цвет фона" |
procedure TForm1.N30Click(Sender: TObject);
begin
if ColorDialog1.Execute then SynEdit1.Color:=ColorDialog1.Color;
end;
|
|
С пунктами меню закончили. Значит можно переходить к панели StatusBar. Создадим процедуру StatusBar, которую не забудьте объявить в начале строчкой:
procedure StatusBar(Sender: TObject; var Done:Boolean);
А в обработке этой процедуры мы напишем:
| Form1.StatusBar |
procedure TForm1.StatusBar(Sender: TObject; var Done:Boolean);
var
MS: TMemoryStatus;
begin
StatusBar1.Panels[0].Text:=" " + Application.Hint;
StatusBar1.Panels[2].Text:=" Время: " + TimeToStr(Time);
if GetKeyState(VK_Numlock)=1
then StatusBar1.Panels[1].Text:=" " + ""Num Lock" включен"
else StatusBar1.Panels[1].Text:=" " + ""Num Lock" выключен";
if GetKeyState(VK_Insert)=1
then StatusBar1.Panels[3].Text:=" " + "Режим замены"
else StatusBar1.Panels[3].Text:=" " + "Режим вставки";
GlobalMemoryStatus(MS);
StatusBar1.Panels[4].Text:=" Память загружена на: " + Format("%d %%", [MS.dwMemoryLoad]);
end;
|
|
Для того, чтобы это работало, при создании формы необходимо написать строчку:
| Form1 -> OnCreate |
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=StatusBar;
end;
|
|
Теперь панель StatusBar работает. Для вывода подсказок при наведении к нужному компоненту, включите у него свойство
ShowHint в
true, и в поле
hint введите нужный текст подсказки. И последнее полезное свойство, о котором я хочу рассказать, это запрос сохранения при выходе из редактора.
| Form1 -> OnClose |
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if SynEdit1.Modified then
if MessageDlg("Файл "+ExtractFileName(EditFile)+" был изменён.
Перед выходом он не будет сохранён "+#10#13"Подтвердить выход?",
mtConfirmation,[mbYes,mbNo],0)=mrYes
then Action:=caFree
else Action:=caNone;
end;
|
|
Вот и всё. Скачать исходник текстового редактора для Delphi 7 Вы можете
здесь. Спасибо за внимание... и ждите новых статей от Web-Brodilki.
Источник: web-brodilka.ru