我想为TStringList.Objects分配一条记录

时间:2008-12-14 23:06:30

标签: delphi

我想创建一个播放列表控件。我有很多信息要显示在TStringList中。我想将记录分配给TStringGrid.Objects而不是对象,因为这么多对象可能需要一段时间才能创建/销毁。它也需要大量的RAM。

记录会更快更轻薄。 我怎么能这样做?

TYPE
 AMyRec= packed record
        FullName     : string[255];    
        RelativePath : boolean;        
        IsInvalid    : boolean;        
        InCache      : boolean;        
        etc
       end;

5 个答案:

答案 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)

您确定愿意分配所有这些对象吗?通过查看记录结构,您看起来每行需要一个对象 - 而不是每个单元格。要做到这一点,你至少有两个选择:

  1. (我最喜欢的是它提供的自由)您使用TDrawGrid代替并手动绘制单元格的内容。这真的不是那么难!
  2. 您创建一个封装此记录的对象。这也很简单,例如:
  3. 
    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,因此有大量关于如何使用它的示例),您将为您和您的客户节省很多挫折,记忆而且最重要的是。

答案 3 :(得分: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;

答案 4 :(得分:0)

为记录分配内存也需要时间。

创建记录并将指针放在stringlist中。