Вызов метода объекта delphi tlist

Все,

В 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;

Затем у меня есть процедура, в которой я хочу создать TList объекта T_Test и вызвать для них функцию метода 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;

Но я продолжаю получать an, который говорит, что я должен использовать Record, Object или Class Type при вызове listTest[i].showInt.

Кто-нибудь знает, как вызвать этот метод?

2 ответа

Приведите указатель listTest[i] обратно к T_Test и затем вызовите его метод:

T_Test(listTest[i]).showInt;

В качестве альтернативы, если доступно, используйте шаблонный класс TObjectList для непосредственного хранения экземпляров T_Test.

Ответ Мартина правильный. Но стоит отметить, что если вы добавляете разные классы в свой список, более надежный фрагмент кода будет...

var pMmember: pointer;

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

Точка зрения Мартина о TObjectList довольно верна. Другим вариантом для рассмотрения будет TList. Комментарий Дэвида об ошибке в вашем деструкторе тоже верен.

Замечу, что вы не инициализировали значение i. Итак, фрагмент выше притворяется, что ты это сделал. Если вы также хотите проверить, что переменная индекса имеет допустимое значение, и не вызывать ShowInt, если она недействительна, то вы можете сделать что-то вроде этого...

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

Приведенный выше фрагмент кода основан на логической оценке короткого замыкания.

Другие вопросы по тегам