Procedure TChildForm.Memo1Change(Sender
Тогда нам нужно убрать запрос на сохранение в случае "ручного" сохранения файла, когда пользователь сам выбрал необходимый пункт меню. Изменяем следующие процедуры сохранения файла.
Процедура "Открыть"
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 semen@krovatka.net