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;

TObjectList に関する Martin の指摘は、静かに正しいものです。考慮すべきもう 1 つのオプションは、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;

上記のコード フラグメントは、短絡ブール値の評価に依存しています。

于 2012-08-18T14:50:28.547 に答える