klasa procedura czasowa

0

mam takie male pytanko. Stworzylem sobie klase Tklient. standardowo ja sobie poustawialem, ale natrafilem na problem. Otoz w klasie musi byc wykonywana co jakis okreslony z gory czas procedura. Tzn:

tworze obiekt danej klasy powiedzmy oko:=Tklient.create;

wywoluje procedure startowa powiedzmy oko.rozpocznij;

od tego momentu co sekunde ma byc zwiekszana zmienna licznik tej klasy (to chyba nazywasie pole ale mniejsza o to) problem w tym jak to zrobic

Jest pozno wiec jesli ktos zrozumie co ja przed chwila napisalem, bylbym wdzieczny za odpowiedz :>

0

musisz dodać Timera do sekcji Private komponentu, a do sekcji Protected procedure OnTimer.
W OnCreate komponentu musisz oczywiście stworzyć tego Timera.

Dokładnie jest to opisane m.in. w książce Delphi 6 Dla Każdego.

0

No musisz dodać Timera (typ TTimer). Aby zaczął wykonywać swoje zadania musi być ustawiona właściwość Enabled timera na true. W OI ustawiasz interval na czas który chcesz (1 sekunda np.) no i klikasz dwa razy na timera i tworzy sie OnTimer i tam wpisujesz instrukcje do wykonania przy każdym wywołaniu Timera czyli po upłynieciu czasu interval od ostatniego wywołania. Moze byc np. licznik=licznik+1; czy cos takiego.

0
pootek napisał(a)

...

On chce to zrobic w klasie, wiec o jakim OI mowisz?

Zamiast timera uzyl bym normalnej funkcji SetTimer.

0

Yo tak kombinuje i kombinuje z timerkiem i nic mi nie wychodzi. Mam cos takeigo:

{pierdoly poczatkowe}

type Tklient =class

nr_stanowiska:byte;          
Istan:Tstan;                     

procedure zajmij_stanowisko;
procedure zwolnij_stanowisko;

procedure onn(hwnd:HWND;a,idTimer:integer;dwTime:cardinal);
end;


implementation

 procedure Tklient.onn(hwnd:HWND;a,idTimer:integer;dwTime:DWORD);
 begin
 end;


procedure Tklient.zajmij_stanowisko;
begin


SetTimer(null,1,1000,@onn);                             {to tu :p }

end;

procedure Tklient.zwolnij_stanowisko;
begin
end;

i nie wychodzi mi to. Juz mi sie pomysły skonczyly. Moglby ktos dac jakis kawalek kodu ? :|

0

Definicja klasy może wyglądać tak:

TKlient = class
private
  FZmienna: Integer;
  FTimer: TTimer;
protected
  procedure ExecuteTimer(Sender: TObject);
public
  constructor Create; override;
  destructor Destroy; override;
end;

no i potem w sekcji implementation:

constructor TKlient.Create;
begin
  inherited;
  FZmienna := 0;
  FTimer := TTimer.Create(Self);
  FTimer.Interval := 1000; // 1 sekunda
  FTimer.OnTimer := ExecuteTimer; // przypisanie procedurki pod zdarzenie OnTimer
  FTimer.Enabled := True;
end;

procedure TKlient.ExecuteTimer(Sender: TObject);
begin
  Inc(FZmienna);
end;
0

Yo thx za pomoc ale powyzszy kodzik nie do konca chodzi. Otoz:

Jesli chce utworzyc Timer w swojej klasie musze zrobic cos takeigo:

FTimer := TTimer.Create(FTimer); //poprawnie przyjmowanie

gdy dam:

FTimer := TTimer.Create(Self);    //nie chce ruszyc;

wyskakuje blad:

[Error] Unit2.pas(56): Incompatible types: 'TComponent' and 'Tklient'

wszystko bylo by oki gdyby nie fakt, ze przy tworeniu Timera:

FTimer := TTimer.Create(FTimer); //poprawnie przyjmowanie

jakos dziwnie dziala zwalnianie komponentu.

Tworze Timera->wsztstko oki.
Zwalniam Timera ->wsztstko oki.
Tworze Timera->przepelnienie bufora, dziekujemy bylo milo ale sie skonczylo;-)

Zwalnianie daje standardowe:

FTimer.Free;

Jesli tworzenie Timera dam poza klasa tez wychodzi mi przepelnienie bufora :/

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Timer:=TTimer.Create(Timer);
  Timer.Free;
end;

Ni chu chu nie wiem jak to obejsc :/

Pomozecie ?

0

O jaki bufor ci dokladnie chodzi? Bo moim skromnym zdaniem tutaj moze sie stos zapchac.

Zrob lepiej Create(nil);

0

gdy dam:

FTimer := TTimer.Create(Self);    //nie chce ruszyc;

wyskakuje blad:

[Error] Unit2.pas(56): Incompatible types: 'TComponent' and 'Tklient'

I slusznie nie chce ruszyc, bo Twoj TKlient dziedziczy bezposrednio po TObject, a wlascicielem klasy TTimer musi byc TComponent, dlatego Delphi sie boczy na self.

Jesli by Cie to nie bolalo - zrob

TKlient = class( TComponent )
 {...}
constructor create( AOwner: TComponent ); override;
destructor destroy; override;
end;



constructor TKlient.Create;
begin
  { ... }
  FTimer := TTimer.Create( Self );
  FTimer.Enabled := True;
end;

destructor TKlient.Destroy;
begin
  FreeAndNil( FTimer );
  inherited;
end;

Sprawdzilem, tworzy kolejne instancje klienta razem z (dzialajacym!) timerem, zwalnia tez.

1 użytkowników online, w tym zalogowanych: 0, gości: 1