TList后代与另一个对象?

Vla*_*lad -2 delphi delphi-7

我需要实现控件的TList后代+额外的对象.
就像是:

List.Add(AControl, AObject)
Run Code Online (Sandbox Code Playgroud)

因此,名单将同时举行 AControl, AObject

使用Delphi 7执行此操作的最佳方法是什么?

Rem*_*eau 10

您可以存储记录列表,然后您可以将任何您想要的内容放入记录中,例如:

type
  PMyRecord = ^MyRecord;
  MyRecord = record
    Control: TControl;
    Object: TObject;
  end;

var
  Rec: PMyRecord;
begin
  New(Rec);
  try
    Rec.Control := AControl;
    Rec.Object := AObject;
    List.Add(Rec);
  except
    Dispose(Rec);
    Raise;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

var
  Rec: PMyRecord;
begin
  Rec := PMyRecord(List[SomeIndex]);
  // use Rec.Control and Rec.Object as needed...
end;
Run Code Online (Sandbox Code Playgroud)

Dispose()从列表中删除项目时不要忘记:

var
  Rec: PMyRecord;
begin
  Rec := PMyRecord(List[SomeIndex]);
  List.Delete(SomeIndex);
  Dispose(Rec);
end;
Run Code Online (Sandbox Code Playgroud)

当你完成使用列表时,或者至少在你使用Clear()它时:

var
  I: Integer;
  Rec: PMyRecord;
begin
  for I := o to List.Count-1 do
    Dispose(PMyRecord(List[I]));
  //...
end;
Run Code Online (Sandbox Code Playgroud)

如果从中派生新类TList,则可以覆盖其虚拟Notify()方法以处置项:

type
  TMyList = class(TList)
  protected
    function Get(Index: Integer): PMyRecord;
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    function Add(AControl: TControl; AObject: TObject): Integer;
    procedure Insert(Index: Integer; AControl: TControl; AObject: TObject);
    property Items[Index: Integer]: PMyRecord read Get; default;
  end;

function TMyList.Add(AControl: TControl; AObject: TObject): Integer;
var
  Rec: PMyRecord;
begin
  New(Rec);
  try
    Rec.Control := AControl;
    Rec.Object := AObject;
    Result := inherited Add(Rec);
  except
    Dispose(Rec);
    Raise;
  end;
end;

procedure TMyList.Insert(Index: Integer; AControl: TControl; AObject: TObject);
var
  Rec: PMyRecord;
begin
  New(Rec);
  try
    Rec.Control := AControl;
    Rec.Object := AObject;
    inherited Insert(Index, Rec);
  except
    Dispose(Rec);
    Raise;
  end;
end;

function TMyList.Get(Index: Integer): PMyRecord;
begin
  Result := PMyRecord(inherited Get(Index));
end;

procedure TMyList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  inherited;
  if Action = lnDeleted then
    Dispose(PMyRecord(Ptr));
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果健忘,可以使用`TObjectList` (2认同)
  • 如果您创建一个新类而不是一个记录来保存列表值,那将会有效.就个人而言,我认为额外的课程将是不必要的开销. (2认同)