Title: How to maintain a list of recently used files in a TMainMenu
unit UnitRecentList;
interface
uses Windows, SysUtils, menus, Registry, Forms, Dialogs, Classes;
type
TOnClickPorc = procedure(Path : string) of object;
type
TRecentList = class(TObject)
private
Regis: TRegistryIniFile;
Count: integer;
Parent: TForm;
MainMenu: TMainMenu;
Items: TStringList;
AddPos: integer;
ClickProc: TOnClickPorc;
Ident: integer;
public
// Key : Porduktname zum Beispiel "SuperSoftware"
// Count : Anzahl der angezeigten MenuItems
// MainMenu : Das MainMenu auf dem Formular in dem angezeigt werden soll
// Parent : Das Parent Formular vom MainMenu (z.B. Form1)
// Proc : Prozedur, die ausgef¨¹rt werden soll, wenn auf ein MenuItem geklickt wird.
// z. B. "Procedure TForm1.RecentListClick(FileName : string);"
constructor Create(Key : string; Count, MenuIndex : integer;
MainMenu : TMainMenu; Parent : TForm;
Proc : TOnClickPorc);
destructor Destroy; override;
procedure CustomItemAdd(Value : string);
procedure ItemsToMenu;
procedure ItemClick(Sender : TObject);
end;
implementation
constructor TRecentList.Create(Key : string; Count, MenuIndex : integer;
MainMenu : TMainMenu; Parent : TForm;
Proc : TOnClickPorc);
var
I : integer;
NewItem : TMenuItem;
begin
// Initialisieren
Items := TStringList.Create;
// Klasseneigenschaften setzen
Self.Count := Count;
Self.Parent := Parent;
Self.MainMenu := MainMenu;
Self.Ident := MenuIndex;
AddPos := MainMenu.Items[Ident].Count + 1;
// ¨¹bergebene Prozedur gleich der der lokalen "ClickPorc" setzen
ClickProc := Proc;
// TRegistryIniFile instanzieren
Regis := TRegistryIniFile.Create('Software\' + Key);
// Trennstrisch realisieren
NewItem := TMenuItem.Create(Parent);
NewItem.Caption := '-';
MainMenu.Items[Ident].Add(NewItem);
// ¨¹ber Schliefe alles einlesen
for i := 0 to Count - 1 do CustomItemAdd(Regis.ReadString('RecentFiles',
'Item' + IntToStr(i) + IntToStr(Ident), ''));
end;
procedure TRecentList.ItemsToMenu;
var
NewItem : TMenuItem;
I : integer;
begin
// Beim ersten mal "count" MenuItems erstellen
if MainMenu.Items[Ident].Count = AddPos then
for i := 0 to Count - 1 do
begin
NewItem := TMenuItem.Create(Parent);
NewItem.Caption := '';
NewItem.OnClick := ItemClick;
MainMenu.Items[Ident].Add(NewItem);
end;
// Die Liste "Items" duchgehen und die MenuItems danach benennen
for I := 0 to Items.Count - 1 do
MainMenu.Items[Ident][i + AddPos].Caption := Items[i];
// Dei leeren Eintr?ge unsichtbar machen die vollen sichtbar
for I := 0 to Count - 1 do
MainMenu.Items[Ident][i + AddPos].Visible :=
not (MainMenu.Items[Ident][i + AddPos].Caption = '');
if Items.Count = 0 then MainMenu.Items[Ident][AddPos - 1].Visible := False
else
MainMenu.Items[Ident][AddPos - 1].Visible := True;
end;
procedure TRecentList.ItemClick(Sender : TObject);
begin
ClickProc((Sender as TMenuItem).Caption);
end;
procedure TRecentlIst.CustomItemAdd(Value : string);
var
i : integer;
begin
// Pr¨¹fen
if Length(Value) = 0 then
begin
ItemsToMenu;
Exit;
end;
// Testen, ob "Value" schon vorkommt
for i := 0 to Items.Count - 1 do
if (Items[i] = Value) then
begin
Items.Delete(i);
Break;
end;
// Items.Delete(i);
// Eintrag anh?ngen
Items.Insert(0, Value);
// Wenn Liste voll, dann letztes rausschmeissen
if Items.Count Count then
begin
//For i := 1 to Items.Count - 1 do Items[ i - 1 ] := Items[ i ];
Items.Delete(Items.Count - 1);
end;
// Anzeige aktuallisieren
ItemsToMenu;
end;
// FreeAndNil(TRecentList) bei OnClose nicht vergessen
destructor TRecentList.Destroy;
var
i : integer;
begin
// DAten in der Registry speichern
for i := 0 to Items.Count - 1 do
Regis.WriteString('RecentFiles', 'Item' + IntToStr(I) + IntToStr(Ident), Items[i]);
// Speicherleichen ausradieren
Regis.Free;
end;
end.
{ Und so instanziert man die Klasse: }
// Createn
// 1. Parameter : Registry Schl¨¹ssel
// 2. Parameter : Anzal der Eintr?ge in der RecentList
// 3. Parameter : Nummer des Men¨¹Items unter das die RecentList kommen soll (meistens 0)
// 4. Parameter : Das Menu, in die die Recentlist eingef¨¹gt werden soll
// 5. Parameter : Das Formular, in dem sich das Menu befindet
// 6. Parameter : Die Procedure, die ausgef¨¹hrt werden soll, wenn auf einen Eintrag
// in der Recentlist gecklickt wird.
procedure TForm1.FormCreate(Sender: TObject);
begin
RecentList.Create('SuperSoftware', 5, 0, MainMenu1, Self, Click);
end;
// Die Procedure wird ausgef¨¹hrt, wenn auf einen Eintrag in der
// RecentList gecklickt wird.
// "Value" ist der Dateiname
procedure TForm1.Click(FilePath: string );
begin
DateiOeffnen(FilePath);
end;
// Einen Eintrag in die Rechenlist vorhehmen
procedure TForm1.Button1Click(Sender: TObject);
begin
RecentList.CustomItemAdd(Edit1.Text);
end;
// nicht vergessen, sonst werden die ?nderungen nicht gespeichert
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(RecentList);
end;