[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]

{
> How do you add the most recent files accessed to the file menu?

Of course, there's no one answer to this question, but here are some
excerpts from my implementation of that feature, clipped from a text
editor I wrote.

First, I subclassed TStringList to hold the list of recent files.
}

type
  TRecentFileList = class(TStringList)
  public
    constructor Create;
    destructor Destroy; override;
    function Add(const S: String): Integer; override;
    procedure Remove(const s: String);
  end;

Create and Destoy mostly involve reading and writing the list to the
registry, so that the recent file list will be persistent. Add and
Remove are shown below.

function TRecentFileList.Add(const S: String): Integer;
begin
  Result := IndexOf(s);
  if (Result = -1) then begin
    if Count >= MAX_RECENT_FILES then Delete(MAX_RECENT_FILES - 1);
    Insert(0, s); Result := 0;
  end;
end;

procedure TRecentFileList.Remove(const s: String);
var
  i: Integer;
begin
  i := IndexOf(s);
  if i >= 0 then Delete(i);
end;

The main form contains a TRecentFileList called recentFileList. When
the program closes a file it adds it to this list; When it opens
one, it removes it. (As shown, the TRecentFileList is smart
enough not to add a file twice, or to try and delete a non-existant
file.) The OnClick handler for the main menu's "File" menu item,
FileMenuClick, creates a TMenuItem for each recent file in the
list and adds it to the TMenuItem named FileReopenItem before it
opens the menu. Thus the names of the recent files appear in a
submenu to a menu item captioned "Reopen".

procedure TMainForm.FileMenuClick(Sender: TObject);
var
  i: Integer;
  mi: TMenuItem;
begin
  if recentFileList.Count = 0 then FileReopenItem.Enabled := False
  else begin
    FileReopenItem.Enabled := True;
    for i := FileReopenItem.Count - 1 downto 0 do
      FileReopenItem.Delete(i);
    for i := 0 to recentFileList.Count - 1
    do begin
      mi := TMenuItem.Create(Self);
      mi.Caption := recentFileList[i];
      mi.OnClick := FileReopen;
      FileReopenItem.Add(mi);
    end;
  end;
end;

The recent file menu items each have the procedure FileReopen as
their OnClick handler. When the user clicks one of the recent file
menu items, this procedure uses the caption of the clicked item to
determine what file to reopen.

procedure TMainForm.FileReopen(Sender: TObject);
var
  fileName: String;
begin
  fileName := (Sender as TMenuItem).Caption;
  CreateMemoPage.LoadFromFile(fileName);
  recentFileList.Remove(fileName);
end;

[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]