RSS

Главное меню, диалоги открытия и сохранения файлов в Delphi. Блокнот v1.1. Часть 2

Приступим к программированию пунктов меню Открыть, Сохранить, Сохранить как…, Выход.

Нам понадобится общая переменная fFilePath типа String для всех процедур, которая будет хранить полный путь к открытому файлу. Опишем ее в разделе var перед ключевым словом implementation следующим образом :

Такой способ описания позволяет сразу «обнулить» нашу переменную.

Теперь опишем процедуру открытия файла с помощью диалога выбора файла. Для этого на форме в режиме разработки, щелкните по Файл-Открыть

После чего откроется редактор кода с созданной процедурой TForm1.fOpenClick

В нее необходимо поместить следующий код:

if fOpenDialog.Execute then
     begin
         fFilePath:=fOpenDialog.FileName;
         txt.Lines.LoadFromFile(fFilePath);
     end;

Функция Execute диалога fOpenDialog открывает окно выбора файла. При выборе файла и нажатия кнопки Открыть, функция возвращает True, если нажата кнопка Отмена, то false. Обратите внимание, диалог вызывается с использование условия if, т.е. мы проверяем результат выполнения Execute.Если результат Истина, то мы продолжаем открытие файла, если Иначе, то ничего не происходит. Если не сделать такую проверку, диалог сработает при выборе файла, но если пользователь откажется открывать файл и нажмет Отмена, выскочит ошибка т.к. txt.Lines.LoadFromFile попытается открыть файл, который не выбран.

В данной процедуре мы присваиваем переменной fFilePath, полный путь к выбранному файлу вида «x:\mytxt\txtFile.txt», который возвращает функция FileName диалога fOpenDialog и загружаем текст в txt.

Вот и все открытие файла.

Далее пункт «Сохранить как…».

Так же кликаем по данному пункту и в созданной процедуре TForm1.fSaveAsClick пишем код:

if fFilePath=» then fsavedialog.FileName:=’Новый документ.txt’
else fsavedialog.FileName:=fFilePath;

   if fSaveDialog.Execute then
     begin

       if extractfileext(fSaveDialog.FileName)=» then
          fFilePath:=fSaveDialog.FileName+’.txt’
      else fFilePath:=fSaveDialog.FileName;

      txt.Lines.SaveToFile(fFilePath);
     end;

Эта процедура посложнее. Объясню ее работу:

Первое условие IF это по сути украшение, проверяет переменную fFilePath и если она пуста, то в поле указания имени файла выведет имя по умолчанию «Новый документ.txt». Переменная fFilePath пуста только в том случае, если мы будем создавать документ, а не открывать его для редактирования. Если же переменная fFilePath не пуста, то будет выведено имя файла, который был открыт.

Второе условие IF – выполняет запуск диалога сохранения.

Третье условие IF – проверяет, имеет ли введенное имя файла расширение, если введено просто имя файла без его расширения, то к имени добавляется «.txt». Функция extractfileext извлекает из полного имени файла его расширение. Например, файл «Мой блокнот.txt», функция вернет его расширение «txt». Если не сделать данную проверку и присоединение расширения, то  будет создан файл без указанного расширения, и в системе он будет не опознанным. Если же оставить только присоединение расширения и при этом имя файла будет «Мой блокнот.txt», то к имени будет добавлено еще расширение «txt», в результате получим файл «Мой блокнот.txt.txt».

Теперь пункт «Сохранить». Обратите внимание, во всех редакторах, если создать новый документ и нажать на «Сохранить», то будет открыт диалог «Сохранить как», если же документ открыт для редактирования, то происходит просто сохранение изменений. Реализуем тоже самое в нашем блокноте.

Создаем процедуру TForm1.fSaveClick вышеуказанным способом и пишем следующий код:

if fFilePath=» then fSaveAs.Click
else  txt.Lines.SaveToFile(fFilePath);

т.е. мы проверяем переменную fFilePath, если она пуста, то вызываем процедуру пункта меню «Сохранить как…» — fSaveAs. По сути, мы программно «нажимаем» на пункт меню  «Сохранить как…». Если же файл был открыт, то просто сохраняем изменения в файл.

И последний пункт меню «Выход».

Команда данного пункта проста и однострочна:

form1.Close;

Вот и все!

Вот так выглядит полный листинг нашей программы (по основным пунктам я расставил комментарии). Исходники и скомпилированный проект в прикрепленном архиве.

Полный листинг:

unit exNotepad;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    txt: TMemo;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    fOpen: TMenuItem;
    fSave: TMenuItem;
    fSaveAs: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    fOpenDialog: TOpenDialog;
    fSaveDialog: TSaveDialog;
    procedure fOpenClick(Sender: TObject);
    procedure fSaveAsClick(Sender: TObject);
    procedure fSaveClick(Sender: TObject);
    procedure N3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  fFilePath: string = »;
  
implementation

{$R *.dfm}

procedure TForm1.fOpenClick(Sender: TObject);
begin
     //запуск диалога открытия файла
   if fOpenDialog.Execute then
     begin
      fFilePath:=fOpenDialog.FileName;
      txt.Lines.LoadFromFile(fFilePath);
     end;
end;

procedure TForm1.fSaveAsClick(Sender: TObject);
begin
  //если fFilePath пусто, то выводим имя по умолчанию
   if fFilePath=» then fsavedialog.FileName:=’Новый документ.txt’
   // если fFilePath не пусто
   else fsavedialog.FileName:=fFilePath;

    //запуск диалога сохранения
   if fSaveDialog.Execute then
     begin

        //проверяем есть ли расширенеие у заданного файла
        //если нет, то задаем .txt
       if extractfileext(fSaveDialog.FileName)=» then
          fFilePath:=fSaveDialog.FileName+’.txt’
        //если есть, то оставляем
       else fFilePath:=fSaveDialog.FileName;

      //сохраняем файл
      txt.Lines.SaveToFile(fFilePath);
     end;
end;

procedure TForm1.fSaveClick(Sender: TObject);
begin
   //если fFilePath пуста то открывает диалог сохранения
   if fFilePath=» then fSaveAs.Click
   //иначе просто сохраняем открытый файл
   else  txt.Lines.SaveToFile(fFilePath);
end;

procedure TForm1.N3Click(Sender: TObject);
begin
    form1.Close;
end;

end.

П.С. Для того чтоб при открытии текста, появились полосы прокрутки у объекта Memo (txt) необходимо указать свойство ScrollBars = ssBoth.

 

Прикрепленный файл: exNotepad v1.1.zip