2012-05-02 80 views
5

兩天前我開始學習Delphi,但我陷入了困境。我失敗了,因爲沒有任何東西可以讓我決定寫在這裏。我想創建一個有自己的TTimer對象的字段,並在某個時間間隔內執行一些操作。它甚至有可能嗎?假設我們有這樣的代碼:TTimer對象可以成爲Delphi類的一個字段嗎?

Sth = class 
private 

public 
    clock:TTimer; 
    procedure clockTimer(Sender: TObject); 
    constructor Create(); 
end; 

constructor Sth.Create() 
begin 
    clock.interval:=1000; 
    clock.OnTimer := clockTimer; 
end; 

procedure Sth.clockTimer(Sender: TObject); 
begin 
    //some action on this Sth object at clock.interval time... 
end; 

我相似的代碼copiles但它不能正常工作。當我調用構造函數時,程序崩潰(線路上的訪問衝突:clock.interval:= 1000;)。我不知道什麼

Sender:TObject 

但我認爲這不是問題。是否有可能創建我想要的類?

+0

TTimers是Delphi類中非常常見的字段。表單類是類,並且每次將TTimer放置在表單上時,IDE都會爲您聲明一個TTimer字段。 –

+0

我知道當我將它放在窗體上時,IDE爲我聲明TTimer字段。但我想把TTimer作爲一個沒有形式的類的領域。我想編寫單獨的類(* .pas文件),而不使用表單並將其鏈接到主窗體。所以,沒有形式,我必須自己寫所有的聲明。我不知道這是不是好方法(不是用中學課程),我甚至不知道形式的問題。但是現在在David Heffernan回答後,everthing可以正常工作。 – xan

+0

這個基本問題(你不知道你必須在使用它之前創建對象)告訴我,你可能會從閱讀一些基本材料中受益,比如像馬爾科cantu這樣的大型舊Delphi書籍的前幾章一個(掌握德爾福7或類似的東西),或者至少,花更多的時間在http://www.delphibasics.co.uk/ –

回答

12

您還沒有創建計時器。聲明一個變量是不夠的。您確實需要創建計時器。

constructor Sth.Create() 
begin 
    clock := TTimer.Create(nil); 
    clock.interval:=1000; 
    clock.OnTimer := clockTimer; 
end; 

而且你也應該銷燬它。析構函數添加到類

destructor Destroy; override; 

並實施這樣

destructor Sth.Destroy; 
begin 
    clock.Free; 
    inherited; 
end; 

我也建議你讓你的clock領域也有私人的知名度。揭露類內部的內幕是不好的。

TMyClass = class 
private 
    FClock: TTimer; 
    procedure ClockTimer(Sender: TObject); 
public 
    constructor Create; 
    destructor Destroy; override; 
end; 
.... 
constructor TMyClass.Create 
begin 
    inherited; 
    FTimer := TTimer.Create(nil); 
    FTimer.Interval := 1000; 
    FTimer.OnTimer := ClockTimer; 
end; 

destructor TMyClass.Destroy; 
begin 
    FTimer.Free; 
    inherited; 
end; 

請注意,我已經包含對繼承的構造函數和析構函數的調用。這些在這個類中不是必需的,因爲它直接來自TObject,並且TObject的構造函數和析構函數是空的。但是如果你在某個時候改變了繼承,並且讓你的類從不同的類中派生出來,那麼你需要這樣做。所以,在我看來,最好總是包含這些調用。

+0

行︰clock:= TTimer.Create;不編譯。它說:「沒有足夠的實際參數」。 – xan

+0

現在一切正常。但最後一個問題:爲什麼TTimer.Create(nil)?這裏有多重要?爲什麼我們必須寫它?非常非常感謝你! :-) – xan

+3

構造函數接收一個名爲TComponent類型的Owner的參數。如果你的類從'TComponent'派生,那麼它可以傳遞'Self',然後你的實例將擁有這個計時器。這意味着定時器在其所有者被銷燬時會自動銷燬。這在VCL中廣泛使用。這裏不需要,所以你通過'nil'來選擇退出所有權機制。 –

相關問題