6

私の質問はとても簡単です。queueクラスのオブジェクトを含むTList ( と呼ばれる) があり、それらのオブジェクトCNotifでメソッドを使用したいと考えています。is_alive

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

また、この TList でオブジェクトをインスタンス化する方法 (および、格納されているオブジェクトがこの型であることをコンパイラがどのように「認識する」かについても混乱しています ...)

私が今していることは:queue.Add(CNotif.create(timer, title, text, badge))しかし、私はそれがそのように行われるべきだとは思わない.

前もって感謝します !

4

2 に答える 2

10

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

これは、コンパイラがqueue.items[0]ジェネリック ポインター以外のことを認識していないためです (以下を参照)。

私が今やっていることは次のとおりです:

これはまさにあなたがそれを行う必要がある方法です。CNotif.Createは新しいオブジェクトを構築し、そのオブジェクトは から派生しTObjectます。呼び出しはポインタを想定しているため、正常にコンパイルされますqueue.Add。オブジェクト インスタンスを含む Delphi/FreePascal 変数は実際にはポインタです。(どちらの言語も、for を使用して逆参照する必要性を隠していMyObj^ます。)

で何かを使用するには、ジェネリック(もちろんメソッドはありません)queue.Items以外にあるものをコンパイラに伝える必要があります。あなたは型キャストによってそれを行います:pointeris_alive

CNotif(queue.Items[0]).is_alive

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

queue[0] 

と同じです

queue.Items[0]

そして、入力がはるかに簡単になります。

于 2012-04-15T17:05:12.963 に答える
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 を使用していませんが、Delphi ではこれが間違いなくこれを行う方法です。いたるところにある型指定されていないポインターと型キャストのリストは、維持するのに悪夢になる可能性があります。

于 2012-04-15T23:55:51.027 に答える