2010年1月5日 星期二

TuList - General purpose container of a list of objects

// General purpose container of a list of objects

ObjList : TuList;
ObjList := TuList.Create();
ObjList.Add(MyObject);

MyObject := ObjList.GetItems(i);
ObjList.Free;

// u_TList.pas

unit u_TList;

interface
uses
      Windows, Classes, SysUtils,
      StdCtrls,
      ch_LogMessages;

type

      TuList = class
        private
          m_List : TList;
        public
          constructor Create();
          destructor Destroy();  override;
          procedure Clear();
          function Count: Integer;
          function Add( Item:Pointer ):Integer;
          function GetItems(Index: Integer): Pointer;
          procedure Sort(Compare: TListSortCompare);
          procedure Delete(Index: Integer);
      end;

implementation

{ TuList }


function TuList.Add(Item: Pointer): Integer;
begin
        Result := m_List.Add(Item);
end;

procedure TuList.Clear;
begin
        m_List.Clear;
end;

function TuList.Count: Integer;
begin
        Result := m_List.Count;
end;

constructor TuList.Create;
begin
        m_List := TList.Create;
end;

procedure TuList.Delete(Index: Integer);
begin
        m_List.Delete(Index);
end;

destructor TuList.Destroy;
begin
        m_List.Free;
        inherited;
end;

function TuList.GetItems(Index: Integer): Pointer;
begin

        if (Index < 0) or (Index >= m_List.Count ) then begin
            Index := 0;
        end;

        Result := m_List.Items[Index];

end;


procedure TuList.Sort(Compare: TListSortCompare);
begin
        m_List.Sort(Compare);
end;

end.

3 則留言:

  1. 最主要是 GetItems, 內鍵的TList 本身沒有做邊界限制,在這裡做擴充

    回覆刪除
  2. C++其實也沒有邊界限制, 不過Delphi的除錯器很神奇的, 當掉時, 居然不是停在 GetItem呼叫的那行, 而是顯示 0xXXXXXXXXXX, 天知道當在那裡, 只好花些時間處理一下.

    回覆刪除
  3. PS:問了寫delphi好幾年的人事, 要怎麼解, 回答:無解, 請在叫用時, 先寫判斷式合法在叫用, 實在不懂為什麼不寫一個函式包起來就好!

    回覆刪除