⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lru_mm.pas

📁 用于制作和整理(文件搜索方式)编程技术文档和各类源代码, 可以如编程工具一样分色显示程序(C++, Delphi , java, Vb, SQL ……)(用算法实现), 主要用于查找相应的类和函数
💻 PAS
字号:
unit Lru_mm;

{*******************************************************************}
{                                                                   }
{       Support: xcwen@sina.com                                     }
{                                                                   }
{      finish 2005-12-23                                            }
{*******************************************************************}
interface
  uses Menus,windows, messages,inifiles,SysUtils;

const WM_MIOnClick=Wm_user+$200;
  type
   TMIStr = class(TMenuItem)
  private
    FStr:string;
    procedure SetStr(s:string);
   public
   property Str:string  read FStr write setstr;
  end;


 //
 type TLruMm =class

 private
    FDestHandle:THandle;
    FParentMI :TMenuItem;//
    FMaxItem:integer; //最大的数目
    FShowFristItem:boolean;
    procedure SetMaxItem(MaxItem:integer);


 protected
               
 public

   constructor Create(DestHandle:THandle;ParentMI:TmenuItem;
   MaxItem:integer ;showFristItem:boolean=false);
   destructor Destroy; override;
   function GetCurrentStr(var s:string):boolean;
   function GetDeleteIndex(s:string):integer;
   procedure MIOnClick(Sender: TObject);
   procedure AddMI(S:string);
   function  DeleteMI(const index: integer):boolean;overload;
   function  DeleteMI(const s:string):boolean;overload;
   function LoadFromIniFile(filename:string):boolean;
   procedure  SaveToIniFile(filename:string);
   property MaxItem:integer read  Fmaxitem write setMaxItem;
   property ShowFristitem:boolean  read FShowFristitem write FShowFristitem;
 end;
implementation

{ TLruMm }


procedure TLruMm.AddMI(S: string);
var newMIStr:TMIStr;
begin
    self.DeleteMI(self.GetDeleteIndex(s));

    newMIStr:=TMIStr.Create(self.FParentMI);
    newMIStr.Str:=s;
    newMIstr.Visible :=self.FShowFristItem;
    newMIstr.OnClick :=self.MIOnClick;     //事件处理!

    self.FParentMI.Insert (0,newMIStr);
    if self.FParentMI.Count >1 then
    begin
    if self.FShowFristItem=false  then //处
      self.FParentMI.Items[1].Visible :=true ;
     end;
end;

constructor TLruMm.Create(DestHandle:THandle;ParentMI: TmenuItem;
 MaxItem: integer;showFristItem:boolean);
begin
inherited create;
self.FDestHandle :=DestHandle;
self.FParentMI :=ParentMI;
self.FMaxItem :=Maxitem;
self.FShowFristItem :=showFristItem;
end;

function TLruMm.DeleteMI(const index: integer):boolean;
begin
  if  (index>=0) and (index< self.FParentMI.Count)then
  begin
    self.FParentMI.Delete(index);
    result:=true;
  end
  else
  begin
      result:=false;
  end;
end;

function TLruMm.DeleteMI(const s: string): boolean;
var i:integer;
begin
  i:=self.GetDeleteIndex(s) ;
  if i<>-1 then
  begin
  self.DeleteMI(i) ;
  result:=true;
  end
  else
    result:=false;
end;

destructor TLruMm.Destroy;
begin

  inherited;
end;

function TLruMm.GetCurrentStr(var s: string): boolean;
begin
 if self.FParentMI.Count>0 then
 begin
   s:=(self.FParentMI.Items[0]as TMIStr).Str ;
   result:=true;
 end
 else
 begin
   s:='';
   result:=false;
 end;
end;

function TLruMm.GetDeleteIndex(s: string): integer;
var i:integer;
begin
  result:=-1;
  for i:=0 to self.FParentMI.Count-1 do
  begin
     if( self.FParentMI.Items[i] is TMIStr  ) then
     begin
       if(self.FParentMI.Items[i] as TMIStr).Str=s then
       begin
         result:=i;
       end
     end;
  end;
  if (result=-1)  and (self.FParentMI.Count=self.FMaxItem )  then
  //如果没有找到以及可用的空间没有了
  begin
     result:=self.FParentMI.Count-1;
  end;

end;

function TLruMm.LoadFromIniFile(filename: string): boolean;
 var  IniFile:TIniFile;
 var count,i:integer;
begin
if fileExists(filename) then
begin
  IniFile:=TIniFile.Create(filename);
try
  self.FShowFristItem :=inifile.ReadBool('lastfileCfg','showFristItem',true) ;
  self.FMaxItem:=inifile.ReadInteger('lastfileCfg','maxitem',10);
   Count:=inifile.ReadInteger('lastfileCfg','count',0);
  for i:=Count -1 downto 0  do
  begin
      self.AddMI(inifile.readString('files','file'+inttostr(i),''));
  end;
  finally
  inifile.Free ;
  end;
  result:=true;
end
else
begin
  result:=false;
end;

end;

procedure TLruMm.MIOnClick(Sender: TObject);
var i:integer;
var item:Tmenuitem;
begin
 for i:=0 to self.FParentMI.Count -1  do
 begin
   if self.FParentMI.Items[i].Handle =(sender as TmenuItem).Handle  then
   begin
      //self.FParentMI.
      item:=self.FParentMI.Items[i];
      item.Visible :=self.FShowFristItem ;
      self.FParentMI.Delete(i);
      self.FParentMI.Insert(0,item);

      if self.FParentMI.Count >1 then
      begin
        if self.FShowFristItem=false  then //处
        self.FParentMI.Items[1].Visible :=true ;
      end;
      postmessage(self.FDestHandle, WM_MIOnClick,0,0);
      break;
   end;
 end;
 
end;

procedure TLruMm.SaveToIniFile(filename: string);
 var  IniFile:TIniFile;
 var i:integer;
begin
  IniFile:=TIniFile.Create(filename);
try
  inifile.WriteBool('lastfilecfg','showFristItem',self.FShowFristItem);
  inifile.WriteInteger('lastfilecfg','maxitem',self.FMaxItem );
  inifile.WriteInteger('lastfilecfg','count',self.FParentMI.Count);

  for i:=0 to self.FParentMI.Count -1 do
  begin
     inifile.WriteString('files','file'+inttostr(i),
      (self.FParentMI[i]as TMIstr).Str);
  end;
  finally
  inifile.Free ;
  end;
end;

procedure TLruMm.SetMaxItem(MaxItem: integer);
begin
  if maxItem >-1 then
  begin
    //清除多余的项
    while self.FParentMI.Count >maxItem do
      self.FParentMI.Delete(self.FParentMI.Count -1);
    self.FMaxItem :=maxItem;

  end;
end;

{ TMIStr }

procedure TMIStr.SetStr(s: string);
begin
self.FStr:=s;
self.Caption :=s;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -