1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
unit uRecordList;
interface
uses uTypes,Classes,SysUtils;
Type
PTMaStructure = ^TDataRecord;
TMaStructureList = class(TObject)
private
FList:TList;
function GetItem(Index: Integer): TDataRecord;
procedure SetItem(Index: Integer; const Value: TDataRecord);
function GetCount: Integer;
procedure SetCount(const Value: Integer);
protected
public
constructor Create;
destructor Destroy; override;
function Add(Item:TDataRecord): Integer;
procedure Delete(Index: Integer);
procedure Insert(Index: Integer; Item: TDataRecord);
procedure Move(CurIndex, NewIndex: Integer);
procedure Exchange(Index1, Index2: Integer);
procedure Clear;
function IndexOf(const Value: TDataRecord): Integer;
property Items[Index:Integer]:TDataRecord read GetItem write SetItem;default;
property Count: Integer read GetCount write SetCount;
end;
implementation
{ TMaStructureList }
function TMaStructureList.Add(Item:TDataRecord): Integer;
var
p:PTMaStructure;
begin
GetMem(p,SizeOf(Item));
p^ := Item;
result := FList.Add(p);
end;
procedure TMaStructureList.Clear;
var
i:integer;
begin
for i := 0 to FList.Count-1 do FreeMem(FList[i]);
FList.Clear;
end;
constructor TMaStructureList.Create;
begin
FList := TList.Create;
end;
procedure TMaStructureList.Delete(Index: Integer);
begin
FreeMem(FList[Index]);
FList.Delete(Index);
end;
destructor TMaStructureList.Destroy;
begin
Clear;
FList.Free;
inherited;
end;
procedure TMaStructureList.Exchange(Index1, Index2: Integer);
begin
FList.Exchange(Index1, Index2);
end;
function TMaStructureList.GetCount: Integer;
begin
result := FList.Count;
end;
function TMaStructureList.GetItem(Index: Integer): TDataRecord;
begin
result := PTMaStructure(FList[Index])^;
end;
function TMaStructureList.IndexOf(const Value: TDataRecord): Integer;
var i: Integer;
found:Boolean;
AnItem:TDataRecord;
begin
Result := -1;
found:=False;
i:=0;
while ((i<FList.Count) and (not found)) do
begin
AnItem:=GetItem(i);
found:=CompareMem(@Value,@AnItem,SizeOf(TDataRecord));
if not found then Inc(i);
end;
if found then Result:=i;
end;
procedure TMaStructureList.Insert(Index: Integer; Item: TDataRecord);
var
p: PTMaStructure;
begin
GetMem(p, SizeOf(Item));
p^ := Item;
FList.Insert(Index, p);
end;
procedure TMaStructureList.Move(CurIndex, NewIndex: Integer);
begin
FList.Move(CurIndex, NewIndex);
end;
procedure TMaStructureList.SetCount(const Value: Integer);
var
i, ListCount: Integer;
p: PTMaStructure;
begin
if FList.Count = Value then
Exit
else
if Value < FList.Count then
begin
ListCount := FList.Count;
for i := ListCount downto Value+1 do
begin
FList.Delete(i);
end;
end else
if FList.Count < Value then
begin
for i := FList.Count+1 to Value do
begin
GetMem(p, SizeOf(TDataRecord));
FillChar(p^, SizeOf(TDataRecord), 0);
FList.Add(p);
end;
end;
end;
procedure TMaStructureList.SetItem(Index: Integer; const Value: TDataRecord);
begin
PTMaStructure(FList[Index])^ := value;
end;
end. |
Partager