2012-04-15 30 views
6

私の質問はかなり簡単です。私はクラスCNotifのオブジェクトを含むTList(queueと呼ばれる)を持っていて、それらのオブジェクトに対してメソッドis_aliveを使いたいと思っています。TListに格納されたオブジェクトのメソッドの使い方は?

queue.Items[0].is_alive()を使用すると、Error: Illegal qualifierというエラーメッセージが表示されるという問題があります。

私も、私はこのTListの内のオブジェクトをインスタンス化することができる方法で混乱している(と方法コンパイラが保存されたオブジェクトがこのタイプであることを「知っている」か...)

私は今何をすべきかです:queue.Add(CNotif.create(timer, title, text, badge))しかし、私はそれがそうすることになっているとは思わない。

ありがとうございます!

コンパイラは queue.items[0](下記参照)汎用ポインタ以外の何であるかわかりませんのでです
+4

ただの脇役。 'TLama'は' Lama'の型ですので、あなたの場合は 'TCNotif'となります;-) – TLama

+0

クラスとクラスではCではありません"基本的な"タイプ(配列やレコードのようなもの)のT? – halflings

+0

いいえ、それはクラス、レコード、列挙体を含むすべての 'T'型のためです。コードの' type'セクションにあるすべてのものについて言えましょう。 – TLama

答えて

10

The problem is, when I use queue.Items[0].is_alive(), I get an error message saying Error: Illegal qualifier.

What I do now is: queue.Add(CNotif.create(timer, title, text, badge)) but I don't think it's supposed to be done that way.

これはまさにあなたがそれを行う必要がある方法です。 CNotif.Createは新しいオブジェクトを作成し、そのオブジェクトはTObjectに下がります。 queue.Add呼び出しにポインタが必要であり、オブジェクトインスタンスを含むDelphi/FreePascal変数が実際にポインタであるため、コンパイルは正常です。 (どちらの言語が私たちのためにMyObj^を使用して間接参照する必要性を非表示にします。)

queue.Itemsで何かを使用するには、あなたがよりそこに他に何があるかをコンパイラに指示する必要があり、一般的なpointer(もちろんis_alive方法を持っていません) 。あなたはその型キャストによって:

CNotif(queue.Items[0]).is_alive 

注:TList.Itemsを使用するために短い方法があります。 ItemsTListのデフォルトプロパティとして宣言されているので、あなたはそれを省略することができます。

queue[0] 

queue.Items[0] 

と同じであると入力する方がはるかに簡単です。

+0

すばらしい答え! :)ありがとう。 – halflings

+3

'TList'のメンバーは' TObject'ではなくポインタです。 – NGLN

+0

良い点。 :)私の間違い;あまりにも速く書いて、 'TObjectList'を考えていたに違いない。私はそれを修正します。ありがとう。 :) –

6

古いDelphiのバージョンが付いていない限り、ジェネリックスを調べる必要があります。

generics.collectionユニットには、ここで使用できるTList<T>クラスがあります。

Queue:TList<CNotify>; 

... 
Begin 
    Queue := TList<CNotify>.Create; // remember to clean it up 
    Queue.Add(CNotify.Create(...)); 
    Queue.Add(CNotify.Create(...)); 

    If Queue[0].isAlive then 
    Beep; 
End; 

私はfpcとlazarusをしばらく使用していませんが、これは間違いなくこれを行う方法です。タイプのないポインタとその型キャストのリストは、維持する悪夢になることがあります。

+2

+1、しかし、D2009 +は特に 'TList'ではいくつかの問題があったので、D2010 +から言えばいいかもしれません。 – TLama

+4

fpc ObjFPCモードでは、構文は 'type TQueue = specialize TFPGList 'ですが、Delphiの構文(少なくとも2.6以降)を持つDelphiモードを使用することもできます。 – lukstafi

関連する問題