whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

92 Visitors Online


 
...maintain a list of recently used files in a TMainMenu?
Autor: Phillip Kroll
Homepage: www.krollsoft.de
[ Print tip ]  

Tip Rating (2):  
     


{
  Die folgende Unit enthält eine Klasse, die eine
  RecentListe in ein TMainMenu einfügt.
}

{
  This unit contains a class to add a
  RecentList in a TMainMenu.
}

unit UnitRecentList;

interface

uses 
Windows, SysUtils, menus, Registry, Forms, Dialogs, Classes;

type
  
TOnClickPorc = procedure(Path : stringof 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;


// von Sven Laufersweiler & Phillip Kroll


 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners