[Delphi 6] Synchronizeer 2 timers.

Pagina: 1
Acties:

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Ik heb 2 timers, maar als ik ze allebei enable, lopen ze niet gelijk.

Hoe kan je ervoor zorgen dat ze wel gelijk lopen (de OnTimer events van beide timers zijn al in gebruik).

  • Reptile209
  • Registratie: Juni 2001
  • Nu online

Reptile209

- gers -

Misschien een rare vraag, maar waarom zou je twee verschillende timers gelijk willen laten lopen? Dat is misschien wel handige informatie voor het oplossen van je probleem.

Verder kunnen ze theoretisch gezien niet gelijk lopen, want je enabled ze nooit tegelijk maar achter elkaar. Bovendien worden dan ook de OnTimer-events achter elkaar aangeroepen en nooit of te nimmer tegelijk. :)

Zo scherp als een voetbal!


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Aha. ok.

Het doel van deze timers is een tijd bijhouden op het scherm. Een totaaltijd en een subtijd. Zoals het nu is, verspringen ze niet gelijk, dat ziet er niet zo netjes uit.

Is het anders mogelijk om ze op de systeemtijd aan te zetten?

  • Denhomer
  • Registratie: Augustus 2000
  • Laatst online: 12-10-2025

Denhomer

Doh !

zet de acties van beide timers in 1 enkele timer ?
of zie ik het nu iets te simpel ?

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
mm.. daar heb je iets ja.. Even kijken of ik daar iets mee kan doen.

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 08:39
Je kan toch de subtijd op het moment van meten in een andere variabele opslaan?

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
timer1.enabled:=false;
timer2.enabled:=false;
timer1.enabled:=true;
timer2.enabled:=true;

en dat werkt niet?

This message was sent on 100% recyclable electrons.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 05:48

Tomatoman

Fulltime prutser

Natuurlijk werkt dat niet, want je zet timer1 aan VOOR timer2. Ze lopen dus niet gelijk.

Aangezien timers met messages werken, ben je er trouwens nooit zeker van dat de OnTimer event handler precies of het goede moment wordt aangeroepen. (Eigenlijk weet je dat wel, je weet zeker dat dat niet het geval is. :))

[ Voor 60% gewijzigd door Tomatoman op 02-01-2003 14:23 ]

Een goede grap mag vrienden kosten.


  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Naar aanleiding van het idee van DonHomer heb ik de volgende oplossing gemaakt:

2 Globale variabelen
code:
1
2
  intHuidigeSpeeltijdBijwerken: Integer;
  intTotaleSpeeltijdBijwerken: Integer;


1 Functie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
function speelduurBijhouden(welkeSpeelduur: Integer; statusTijd: Integer; resetTijd : Integer) : Integer;
{
  Deze functie geeft de mogelijkheid om de speelduur bij te houden of stop te zetten.
  Er wordt altijd 1 teruggegeven.

  welkeSpeelduur  -> Aangegeven of het de huidige of totale speelduur betreft.

                     0 = huidige, 1 = totale

  statusTijd      -> Zet de tijd stil, op laat hem lopen

                     0 = stilzetten, 1 = aanzetten

  resetTijd       -> Stel de tijd weer in op 0:0:0

                     0 = geen actie, 1 = reset
}
begin
   if welkeSpeelduur = 0 then
      begin
         if resetTijd = 0 then
            begin
            end
         else if resetTijd = 1 then
            begin
               frmMahjongg.edtSpeelduurHuidigSec.Text := '0';
               frmMahjongg.edtSpeelduurHuidigMin.Text := '0';
               frmMahjongg.edtSpeelduurHuidigUur.Text := '0';
            end;
         if statusTijd = 0 then
            begin
               intHuidigeSpeeltijdBijwerken := 0;
            end
         else if statusTijd = 1 then
            begin
               intHuidigeSpeeltijdBijwerken := 1;
            end;
      end
   else if welkeSpeelduur = 1 then
      begin
         if resetTijd = 0 then
            begin
            end
         else if resetTijd = 1 then
            begin
               frmMahjongg.edtSpeelduurTotaalSec.Text := '0';
               frmMahjongg.edtSpeelduurTotaalMin.Text := '0';
               frmMahjongg.edtSpeelduurTotaalUur.Text := '0';
            end;
         if statusTijd = 0 then
            begin
               intTotaleSpeeltijdBijwerken := 0;
            end
         else if statusTijd = 1 then
            begin
               intTotaleSpeeltijdBijwerken := 1;
            end;
      end;
Result := 1;
end;


1 Procedure die op het OnTimer event aangeroepen wordt
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TfrmMahjongg.tmrSpeelduurTimer(Sender: TOBject);
var tmpUur : Integer;
    tmpMin : Integer;
    tmpSec : Integer;

begin
if intHuidigeSpeeltijdBijwerken = 1 then
begin
   tmpSec := StrToInt(frmMahjongg.edtSpeelduurHuidigSec.Text);
   if tmpSec < 59 then
      begin
         tmpSec := tmpSec + 1;
         frmMahjongg.edtSpeelduurHuidigSec.Text := IntToStr(tmpSec);
      end
   else if tmpSec >= 59 then
      begin
         frmMahjongg.edtSpeelduurHuidigSec.Text := '0';
         tmpMin := StrToInt(frmMahjongg.edtSpeelduurHuidigMin.Text);
         if tmpMin < 59 then
            begin
               tmpMin := tmpMin + 1;
               frmMahjongg.edtSpeelduurHuidigMin.Text := IntToStr(tmpMin);
            end
         else if tmpMin >= 59 then
            begin
               frmMahjongg.edtSpeelduurHuidigMin.Text := '0';
               tmpUur := StrToInt(frmMahjongg.edtSpeelduurHuidigUur.Text);
               tmpUur := tmpUur + 1;
               frmMahjongg.edtSpeelduurHuidigUur.Text := IntToStr(tmpUur);
            end;
      end;
end;

if intTotaleSpeeltijdBijwerken = 1 then
begin
   tmpSec := StrToInt(frmMahjongg.edtSpeelduurTotaalSec.Text);
   if tmpSec < 59 then
      begin
         tmpSec := tmpSec + 1;
         frmMahjongg.edtSpeelduurTotaalSec.Text := IntToStr(tmpSec);
      end
   else if tmpSec >= 59 then
      begin
         frmMahjongg.edtSpeelduurTotaalSec.Text := '0';
         tmpMin := StrToInt(frmMahjongg.edtSpeelduurTotaalMin.Text);
         if tmpMin < 59 then
            begin
               tmpMin := tmpMin + 1;
               frmMahjongg.edtSpeelduurTotaalMin.Text := IntToStr(tmpMin);
            end
         else if tmpMin >= 59 then
            begin
               frmMahjongg.edtSpeelduurTotaalMin.Text := '0';
               tmpUur := StrToInt(frmMahjongg.edtSpeelduurTotaalUur.Text);
               tmpUur := tmpUur + 1;
               frmMahjongg.edtSpeelduurTotaalUur.Text := IntToStr(tmpUur);
            end;
      end;
end;
end;


PS: Voor deze functie zijn in totaal 6 editBoxes nodig (2 voor uur, 2 voor minuten, 2 voor seconden).

[ Voor 6% gewijzigd door evaarties op 02-01-2003 14:42 ]


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 08:39
Zijn er geen maskedit achtige boxen, spinedit controls of geintegreerde tijd-edit controls mogelijk? En misschien iets anders: ik ken MahJongg niet, maar is het reeel om bij de speeltijd ook seconden op te geven?

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Topicstarter
Het weergeven van de seconden is niet nodig ja, maar het staat leuk vind ik.
Pagina: 1