Текстовый редактор
Думаю, я не ошибусь, сказав, что почти все программисты, начинающие осваивать объектно-ориентированные
языки программирования одной из самых первых программ пишут текстовый редактор. К таким людям отношусь
и я. Мне тоже захотелось написать свой небольшой блокнот и вот что из этого получилось.
Для начала нужно создать новый проект. Затем положить на форму компоненты:
- 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;
|
Вернуться в оглавление
Вернуться на главную страницу
|