所有
在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'
有谁知道如何调用此方法?
答案 0 :(得分:4)
将listTest [i]指针强制转换回T_Test,然后调用其方法:
T_Test(listTest[i]).showInt;
或者,如果可用,使用模板化的TObjectList类直接存储T_Test实例。
答案 1 :(得分:2)
马丁的回答是正确的。但值得注意的是,如果你可能在列表中添加不同的类,那么更强大的代码片段就是......
var pMmember: pointer;
pMember := listTest[i];
if TObject( pMember) is T_Test then
T_Test( pMember).ShowInt;
Martin关于TObjectList的观点是安静的。另一个需要考虑的选择是TList< T_Test>。 David对析构函数中的错误的评论也是正确的。
我注意到你没有初始化i的值。所以上面的片段假装你做了。如果您还想检查索引变量是否为有效值,并且如果它无效则不调用ShowInt,那么您可以执行以下操作...
if (i >= 0) and (i < listTest.Count) and (TObject(listTest[i]) is T_Test) then
T_Test(listTest[i]).ShowInt;
上面的代码片段依赖于短路布尔评估。