скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Недавно использовавшиеся файлы в главном меню



Оформил: DeeCo

{ 
  Die folgende Unit enthalt eine Klasse, die eine 
  RecentListe in ein TMainMenu einfugt. 
}

 { 
  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 : 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 ausgefurt 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;

   // Ubergebene 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);

   // uber 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 Eintrage 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
   // Prufen 
  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 anhangen 
  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 Schlussel 
// 2. Parameter : Anzal der Eintrage in der RecentList 
// 3. Parameter : Nummer des MenuItems unter das die RecentList kommen soll (meistens 0) 
// 4. Parameter : Das Menu, in die die Recentlist eingefugt werden soll 
// 5. Parameter : Das Formular, in dem sich das Menu befindet 
// 6. Parameter : Die Procedure, die ausgefuhrt 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 ausgefuhrt, 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 Anderungen nicht gespeichert 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
  FreeAndNil(RecentList);
 end;


 // von Sven Laufersweiler & Phillip Kroll 





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook