Студопедия — Урок11. Текстовый редактор
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






На этом уроке мы с вами продолжим писать текстовый редактор MyEdit. Последнюю версию можно посмотреть в уроке №9 и скачать здесь. Если вы самостоятельно писали эту программу по урокам, но настоятельно рекомендую скачать именно мою версию, поскольку у нас может не совпадать названия пунктов меню.

Итак, наша программа уже обладает почти всеми стандартными функциями работы с простым текстом. Напишем еще процедуры сохранения текста на диск.

Если редактируемый файл новый, то вместо сохранения будет предложено файл "сохранить как...", где пользователь должен указать имя файла.

Для начала изменяем свойство Caption для окна ChildForm на 'НОВЫЙ'. Это можно сделать и программно. Для этого для реакции на событие OnCreate для этого дочернего окна создаем процедуру.

 

procedure TChildForm.FormCreate(Sender: TObject);
begin
Caption:='НОВЫЙ'; // Заголовок окна нового файла содержит название "НОВЫЙ"
end;

Теперь пишем процедуру нажатия на меню "Сохранить как...". Для этого в главную форму MainForm устанавливаем компонент TSaveDialog , находящейся на странице Dialogs палитры компонентов. Поскольку фильтр отображаемых файлов в диалоговых окнах открытия и сохранения файла одинаков, то копируем строчку свойства Filter для компонента OpenDialog1 в аналогичное свойство для компонента SaveDialog1. Дальше с помощью Object Inspector создаем процедуру реакции на нажатие кнопки "Сохранить как...".

 

procedure TMainForm.N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
SaveDialog1.Title:='Сохранить файл как...'; // заголовок диалогового окна сохранения файла
if SaveDialog1.Execute then // если пользователь выбрал название файла
begin
(ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile(SaveDialog1.FileName); // сохранение
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName; // заголовок окна
end;
end;

Строка (ActiveMDIChild as TChildForm) позволяет получить доступ из главного окна к активному дочернему. Эта строка равноценна ChildForm, только выполняется она только для активного окна.

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

 

Делаем процедуру сохранения файла для пункта "Сохранить". Следует при этом помнить, что если файл новый и название не определено, то вместо этого необходимо вызывать процедуру "Сохранить как..."

 

procedure TMainForm.N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then // если заголовок окна "НОВЫЙ", то выполнять 1, иначе выполнять 2
N5Click(Sender) // 1. Идти в процедуру "Созранить как..."
else (ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile((ActiveMDIChild as TChildForm).Caption); // 2. Сохранить файл с именем, указанным в заголовке
end;

 

Получилась немного сложноватые строки даже для специалиста. Но не пугайтесь этого. Все команды с параметрами можно мысленно разбить на части, что упрощает просмотр.

 

Если текст в текстовых редакторах меняется, то обычно при выходе программа делает запрос на сохранение измененных данных. Если ответить "Да", то файл сохраняется. Если файл новый и не был ни разу сохранен, то будет предложен диалог сохранения файла под именем, или проще "Сохранить как...". Если ответить "Нет", то файл (окно) закроется без сохранения. Если нажать "Отмена", то ничего с окном не произойдет и пользователь продолжит редактирование.

Для окон есть событие OnCloseQuery, которое следует применять именно в этих случаях. Оно вызывается именно тогда, когда пользователь пытается закрыть окно и в качестве вносимого параметра CanClose определяет, может ли продолжаться закрытие окна или нет.

У каждого компонента в Delphi есть свойство Tag. Оно имеет тип Integer и является свойством, которым пользуются только программисты. Tag в программе ни на что не влияет. По умолчанию принимает нулевое значение.

В нашей программе я предлагаю использовать его для флага состояния редактирования. Если текст изменяется, то он в последствии подлежит запросу на сохранение.

Если свойство Tag для компонента Memo1 установлен в 0, то файл закрывается без запросов, иначе - 1.

 

Событие OnChange для компонента Memo1:

 

procedure TChildForm.Memo1Change(Sender: TObject);
begin
Memo1.Tag:=1; // Текст изменен и подлежит запросу на сохранение
end;

Тогда нам нужно убрать запрос на сохранение в случае "ручного" сохранения файла, когда пользователь сам выбрал необходимый пункт меню. Изменяем следующие процедуры сохранения файла.

 

Процедура "Открыть"

 

procedure TMainForm.N3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ChildForm:=TChildForm.Create(Self);
ChildForm.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
ChildForm.Caption:=OpenDialog1.FileName;
ChildForm.Memo1.Tag:=0; // добавить
end;
end;

Процедура "Сохранить как..."

 

procedure TMainForm.N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
SaveDialog1.Title:='Сохранить файл как...';
if SaveDialog1.Execute then
begin
(ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile(SaveDialog1.FileName);
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName;
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end;
end;

Процедура "Сохранить"


procedure TMainForm.N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then
N5Click(Sender) else
begin // добавить
(ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile((ActiveMDIChild as TChildForm).Caption);
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end; // добавить
end;

Добавленные строки отделены комментарием "//добавить".

А теперь непосредственно создаем процедуру OnCloseQuery для окна ChildForm.

 

procedure TChildForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
Var Res:Integer; // переменная для хранения результата выбора действия
begin
if Memo1.Tag=0 then // если не сохранять, то 1, иначе - 2
begin // 1:
CanClose:=true; // можно закрыть окно
end else
begin // 2:
Res:=Application.MessageBox('Вы желаете сохранить изменения?','Вопрос',MB_YESNOCANCEL + MB_ICONQUESTION);
// вопрос на сохранение
if Res=IDYES then // нажата кнопка "Да"
begin
ChildForm.BringToFront; // Расположить данное окно выше всех (сделать активным)
MainForm.N4Click(Sender); // Вызвать процедуру "Сохранить"
if Memo1.Tag=1 then CanClose:=false;
// если пользователь все-таки не сохранил файл, то окно не закрывать
end;
if Res=IDNo then CanClose:=true; // если "Нет", то можно закрыть
if Res=IDCANCEL then CanClose:=false; // если "Отмена", то не закрывать
end;
end;

Находясь в редакторе кода в файле ChildUnit необходимо подключить модуль главной формы MainUnit через пункт меню "UseUnit".

 

Аналогом команды MessageBox в Delphi есть команда MessageDLG. Более подробную информацию как по этой, так и по другой можно прочитать в справочной системе. Старайтесь всегда при неизвестных командах пользоваться подсказкой в справочной системе. Надо, чтобы указатель (курсор) находился на интересующем вас слове, и нажать комбинацию клавиш Ctrl+F1.

 

Архив примера текстового редактора с сегодняшними изменениями вы можете забрать тут.

С уважением, ведущий уроков Semen [email protected]

 







Дата добавления: 2015-09-04; просмотров: 298. Нарушение авторских прав; Мы поможем в написании вашей работы!



Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Упражнение Джеффа. Это список вопросов или утверждений, отвечая на которые участник может раскрыть свой внутренний мир перед другими участниками и узнать о других участниках больше...

Влияние первой русской революции 1905-1907 гг. на Казахстан. Революция в России (1905-1907 гг.), дала первый толчок политическому пробуждению трудящихся Казахстана, развитию национально-освободительного рабочего движения против гнета. В Казахстане, находившемся далеко от политических центров Российской империи...

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Примеры решения типовых задач. Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2   Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2. Найдите константу диссоциации кислоты и значение рК. Решение. Подставим данные задачи в уравнение закона разбавления К = a2См/(1 –a) =...

Экспертная оценка как метод психологического исследования Экспертная оценка – диагностический метод измерения, с помощью которого качественные особенности психических явлений получают свое числовое выражение в форме количественных оценок...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия