📄 lru_mm.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 + -