MMLLst.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MMLLst;
  2. {$I COMPILER.INC}
  3. interface
  4. uses
  5.     Windows,
  6.     SysUtils,
  7.     Classes;
  8. // Creates a list
  9. function  List_Create(dwNodeSize: DWORD): THandle;
  10. // Destroys a list
  11. procedure List_Destroy(hList: THandle);
  12. // Allocates a new node for a list
  13. function  List_Allocate(hList: THandle): THandle;
  14. // Destroys a list
  15. procedure List_Deallocate(hNode: THandle);
  16. // Attaches a node to the list.
  17. procedure List_Attach(hList, hNode: THandle);
  18. // Attaches a node to the end of the list.
  19. procedure List_Attach_Tail(hList, hNode: THandle);
  20. // Inserts a node into a list.
  21. procedure List_Insert(hList, hNode, hNodeAfter: Thandle);
  22. // Removes a node from the list.
  23. function  List_Remove(hList, hNode: THandle): Boolean;
  24. // Removes the first node in list.
  25. function  List_Remove_First(hList: THandle): THandle;
  26. // Returns the address of the first node.
  27. function  List_Get_First(hList: THandle): THandle;
  28. // Returns the address of next node in the list.
  29. function  List_Get_Next(hList, hNode: THandle): THandle;
  30. implementation
  31. type
  32.     TMyList = class(TList)
  33.     public
  34.        Tag: integer;
  35.     end;
  36. {-- Creates a list ------------------------------------------------------------}
  37. function List_Create(dwNodeSize: DWORD): THandle;
  38. var
  39.    P: TMyList;
  40. begin
  41.    P := TMyList.Create;
  42.    P.Tag := dwNodeSize;
  43.    Result := THandle(P);
  44. end;
  45. {-- Destroys a list -----------------------------------------------------------}
  46. procedure List_Destroy(hList: THandle);
  47. begin
  48.    if (hList <> 0) then
  49.    begin
  50.       TMyList(hList).Free;
  51.    end;
  52. end;
  53. {-- Allocates a new node for a list -------------------------------------------}
  54. function List_Allocate(hList: THandle): THandle;
  55. var
  56.    P: Pointer;
  57. begin
  58.    P := nil;
  59.    if (hList <> 0) then
  60.        GetMem(P,TMyList(hList).Tag);
  61.    Result := THandle(P);
  62. end;
  63. {-- Destroys a list -----------------------------------------------------------}
  64. procedure List_Deallocate(hNode: THandle);
  65. begin
  66.    if (hNode <> 0) then
  67.    begin
  68.       FreeMem(Pointer(hNode));
  69.    end;
  70. end;
  71. {-- Attaches a node to the list -----------------------------------------------}
  72. procedure List_Attach(hList, hNode: THandle);
  73. begin
  74.    if (hList <> 0) and (hNode <> 0) then
  75.    begin
  76.       TMyList(hList).Insert(0,Pointer(hNode));
  77.    end;
  78. end;
  79. {-- Attaches a node to the end of the list ------------------------------------}
  80. procedure List_Attach_Tail(hList, hNode: THandle);
  81. begin
  82.    if (hList <> 0) and (hNode <> 0) then
  83.    begin
  84.       TMyList(hList).Add(Pointer(hNode));
  85.    end;
  86. end;
  87. {-- Inserts a node into a list ------------------------------------------------}
  88. procedure List_Insert(hList, hNode, hNodeAfter: Thandle);
  89. var
  90.    idx: integer;
  91. begin
  92.    if (hList <> 0) and (hNode <> 0) then
  93.    begin
  94.       idx := TMyList(hList).IndexOf(Pointer(hNodeAfter));
  95.       TMyList(hList).Insert(idx,Pointer(hNode));
  96.    end;
  97. end;
  98. {-- Removes a node from the list ----------------------------------------------}
  99. function List_Remove(hList, hNode: THandle): Boolean;
  100. begin
  101.    Result := False;
  102.    if (hList <> 0) and (hNode <> 0) then
  103.    begin
  104.       if (TMyList(hList).IndexOf(Pointer(hNode)) >= 0) then
  105.           Result := TMyList(hList).Remove(Pointer(hNode)) >= 0;
  106.    end;
  107. end;
  108. {-- Removes the first node in list --------------------------------------------}
  109. function List_Remove_First(hList: THandle): THandle;
  110. begin
  111.    Result := 0;
  112.    if (hList <> 0) then
  113.    begin
  114.       if (TMyList(hList).Count > 0) then
  115.       begin
  116.          Result := THandle(TMyList(hList).First);
  117.          TMyList(hList).Delete(0);
  118.       end;
  119.    end;
  120. end;
  121. {-- Returns the address of the first node -------------------------------------}
  122. function List_Get_First(hList: THandle): THandle;
  123. begin
  124.    Result := 0;
  125.    if (hList <> 0) then
  126.    begin
  127.       if (TMyList(hList).Count > 0) then
  128.           Result := THandle(TMyList(hList).First);
  129.    end;
  130. end;
  131. {-- Returns the address of next node in the list ------------------------------}
  132. function List_Get_Next(hList, hNode: THandle): THandle;
  133. var
  134.    idx: integer;
  135. begin
  136.    Result := 0;
  137.    if (hList <> 0) then
  138.    begin
  139.       idx := TMyList(hList).IndexOf(Pointer(hNode));
  140.       if (idx >= 0) and (idx+1 < TMyList(hList).Count) then
  141.          Result := THandle(TMyList(hList)[idx+1]);
  142.    end;
  143. end;
  144. end.