2012-05-02 6 views
5

Zacząłem uczyć się Delphi dwa dni temu, ale utknąłem. Zepsułem się, ponieważ nic nie idzie po mojej myśli, więc postanowiłem napisać tutaj. Chciałem stworzyć klasę, która będzie miała pole z własnym obiektem TTimer i która wykona jakąś akcję w pewnym przedziale czasowym. Czy to możliwe? Załóżmy, że mamy taki kod:Czy obiekt TTimer może być polem klasy 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; 

Mój kod jest podobny, ale nie działa poprawnie. Kiedy wywołuję konstruktora program ulega awarii (naruszenie dostępu w linii: clock.interval: = 1000;). Nie wiem, co robi, ale myślę, że to nie problem. Czy możliwe jest stworzenie takiej klasy, jaką chcę?

+0

TTimery są bardzo często polami klas Delphi. Klasy formularzy są klasami, a za każdym razem, gdy umieszczasz TTimer w formularzu, IDE deklaruje dla ciebie pole TTimer. –

+0

Wiem, że IDE deklaruje dla mnie pole TTimer po umieszczeniu go na formularzu. Ale chciałem umieścić TTimer jako pole klasy, które nie ma formy. Chciałem napisać osobną klasę (plik * .pas) bez formularza i połączyć go z formularzem głównym. Tak więc, bez formy, musiałem sam napisać wszystkie deklaracje. Nie wiem, czy to dobre podejście (nie używając formularza z klasami drugorzędnymi), jeszcze nie znam jeszcze kwestii form. Ale teraz wszystko działa dobrze po odpowiedzi Davida Heffernana. – xan

+0

Ten podstawowy problem (nie wiedziałeś, że musisz tworzyć obiekty przed użyciem) wskazuje mi, że możesz skorzystać z lektury podstawowych materiałów, takich jak pierwsze rozdziały jednej z dużych starych książek Delphi, takich jak Marco cantu jeden (opanowanie delphi 7 lub coś podobnego), lub przynajmniej spędzanie więcej czasu na http://www.delphibasics.co.uk/ –

Odpowiedz

12

Nie utworzyłeś stopera. Deklarowanie zmiennej nie wystarczy. Musisz utworzyć timer.

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

I ty też powinieneś to zniszczyć. Dodaj destruktora do klasy

destructor Destroy; override; 

i wdrożyć go jak ten

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

Chciałbym również, aby dokonać swojej dziedzinie clock posiadają widoczność. Nie jest dobrze eksponować wewnętrznych klas takiej klasy.

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; 

Zauważ, że zawarłem połączenia z odziedziczonym konstruktorem i destruktorem. Nie są one konieczne w tej klasie, ponieważ pochodzą bezpośrednio z TObject, a konstruktor i destruktor dla TObject jest pusty. Ale jeśli w pewnym momencie zmienisz dziedziczenie i sprawisz, że twoja klasa będzie pochodzić z innej klasy, będziesz musiał to zrobić. Tak więc, moim zdaniem, dobrą praktyką jest włączanie tych połączeń zawsze.

+0

linii: clock: = TTimer.Create; nie kompiluje się. Mówi: "Za mało rzeczywistych parametrów". – xan

+0

Teraz wszystko jest w porządku. Ale ostatnie pytanie: dlaczego TTimer.Create (zero)? Jak ważne jest tutaj zero? Dlaczego musimy to napisać? Dziękuje bardzo! :-) – xan

+3

Konstruktor otrzymuje parametr o nazwie Właściciel typu TComponent. Jeśli twoja klasa pochodzi od 'TComponent', to może przekazać' Self', a wtedy twoja instancja będzie * posiadać * timer. Oznacza to, że timer zostanie automatycznie zniszczony, gdy jego właściciel zostanie zniszczony. Jest to szeroko stosowane w VCL. Nie jest to konieczne, więc przekazujesz 'nil', aby zrezygnować z mechanizmu własności. –

Powiązane problemy