unit LazMethodList; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type { TMethodList - array of TMethod } TMethodList = class private FItems: ^TMethod; FCount: integer; function GetItems(Index: integer): TMethod; procedure SetItems(Index: integer; const AValue: TMethod); public destructor Destroy; override; function Count: integer; function NextDownIndex(var Index: integer): boolean; function IndexOf(const AMethod: TMethod): integer; procedure Delete(Index: integer); procedure Remove(const AMethod: TMethod); procedure Add(const AMethod: TMethod); procedure Add(const AMethod: TMethod; AsLast: boolean); procedure Insert(Index: integer; const AMethod: TMethod); procedure Move(OldIndex, NewIndex: integer); procedure RemoveAllMethodsOfObject(const AnObject: TObject); procedure CallNotifyEvents(Sender: TObject); public property Items[Index: integer]: TMethod read GetItems write SetItems; default; end; implementation { TMethodList } function TMethodList.GetItems(Index: integer): TMethod; begin Result:=FItems[Index]; end; procedure TMethodList.SetItems(Index: integer; const AValue: TMethod); begin FItems[Index]:=AValue; end; destructor TMethodList.Destroy; begin ReAllocMem(FItems,0); inherited Destroy; end; function TMethodList.Count: integer; begin if Self<>nil then Result:=FCount else Result:=0; end; function TMethodList.NextDownIndex(var Index: integer): boolean; begin if Self<>nil then begin dec(Index); if (Index>=FCount) then Index:=FCount-1; end else Index:=-1; Result:=(Index>=0); end; function TMethodList.IndexOf(const AMethod: TMethod): integer; begin if Self<>nil then begin Result:=FCount-1; while Result>=0 do begin if (FItems[Result].Code=AMethod.Code) and (FItems[Result].Data=AMethod.Data) then exit; dec(Result); end; end else Result:=-1; end; procedure TMethodList.Delete(Index: integer); begin dec(FCount); if FCount>Index then System.Move(FItems[Index+1],FItems[Index],(FCount-Index)*SizeOf(TMethod)); ReAllocMem(FItems,FCount*SizeOf(TMethod)); end; procedure TMethodList.Remove(const AMethod: TMethod); var i: integer; begin if Self<>nil then begin i:=IndexOf(AMethod); if i>=0 then Delete(i); end; end; procedure TMethodList.Add(const AMethod: TMethod); begin inc(FCount); ReAllocMem(FItems,FCount*SizeOf(TMethod)); FItems[FCount-1]:=AMethod; end; procedure TMethodList.Add(const AMethod: TMethod; AsLast: boolean); begin if AsLast then Add(AMethod) else Insert(0,AMethod); end; procedure TMethodList.Insert(Index: integer; const AMethod: TMethod); begin inc(FCount); ReAllocMem(FItems,FCount*SizeOf(TMethod)); if IndexNewIndex then System.Move(FItems[NewIndex],FItems[NewIndex+1], SizeOf(TMethod)*(OldIndex-NewIndex)) else System.Move(FItems[NewIndex+1],FItems[NewIndex], SizeOf(TMethod)*(NewIndex-OldIndex)); FItems[NewIndex]:=MovingMethod; end; procedure TMethodList.RemoveAllMethodsOfObject(const AnObject: TObject); var i: Integer; begin if Self=nil then exit; i:=FCount-1; while i>=0 do begin if TObject(FItems[i].Data)=AnObject then Delete(i); dec(i); end; end; procedure TMethodList.CallNotifyEvents(Sender: TObject); var i: LongInt; begin i:=Count; while NextDownIndex(i) do TNotifyEvent(Items[i])(Sender); end; end.