我想创建一个播放列表控件。我有很多信息要显示在TStringList中。我想将记录分配给TStringGrid.Objects而不是对象,因为这么多对象可能需要一段时间才能创建/销毁。它也需要大量的RAM。
记录会更快更轻薄。 我怎么能这样做?
TYPE
AMyRec= packed record
FullName : string[255];
RelativePath : boolean;
IsInvalid : boolean;
InCache : boolean;
etc
end;
答案 0 :(得分:6)
您可以将TList用于记录的指针。
例如:
Type
PMyrec = ^AMyRec;
使用
var
MyRec : PMyRec;
new(MyRec);
MyRec^.Fullname := 'test';
MyRec^.RelativePath := false;
等
{MyList是您在别处创建的列表}
MyList.Add(MyRec);
您必须处理列表中的项目,例如
Dispose(PMyRec(MyList[Index]));
使用列表中的项目:
var
MyRec : PMyRec;
PMyRec := MyList.Items[i];
txtBox.Text = PMyRec^.Fullname;
等
答案 1 :(得分:1)
你可以使用记录指针。
List.AddObject(MyRecord.FullName, @MyRecord);
答案 2 :(得分:1)
<强>解决强>
我现在尝试过这样的事情(基于KiwiBastard的例子):
Type
AMyRec= packed record
FullName : string[255];
RelativePath : boolean;
IsInvalid : boolean;
end;
PMyrec = ^AMyRec;
procedure TPlaylst.Button1Click(Sender: TObject);
VAR MyRec1: PMyRec;
PlaylistCtrl: TStringGrid;
begin
{SET}
new(MyRec1);
MyRec1^.Fullname := 'test';
MyRec1^.RelativePath := false;
PlaylistCtrl.Objects[1,1]:= Pointer(MyRec1);
{GET}
...
end;
答案 3 :(得分:1)
您确定愿意分配所有这些对象吗?通过查看记录结构,您看起来每行需要一个对象 - 而不是每个单元格。要做到这一点,你至少有两个选择:
type
TMyRec= packed record
FullName : string[255];
RelativePath : boolean;
IsInvalid : boolean;
end;
TMyData = object (TObject)
private
FData: TMRec;
public
constructor Create(AData: TMyRec);
property FullName: String read FData.FullName write FData.FullName;
property RelativePath: Boolean read FData.RelativePath write FData.RelativePath;
property IsInvalid: Boolean read FData.IsInvalid write FData.IsInvalid;
end;
...
constructor TMyData.Create(AData: TMyRec);
begin
FData := AData;
end;
现在,只要您想将数据连接到网格,只需将其打包到该对象中,然后就可以使用Objects集合。
现在不要经历所有麻烦,只需为TDrawGrid.DrawCell创建一个事件处理程序,如
procedure TMainForm.GrdPathsDrawCell(Sender: Object; ...);
使用带有DrawText的GrdPaths.Canvas.Handle,或者如果需要Unicode,请使用DrawTextW(两者都来自Windows API,因此有大量关于如何使用它的示例),您将为您和您的客户节省很多挫折,记忆而且最重要的是。
答案 4 :(得分:0)
为记录分配内存也需要时间。
创建记录并将指针放在stringlist中。