Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Добавить файлы в меню Reopen

Delphi , Файловая система , Файлы

Добавить файлы в меню Reopen

Оформил: DeeCo

Чтобы поместить в конец меню "Файл" список недавно отрывавшихся файлов можно создать список с этими файлами, процедуру обновления меню и процедуру открывания файла.

Список файлов нужно заполнить при запуске программы. Здесь список файлов сохраняется в ini-файл. Процедура открытия файлов помещает название открываемого файла в начало списка с файлами и вызывает процедуру обновления. При закрытии программы список нужно сохранить на диске.

...
public
mi: array[0..9] of TMenuItem;
FilesCount: integer;
Files: TStringList;

procedure UpdateMenu;
  procedure OpenFile(FileName: string);
    procedure OnReopen(Sender: TObject);
end;

...

uses IniFiles;

procedure TForm1.UpdateMenu;
var
  i: integer;
begin
  for i := 0 to FilesCount - 1 do
    mi[i].Destroy;
  FilesCount := Files.Count;
  for i := 0 to FilesCount - 1 do
  begin
    mi[i] := TMenuItem.Create(self);
    mi[i].Caption := Files.Strings[i];
    mi[i].OnClick := OnReopen;
    miFile.Add(mi[i]);
  end;
end;

procedure TForm1.OpenFile(FileName: string);
var
  index: integer;
begin
  Memo1.Lines.LoadFromFile(FileName);

  index := Files.IndexOf(FileName);
  if index <> 0 then
  begin
    if index < 0 then
      Files.Insert(0, FileName)
    else
      Files.Exchange(0, index);
    while Files.Count > 10 do
      Files.Delete(10);
    UpdateMenu;
  end;
end;

procedure TForm1.OnReopen(Sender: TObject);
begin
  OpenFile((Sender as TMenuItem).Caption);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ini: TIniFile;
  i: integer;
begin
  FilesCount := 0;
  Files := TStringList.Create;
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'files.ini');
  ini.ReadSection('files', Files);
  for i := 0 to Files.Count - 1 do
    Files.Strings[i] := ini.ReadString('files',
      Files.Strings[i], '');
  ini.Destroy;
  UpdateMenu;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  ini: TIniFile;
  i: integer;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) +
    'files.ini');
  ini.EraseSection('files');
  for i := 0 to Files.Count - 1 do
    ini.WriteString('files', IntToStr(i),
      Files.Strings[i]);
  ini.Destroy;
  Files.Destroy;
  for i := 0 to FilesCount - 1 do
    mi[i].Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    OpenFile(OpenDialog1.FileName);
end;

Here is the translation of the review into Russian:

Достоинства:

  1. Код хорошо структурирован и организован в процедурах для каждого конкретного задачи.
  2. Он использует компонент IniFile для хранения и загрузки списка最近 открытых файлов, что удобно и легко управляется.
  3. Процедура UpdateMenu эффективно обновляет меню, уничтожая старые элементы и создавая новые.

Рекомендации:

  1. Рассмотрите использование более описательного имени переменной вместо mi для массива TMenuItem. Например, menuItems.
  2. В процедуре OpenFile можно упростить код, используя Files.Add(FileName) для добавления файла в список, а не проверять, существует ли он уже, и затем вставлять или обмениваться его положением.
  3. Может быть полезно добавить обработку ошибок для случаев, когда файл не может быть открыт или прочитан.
  4. Процедура OnReopen довольно проста, но можно рассмотреть переименование ее в что-то более описательное, например, OpenRecentlyOpenedFile.
  5. В процедурах FormCreate и FormDestroy можно объединить код, загружающий и сохраняющий список最近 открытых файлов, в одну процедуру.

Вот обновленная версия кода с некоторыми из этих рекомендаций реализованы:

procedure TForm1.UpdateMenu;
var
  i: integer;
begin
  for i := 0 to Files.Count - 1 do
    menuItems[i].Destroy;
  FilesCount := Files.Count;
  for i := 0 to FilesCount - 1 do
  begin
    menuItems[i] := TMenuItem.Create(self);
    menuItems[i].Caption := Files.Strings[i];
    menuItems[i].OnClick := OnReopen;
    menuFile.Add(menuItems[i]);
  end;
end;

procedure TForm1.OpenFile(FileName: string);
begin
  Memo1.Lines.LoadFromFile(FileName);

  Files.Add(FileName);
  while Files.Count > 10 do
    Files.Delete(10);
  UpdateMenu;
end;

procedure TForm1.OnReopen(Sender: TObject);
begin
  OpenFile((Sender as TMenuItem).Caption);
end;

procedure TForm1.SaveRecentFiles;
var
  ini: TIniFile;
  i: integer;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'files.ini');
  for i := 0 to Files.Count - 1 do
    ini.WriteString('files', IntToStr(i), Files.Strings[i]);
  ini.Destroy;
end;

procedure TForm1.LoadRecentFiles;
var
  ini: TIniFile;
  i: integer;
begin
  Files := TStringList.Create;
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'files.ini');
  ini.ReadSection('files', Files);
  for i := 0 to Files.Count - 1 do
    Files.Strings[i] := ini.ReadString('files', IntToStr(i), '');
  ini.Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadRecentFiles;
  UpdateMenu;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SaveRecentFiles;
  for i := 0 to Files.Count - 1 do
    menuItems[i].Destroy;
  Files.Destroy;
end;

Надеюсь, это поможет! Пожалуйста, не стесняйтесь, если у вас есть вопросы или вам нужна дополнительная помощь.

Добавить файлы в меню "Файл" списка недавно отрывавшихся файлов можно создавая список файлов, процедуру обновления меню и процедуру открывания файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 20:02:27/0.0038940906524658/0