我需要存储一个临时的记录列表,并认为TList将是一个很好的方法来做到这一点?但是我不确定如何做到这一点与TList,并想知道这是否是最好的,如果任何人有任何例子如何做到这一点?
解决方法
最简单的方法是创建您自己的TList的后代。以下是一个简单的示例控制台应用程序:
- program Project1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,Classes;
- type
- PMyRec=^TMyRec;
- TMyRec=record
- Value: Integer;
- AByte: Byte;
- end;
- TMyRecList=class(TList)
- private
- function Get(Index: Integer): PMyRec;
- public
- destructor Destroy; override;
- function Add(Value: PMyRec): Integer;
- property Items[Index: Integer]: PMyRec read Get; default;
- end;
- { TMyRecList }
- function TMyRecList.Add(Value: PMyRec): Integer;
- begin
- Result := inherited Add(Value);
- end;
- destructor TMyRecList.Destroy;
- var
- i: Integer;
- begin
- for i := 0 to Count - 1 do
- FreeMem(Items[i]);
- inherited;
- end;
- function TMyRecList.Get(Index: Integer): PMyRec;
- begin
- Result := PMyRec(inherited Get(Index));
- end;
- var
- MyRecList: TMyRecList;
- MyRec: PMyRec;
- tmp: Integer;
- begin
- MyRecList := TMyRecList.Create;
- for tmp := 0 to 9 do
- begin
- GetMem(MyRec,SizeOf(TMyRec));
- MyRec.Value := tmp;
- MyRec.AByte := Byte(tmp);
- MyRecList.Add(MyRec);
- end;
- for tmp := 0 to MyRecList.Count - 1 do
- Writeln('Value: ',MyRecList[tmp].Value,' AByte: ',MyRecList[tmp].AByte);
- WriteLn(' Press Enter to free the list');
- ReadLn;
- MyRecList.Free;
- end.
这消除了一些东西:
>它处理释放内存。
>你不必打破一切,使用它。
正如雷米和沃伦都说,这是一个更多的工作,因为你必须分配内存,当你添加新的记录。