2012-04-15 21 views
6

我的問題很簡單。我有一個TList(名爲queue),其中包含CNotif類的對象,並且希望在這些對象上使用方法is_alive如何使用存儲在TList中的對象的方法?

問題是,當我使用queue.Items[0].is_alive()時,出現錯誤消息Error: Illegal qualifier

我也困惑與我可以在此從TList實例化對象(和編譯器如何「知道」存儲的對象都是這種類型的方式...)

我現在做的是這樣的:queue.Add(CNotif.create(timer, title, text, badge))但我不認爲它應該這樣做。

預先感謝您!

+4

只是一個旁註。有一個不成文的約定,用第一個字符'T'來命名類型,比如'TLama'是'Lama'的類型,所以對於你的情況它將是'TCNotif' ;-) – TLama 2012-04-15 17:26:26

+0

對於類和T爲「基本」類型(如數組或記錄)? – halflings 2012-04-15 21:38:20

+0

不是,它適用於所有'T'類型,包括類,記錄,枚舉等。讓我們來說說你在代碼的'type'部分中的所有內容。 – TLama 2012-04-15 21:58:51

回答

10

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

這是因爲編譯器不知道queue.items[0]是比一般的指針等(見下文)。

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較短的方式; Items被聲明爲TList的默認屬性,所以你可以忽略它:

queue[0] 

相同

queue.Items[0] 

而且更容易輸入。

+0

很好的回答! :) 非常感謝。 – halflings 2012-04-15 17:18:55

+3

'TList'的成員不是'TObject',而是指針。 – NGLN 2012-04-15 18:31:52

+0

好點。 :) 我的錯;寫得太快了,一定是在想'TObjectList'。我會糾正它。謝謝。 :) – 2012-04-15 18:32:57

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中,這絕對是做到這一點的方法。無處不在的指針列表和遍佈整個地方的類型轉換可能成爲維護的噩夢。

+2

+1,但是從D2010 +中可以很好地提到,因爲在D2009中有幾個問題,特別是使用'TList'時。 – TLama 2012-04-16 00:03:28

+4

在fpc ObjFPC模式下,語法是'type TQueue = specialize TFPGList ' - 但您也可以使用Delphi模式(至少從2.6開始)使用Delphi語法。 – lukstafi 2012-04-16 02:45:11

相關問題