1

全部,

在 Delphi 中,我创建了一个名为 T_Test 的简单类(见下文)。

T_Test = class(TObject)

private

 F_Int : Integer;

public

  constructor Create(inInt: Integer);
  destructor Destroy; override;

  property Int: Integer read F_Int write F_Int;

  function showInt : String;


end;

constructor T_Test.Create(inInt: Integer);

 begin

  F_Int := inInt;

 end;


destructor T_Test.Destroy;

 begin

  self.Free;

 end;


function T_Test.showInt : String;

 var outputLine : String;


 begin

   result := IntToStr(Int);
   outputLine := result;
   Form1.Memo1.Lines.Add(outputLine);

 end;

然后我有一个过程,我想在其中创建一个 T_Test 对象的 TList 并在它们上调用 showInt 方法函数。

我试过这样:

procedure testTlist;

 var

  a, b: T_Test;
  i : Integer;

 begin

  a := T_Test.Create(5);
  b := T_Test.Create(10);

 listTest := TList.Create;

 listTest.Add(a);
 listTest.Add(b);


 listTest[i].showInt;


end;

但我不断收到一个说我必须在调用“listTest[i].showInt”时使用记录、对象或类类型

有谁知道如何调用这个方法?

4

2 回答 2

4

将 listTest[i] 指针转换回 T_Test,然后调用它的方法:

T_Test(listTest[i]).showInt;

或者,如果可用,使用模板化的 TObjectList 类直接存储 T_Test 实例。

于 2012-08-18T08:52:07.163 回答
2

马丁的回答是正确的。但值得注意的是,如果您可能要向列表中添加不同的类,那么更健壮的代码片段将是......

var pMmember: pointer;

pMember := listTest[i];
if TObject( pMember) is T_Test then
  T_Test( pMember).ShowInt;

Martin 关于 TObjectList 的观点是正确的。另一个要考虑的选项是 TList<T_Test>。大卫关于你的析构函数错误的评论也是正确的。

我注意到您没有初始化 i 的值。所以上面的片段是假装你做了。如果您还想检查索引变量是否处于有效值,并且如果它无效则不调用 ShowInt,那么您可以执行以下操作...

if (i >= 0) and (i < listTest.Count) and (TObject(listTest[i]) is T_Test) then
  T_Test(listTest[i]).ShowInt;

上面的代码片段依赖于短路布尔评估。

于 2012-08-18T14:50:28.547 回答