While in the later versions of Delphi we can simply use a generic TList<TMethod> in the earlier versions of Delphi (like Delphi 6 which I am using) we need to override the base TList class to accommodate the methods and implement a TMethodList container. This method list is based on the multicast event handler outlined here: http://delphi.about.com/library/weekly/aa051005a.htm
The most important part of the class is assigning the TMethod to a pointer.
First we create a pointer to a TMethod
type
PMethod = ^TMethod;
When adding the TMehod to the list we copy the .Data and .Code to the newly created Pointer
Result := New( PMethod );
Result^.Code := AItem.Code;
Result^.Data := AItem.Data;
Later we will need to Dispose of the memory
if ( Action = lnDeleted ) then begin
Dispose( Ptr );
end;
The whole class:
{******************************************************************************}
{ }
{ Unit: ssMethodList.pas }
{ Summerswell Core }
{ }
{ Copyright (C) 2013 Summerswell }
{ }
{ Author : bvonfintel }
{ Original : 2013/09/13 11:23:02 AM }
{ }
{******************************************************************************}
unit ssMethodList;
interface
uses
Classes;
type
// *** -------------------------------------------------------------------------
// *** CLASS: TssMethodList
// *** -------------------------------------------------------------------------
TssMethodList = class( TList )
protected
procedure Put( AIndex: Integer; AItem: TMethod );
function Get( AIndex: Integer ): TMethod;
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
public
function Add( AItem: TMethod ): Integer;
property Items[Index: Integer]: TMethod read Get write Put; default;
end;
implementation
type
PMethod = ^TMethod;
{-------------------------------------------------------------------------------
Procedure: CreatePMethod
Author: bvonfintel
DateTime: 2013.09.13
Arguments: AItem: TMethod
Result: PMethod
-------------------------------------------------------------------------------}
function CreatePMethod( AItem: TMethod ): PMethod;
begin
Result := New( PMethod );
Result^.Code := AItem.Code;
Result^.Data := AItem.Data;
end;
{ TssMethodList }
{-------------------------------------------------------------------------------
Procedure: TssMethodList.Add
Author: bvonfintel
DateTime: 2013.09.13
Arguments: AItem: TMethod
Result: Integer
-------------------------------------------------------------------------------}
function TssMethodList.Add(AItem: TMethod): Integer;
begin
Result := inherited Add( CreatePMethod( AItem ) );
end;
{-------------------------------------------------------------------------------
Procedure: TssMethodList.Get
Author: bvonfintel
DateTime: 2013.09.13
Arguments: AIndex: Integer
Result: TMethod
-------------------------------------------------------------------------------}
function TssMethodList.Get(AIndex: Integer): TMethod;
begin
Result := TMethod( inherited Get( AIndex )^ );
end;
{-------------------------------------------------------------------------------
Procedure: TssMethodList.Notify
Author: bvonfintel
DateTime: 2013.09.13
Arguments: Ptr: Pointer; Action: TListNotification
Result: None
-------------------------------------------------------------------------------}
procedure TssMethodList.Notify(Ptr: Pointer; Action: TListNotification);
begin
inherited;
if ( Action = lnDeleted ) then begin
Dispose( Ptr );
end;
end;
{-------------------------------------------------------------------------------
Procedure: TssMethodList.Put
Author: bvonfintel
DateTime: 2013.09.13
Arguments: AIndex: Integer; AItem: TMethod
Result: None
-------------------------------------------------------------------------------}
procedure TssMethodList.Put(AIndex: Integer; AItem: TMethod);
begin
inherited Put( AIndex, CreatePMethod( AItem ) );
end;
end.