ВНИМАНИЕ! Конкурс по программированию!

Проект Programmers.kz и школа hotPen3D2D предлагает Вам курсы по веб-дизайну, веб-программированию и компьютерной графике. Подробности здесь.

 
Информация к новости
 (голосов: 1)

Работа с Delphi. Создание своего текстового редактора. Ч.2

Категория: Программирование » Delphi » Уроки Delphi

Продолжение.

В прошлый раз мы остановились на том, что расположили все необходимые, для создания программы, компоненты и задали им нужные свойства. Сегодня мы поговорим о том, как заставить программу выполнять все те действия, которые были задуманы. Ниже я приведу код, который обеспечит 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
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
DampirSIMPL

30 июля 2010 11:49

Информация к комментарию
  • Группа: Посетители
  • ICQ: --
  • Регистрация: 30.07.2010
  • Публикаций: 0
  • Комментариев: 1

Form1.Caption:="Документ - "+ExtractFileName(EditFile);

у меня ругаеться на эту строчку

[Error] Unit1.pas(176): Illegal character in input file: '"' ($22)
[Error] Unit1.pas(176): Illegal character in input file: '"' ($22)
[Error] Unit1.pas(176): Operator not applicable to this operand type
[Error] Unit1.pas(179): '.' expected but ';' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'


вот этим в программировании я новичок помогите пожалусто что я сделал не так))

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Введите два слова, показанных на изображении: *