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

Думаю, я не ошибусь, сказав, что почти все программисты, начинающие осваивать объектно-ориентированные языки программирования одной из самых первых программ пишут текстовый редактор. К таким людям отношусь и я. Мне тоже захотелось написать свой небольшой блокнот и вот что из этого получилось.

Для начала нужно создать новый проект. Затем положить на форму компоненты:

  • 1. Главное меню MainMenu;
  • 2. Многострочный редактор Memo;
  • 3. Строку состояния StatusBar;
  • 4. Диалоги:
    • OpenDialog - Открытие файла;
    • SaveDialog - Сохранение файла;
    • FontDialog - Выбор параметров шрифта;
    • ColorDialog - Выбор цвета редактора;
    • PrintDialog - Печати теста;
    • PrenterSetupDialog - Настройки печати;
    • FindDialog - Поиск в тексте;
    • ReplaceDialog - Поиск и замена.
  • 5. Панель инструментов ToolBar;
  • 6. На Панель инструментов положить некоторое количество кнопок быстрого доступа
         SpeedButton и два комбинированных списка ComboBox.

Далее нужно создать примерно такую систему главного меню:

"Файл" ShortCut "Правка" ShortCut "Формат"
Новый Ctrl+N Отменить Ctrl+Z Шрифт
Открыть Ctrl+O Вырезать Ctrl+X  
Сохранить Ctrl+S Копировать Ctrl+C  
Сохранить как...   Вставить Ctrl+V  
Настойка печати   Найти...    
Печать Ctrl+P Поиск и замена...    
Выход Alt+F4 Выделить все Ctrl+A  

И так, начнем свою работу с процедуры создания формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
 // Процедура отображения нажатых функциональных клавиш в строке состояния
 Application.OnIdle:=IdleProc;

 // Прsоцедура для отображения всплывающих подсказок в строке состояния
 Application.OnHint:=StatusHint;

 // Загружаем все установленные шрифты системы в комбинированный список
 ComboFontStyle.Items:=Screen.Fonts;

 // Задаем произвольные размеры шрифта
 ...
 ComboFontSize.Items.Add('6');
 ComboFontSize.Items.Add('8');
 ComboFontSize.Items.Add('10');
 ComboFontSize.Items.Add('12');
 ...

 // Задаем параметры шрифта по умолчанию
 ComboFontSize.ItemIndex:=3;
 ComboFontStyle.ItemIndex:=26;

 Memo1.Font.Name:=ComboFontStyle.Text;
 Memo1.Font.Size:=StrToInt(ComboFontSize.Text);

 // Имя редактируемого файла
 EditFile:='NoName.txt';
 Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);

 OpenDialog1.Filter:='Текстовые файлы *.txt| *.txt| Все файлы *.*| *.*';
 OpenDialog1.DefaultExt:='TXT';

 SaveDialog1.Filter:='Текстовые файлы *.txt| *.txt| Все файлы *.*| *.*';
 SaveDialog1.DefaultExt:='TXT';
end;

Обработчик события появления всплывающей подсказки. При наведении указателя мыши на какой-либо компонент, его всплывающая подсказка отображается в строке состояния:

procedure TForm1.StatusHint(Sender: TObject);
begin
 StatusBar1.Panels[1].Text:=Application.Hint;
end;

Процедура отображения нажатых функциональных клавиш NumLock, CapsLock, ScrollLock в строке состояния. Для этого используется функция GetKeyState:

procedure TForm1.IdleProc(Sender: TObject; Var Done: Boolean);
Begin
 If GetKeyState(VK_NUMLOCK) = 1 Then StatusBar1.Panels[2].Text:='NumLock'
   Else StatusBar1.Panels[2].Text:='';

 If GetKeyState(VK_SCROLL) = 1 Then StatusBar1.Panels[3].Text:='Scroll Lock'
   Else StatusBar1.Panels[3].Text:='';

 If GetKeyState(VK_CAPITAL) = 1 Then StatusBar1.Panels[4].Text:='CapsLock'
   Else StatusBar1.Panels[4].Text:='';

 Done:=False;
End;

Пункт меню "Файл" - "Новый". Перед созданием нового файла проверяем, сохранен ли текущий файл:

procedure TForm1.mnuFileNewClick(Sender: TObject);
Var Result: TModalResult;
begin
 If Memo1.Modified Then
   Begin
     Result:=Application.MessageBox('Сохранить изменения ?', 'Внимание: ',
                                    MB_YESNOCANCEL + MB_ICONQUESTION);
     If Result = id_Yes Then
       Begin
         mnuFileSave.Click;
         Memo1.Clear;
         EditFile:='NoName.txt';
         Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
       End
    Else
      If Result = id_No Then
        Begin
          Memo1.Clear;
          EditFile:='NoName.txt';
          Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
        End;
   End
 Else
   If NOT Memo1.Modified Then
     Begin
       Memo1.Clear;
       EditFile:='NoName.txt';
       Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
     End;
end;

Пункт меню "Файл" - "Открыть". Перед открытием нового файла проверяем, сохранен ли текущий файл.

procedure TForm1.mnuFileOpenClick(Sender: TObject);
Var Result: TModalResult;
begin
 If NOT Memo1.Modified Then
   Begin
     If OpenDialog1.Execute Then
       Begin
         EditFile:=OpenDialog1.FileName;
         Memo1.Lines.LoadFromFile(EditFile);
         Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
       End;
   End
 Else
   If Memo1.Modified Then
     Begin
       Result:=Application.MessageBox('Сохранить изменения ?', 'Внимание: ',
                                       MB_YESNOCANCEL + MB_ICONQUESTION);
       If Result = id_Yes Then
         Begin
           mnuFileSave.Click;
           Memo1.Clear;
         End
       Else
         If Result = id_No Then
            Begin
              Memo1.Clear;
              If OpenDialog1.Execute Then
                Begin
                  EditFile:=OpenDialog1.FileName;
                  Memo1.Lines.LoadFromFile(EditFile);
                  Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
                End;
            End;
     End;
end;

Пункт меню "Файл" - "Сохранить". Перед сохранением файла проверяем, имя текущего файла. Если имя файла является заданным по умолчанию, то выводим диалог для задания уникального имени файла.

procedure TForm1.mnuFileSaveClick(Sender: TObject);
begin
 If EditFile = 'NoName.txt' Then mnuFileSaveAs.Click
   Else Memo1.Lines.SaveToFile(EditFile);
 If Memo1.Modified Then Memo1.Modified:=False;
end;

Пункт меню "Файл" - "Сохранить как...":

procedure TForm1.mnuFileSaveAsClick(Sender: TObject);
begin
 If SaveDialog1.Execute Then
   Begin
     EditFile:=SaveDialog1.FileName;
     Memo1.Lines.SaveToFile(EditFile);
     Form1.Caption:='Текстовый Редактор - ' + ExtractFileName(EditFile);
   End;
 If Memo1.Modified Then Memo1.Modified:=False;
end;

Пункт меню "Файл" - "Настройки печати":

procedure TForm1.mnuFilePrintSetupClick(Sender: TObject);
begin
 PrinterSetupDialog1.Execute;
end;

Пункт меню "Файл" - "Печать":

procedure TForm1.mnuFilePrintClick(Sender: TObject);
Var F: System.Text;
    I: Integer;
begin
 If PrintDialog1.Execute Then
   Begin
     AssignPrn(F);
     Rewrite(F);
     For I:=0 To Memo1.Lines.Count-1 Do Writeln(F, Memo1.Lines[I]);
     System.Close(F);
   End;
end;

Пункт меню "Правка" - "Отменить":

procedure TForm1.mnuEditUndoClick(Sender: TObject);
begin
 Memo1.Undo;
end;

Пункт меню "Правка" - "Вырезать":

procedure TForm1.mnuEditCutClick(Sender: TObject);
begin
 Memo1.CutToClipboard;
end;

Пункт меню "Правка" - "Вставить":

procedure TForm1.mnuEditPasteClick(Sender: TObject);
begin
 Memo1.PasteFromClipboard;
end;

Пункт меню "Правка" - "Копировать":

procedure TForm1.mnuEditCopyClick(Sender: TObject);
begin
 Memo1.CopyToClipboard;
end;

Пункт меню "Правка" - "Найти...":

procedure TForm1.mnuEditFindClick(Sender: TObject);
begin
 FindDialog1.Execute;
end;

Пункт меню "Правка" - "Найти и заменить...":

procedure TForm1.mnuEditFindReplaceClick(Sender: TObject);
begin
 ReplaceDialog1.Execute;
end;

Обработчик события нахождения текста при помощи FindDialog:

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
 If Pos(FindDialog1.FindText, Memo1.Text) <> 0 Then
   Begin
     Memo1.HideSelection:=False;
     Memo1.SelStart:=Pos(FindDialog1.FindText,Memo1.Text)-1;
     Memo1.SelLength:=Length(FindDialog1.FindText);
   End;
end;

Обработчик события нахождения текста при помощи ReplaceDialog:

procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
 If Pos(ReplaceDialog1.FindText,Memo1.Text) <> 0 Then
   Begin
     Memo1.HideSelection:=False;
     Memo1.SelStart:=Pos(ReplaceDialog1.FindText,Memo1.Text)-1;
     Memo1.SelLength:=Length(ReplaceDialog1.FindText);
     If Application.MessageBox ('Заменить ?', 'Внимание:', MB_YESNO) = id_Yes
       Then Memo1.SelText:=ReplaceDialog1.ReplaceText
         Else Memo1.SelText:=Memo1.SelText;
   End;
end;

Пункт меню "Правка" - "Выделить все":

procedure TForm1.mnuEditSelectAllClick(Sender: TObject);
begin
 Memo1.SelectAll;
end;

Пункт меню "Формат" - "Шрифт":

procedure TForm1.mnuFormatFontClick(Sender: TObject);
begin
 If FontDialog1.Execute Then
   Begin
    Memo1.Font:=FontDialog1.Font;
    ComboFontStyle.Text:=FontDialog1.Font.Name;
    ComboFontSize.Text:=IntToStr(FontDialog1.Font.Size);
    ComboFontStyle.Update;
    ComboFontSize.Update;
   End;
end;

Кнопка на Панели инструментов "Жирный":

procedure TForm1.SpdBtnBoldClick(Sender: TObject);
begin
 If Memo1.Font.Style <> Memo1.Font.Style + [fsBold]
   Then Memo1.Font.Style:=Memo1.Font.Style + [fsBold]
     Else
       If Memo1.Font.Style = Memo1.Font.Style + [fsBold]
         Then Memo1.Font.Style:=Memo1.Font.Style - [fsBold]
end;

Кнопка на Панели инструментов "Курсив":

procedure TForm1.SpdBtnKursivClick(Sender: TObject);
begin
 If Memo1.Font.Style <> Memo1.Font.Style + [fsItalic]
   Then Memo1.Font.Style:=Memo1.Font.Style + [fsItalic]
     Else
       If Memo1.Font.Style = Memo1.Font.Style + [fsItalic]
         Then Memo1.Font.Style:=Memo1.Font.Style - [fsItalic]
end;

Кнопка на Панели инструментов "Подчеркнутый":

procedure TForm1.SpdBtnUnderLineClick(Sender: TObject);
begin
 If Memo1.Font.Style <> Memo1.Font.Style + [fsUnderLine]
   Then Memo1.Font.Style:=Memo1.Font.Style + [fsUnderLine]
     Else
       If Memo1.Font.Style = Memo1.Font.Style + [fsUnderLine]
         Then Memo1.Font.Style:=Memo1.Font.Style - [fsUnderLine]
end;

Кнопка на Панели инструментов для выбора цвета редактора:

procedure TForm1.SpdBtnFontColorClick(Sender: TObject);
begin
 If ColorDialog1.Execute Then Memo1.Color:=ColorDialog1.Color;
end;

Комбинированный список для выбора шрифта:

procedure TForm1.ComboFontStyleChange(Sender: TObject);
begin
 Memo1.Font.Name:=ComboFontStyle.Text;
 If Memo1.CanFocus Then Memo1.SetFocus;
 FontDialog1.Font.Assign(Memo1.Font);
end;

Комбинированный список для выбора размера шрифта:

procedure TForm1.ComboFontSizeChange(Sender: TObject);
begin
 Try
   Memo1.Font.Size:=StrToInt(ComboFontSize.Text);
   If Memo1.CanFocus Then Memo1.SetFocus;
   FontDialog1.Font.Assign(Memo1.Font);
 Except
   ComboFontSize.Text:='12';
 End;
end;

Кнопка на Панели инструментов для выравнивания текста по левому краю:

procedure TForm1.SpdBtnAlignLeftClick(Sender: TObject);
begin
 Memo1.Alignment:=taLeftJustify;
end;

Кнопка на Панели инструментов для выравнивания текста по центру:

procedure TForm1.SpdBtnAlignCenterClick(Sender: TObject);
begin
 Memo1.Alignment:=taCenter;
end;

Кнопка на Панели инструментов для выравнивания текста по правому краю:

procedure TForm1.SpdBtnAlignRightClick(Sender: TObject);
begin
 Memo1.Alignment:=taRightJustify;
end;

Обработчик события закрытия формы. Перед закрытием проверяем сохранен ли текущий файл:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var Result: TModalResult;
begin
 If Memo1.Modified Then
   Begin
     Result:=Application.MessageBox('Сохранить изменения ?', 'Внимание:',
                                     MB_YESNOCANCEL + MB_ICONQUESTION);
     If Result = id_Yes Then mnuFileSave.Click
       Else
     If Result = id_NO Then CanClose:=True
       Else
     If Result = id_Cancel Then CanClose:=False;
   End;
end;

Вернуться в оглавление
Вернуться на главную страницу
Hosted by uCoz