unit UMenu1;

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    OpenDialog: TMenuItem;
    Save: TMenuItem;
    SaveAs: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    RichEdit1: TRichEdit;
    procedure OpenDialogClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SaveAsClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure SaveClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  TFileOld = class(TMenuItem)
   Procedure Click(); override;
  end;

var SFile: AnsiString = 'Неизвестный';
    NFileMen: word;
    NFiles: word = 10;
    TmpItem: TFileOld;

procedure TFileOld.Click();
begin
 Form1.RichEdit1.Lines.LoadFromFile(Caption);
end;

procedure FileToMenu(Dialog:TOpenDialog);
begin
 with Form1 do begin
  // Сохранение имени в SFile
  SFile := Dialog.FileName;
  // Удаление раздела, соответствующего тому же файлу
  if (MainMenu1.Items[0].Find(SFile) <> nil)
   then MainMenu1.Items[0].Find(SFile).Free;
  // Создание нового раздела
  TmpItem := TFileOld.Create(MainMenu1);
  TmpItem.Caption := SFile;
  // Вставка в меню нового раздела
  MainMenu1.Items[0].Insert(NFileMen,TmpItem);
  // Если список переполнен, удаление последнего раздела
  if(MainMenu1.Items[0].Count > NFileMen + NFiles + 2)
    then MainMenu1.Items[0].Items[NFileMen+NFiles].Free;
 end;
end;

procedure TForm1.OpenDialogClick(Sender: TObject);
begin
 if OpenDialog1.Execute
 then begin
  FileToMenu(OpenDialog1);
  RichEdit1.Lines.LoadFromFile(SFile);
 end;
end;

procedure TForm1.SaveClick(Sender: TObject);
begin
if (SFile = 'Неизвестный')
 then SaveAsClick(Sender)
 else RichEdit1.Lines.SaveToFile(SFile);
end;

procedure TForm1.SaveAsClick(Sender: TObject);
begin
SaveDialog1.FileName := SFile;
if SaveDialog1.Execute
 then begin
  if (SFile <> SaveDialog1.FileName) then
                                       FileToMenu(SaveDialog1);
  SFile := SaveDialog1.FileName;
  RichEdit1.Lines.SaveToFile(SFile);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var List: TStringList;
    i: word;
begin
 NFileMen := MainMenu1.Items[0].Count - 2;
 if FileExists('Menu.cfg')
  then begin
   List := TStringList.Create;
   List.LoadFromFile('Menu.cfg');
   for i := 0 to List.Count-1 do
   begin
    TmpItem := TFileOld.Create(MainMenu1);
    TmpItem.Caption := List.Strings[i];
    MainMenu1.Items[0].Insert(NFileMen,TmpItem);
   end;
   List.Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var List: TStringList;
    i: word;
begin
 List := TStringList.Create;
 for i := MainMenu1.Items[0].Count-3 downto NFileMen  do
   List.Add(MainMenu1.Items[0].Items[i].Caption);
 List.SaveToFile(ExtractFileDir(ParamStr(0))+'\Menu.cfg');
 List.Free;
end;

end.
