Page 1 of 2 1 2 LastLast
Results 1 to 15 of 26

Thread: Gebruiker events controleren met marge

  1. #1

    Gebruiker events controleren met marge

    De gebruiker van mijn applicatie kan binnen de applicatie events aanmaken. Hij geeft hierbij een tijdstip aan en een proces dat moet worden gestart. Het tijdstip wordt opgegeven in een dag (1-7), uur (0-23) en minuut (0-59). Nu wordt er op bepaalde vaste punten binnen de applicatie gecontroleerd of er een event moet worden aangeroepen. Deze punten zijn variabel. Bij elk event wordt de controle op dit moment als volgt gedaan:
    Code:
    var
      CurrentTime: TDateTime;
      CurrentDay, CurrentHour, CurrentMinute: Integer;
    begin
      Result := False;
    
      CurrentTime := Now;
      CurrentDay := DayOfTheWeek(CurrentTime); //1 = Monday, 7 = Sunday
      CurrentHour := HourOf(CurrentTime); //0..23
      CurrentMinute := MinuteOf(CurrentTime); //0..59
    
      if (CurrentDay = FDay) then
      begin
        if (CurrentHour > FHour) then
          Result := True
        else if (CurrentHour = FHour) and (CurrentMinute >= FMinute) then
          Result := True;
      end;
    end;
    Maar nou werkt dit dus niet als het event vlak voor middernacht is gepland en het programma pas na middernacht controleerd op events. Dit stuk code is te simpel.

    Wat ik wil is een marge inbouwen: een event mag na door gebruiker ingevulde tijdstip 1 uur lang worden uitgevoerd, als deze nog niet is uitgevoerd.

    De controle of hij wel of niet is uitgevoerd is simpel, ik hou gewoon per event het tijdstip bij wanneer deze voor het laatst is uitgevoerd. Maar hoe zorg ik ervoor dat er een marge in zit? Ik krijg het maar niet voor elkaar om rekening te houden met dag, maand, jaar, enz. wisselingen.

    Iemand die me kan helpen?

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,117
    Haal 1 uur van CurrentTime af en noem hem dan CalcTime:
    Code:
    CalcTime := Now - (1/24);
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    Wat als je nu in plaats van het converteren van TDateTime naar Dag, Uur, minuut andersom doet? Dus die Dag, uur en minuut converteren naar een TDateTime en dan met behulp van een een of anderew functie zoals:

    if MinutesBetween(CurrentTime, EventTime) < 60 then begin
    // blabla
    end;

  4. #4
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,117
    @GaboonViper: Dat kun je ook schrijven als:
    Code:
    if CurrentTime - EventTime < (1/24) then ...
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  5. #5
    Quote Originally Posted by GaboonViper
    Wat als je nu in plaats van het converteren van TDateTime naar Dag, Uur, minuut andersom doet? Dus die Dag, uur en minuut converteren naar een TDateTime
    [..]
    En hoe zet ik die dag, uur en minuut om naar een volwaardige TDateTime. Immers, dag is geen dag van de maand. Maand en jaar heb ik niet.

  6. #6
    EncodeTime gebruiken?
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  7. #7
    Quote Originally Posted by Henkie
    EncodeTime gebruiken?
    Die functie ken ik, maar daarvoor heb ik dus een dag van de maand nodig, een maand en een jaar. Het event heeft deze gegevens niet.

  8. #8
    Vreemd, bij mij moet je enkel uur, minuut, seconde en miliseconde opgeven
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  9. #9
    TScriptKiddie DiGi-Ben's Avatar
    Join Date
    Oct 2004
    Location
    Beek (lb). Neth. Uses: Delphi 2005 Architect Uses: Delphi 2006 Architect
    Posts
    817
    Jelmer, ik denk dat je in de war bent met encodedate.

    Code:
    function EncodeTime ( const Hour, Min, Sec, MSec : Word ) : TDateTime;
    "Some are wise, some are otherwise."

  10. #10
    notice-itter SvG's Avatar
    Join Date
    Apr 2002
    Location
    's-Hertogenbosch
    Posts
    4,865
    Jelmer heeft het over EncodeDate?
    !

  11. #11
    Oja, ben daar inderdaad mee in de war.

    Zal eens even testen, bedankt!

  12. #12
    Quote Originally Posted by Jelmer Vos
    En hoe zet ik die dag, uur en minuut om naar een volwaardige TDateTime. Immers, dag is geen dag van de maand. Maand en jaar heb ik niet.
    Je kunt toch gewoon het Jaar en de Maand van CurrentTime nemen?

  13. #13
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,117
    De maand en ook het jaar (denk aan jaarwisseling) kunnen denk ik ook verschillen als ik Jelmer Vos begrijp.

    @Jelmer: Mag ik het als volgt samenvatten? Er is van een laatste Event beschikbaar: de dag, het uur en de minuut. Nu wil je a.d.h.v. een uur geleden kijken of dat Event daarna is gebeurd? Dit lijkt me onmogelijk, aangezien je dus, zoals je zelf zegt, de maand en het jaar niet weet, en dus ook eigenlijk helemaal niet weet wanneer dat Event heeft plaatsgevonden. Is het niet mogelijk om een volledige TDateTime op te slaan bij het Event?

    //Edit: O, ik denk dat ik het begrijp: je voert het Event wekelijks uit en de dag wordt als WeekDag (1-7) opgeslagen? Wel even lezen Albert!! .
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  14. #14
    Ik moest ff wakker worden, maar ik denk dat ik de oplossing nu heb. Misschien heb ik een beetje moeilijk gedaan met een classe maken maar dat maakt het wel wat overzichtelijker.

    de classe ziet er zo uit:

    Code:
    type
    
      TVageDateTime = class
      Private
        fMinutes: integer;
      Public
        constructor Create(const DateTime: TDateTime); overload;
        constructor Create(const DayOfTheWeek, Hour, Minute: integer); overload;
        
        function MinutesBefore(const DateTime: TDateTime): integer;
      Published
        property Minutes: integer read fMinutes write fMinutes;
      End;
    
    implementation
    
      constructor TVageDateTime.Create(const DateTime: TDateTime);
      begin
        fMinutes := 
          ((DayOfTheWeek(DateTime) - 1) * 24 * 60) +
          ((HourOf(DateTime) * 60) +
          MinuteOf(DateTime)
        ;
      end;
    
      constructor TVageDateTime.Create(const DayOfTheWeek, Hour, Minute: integer);
      begin
        fMinutes := 
          (DayOfTheWeek - 1) * 24 * 60) +
          (Hour * 60) +
          Minute
        ;
      end;
        
      function TVageDateTime.MinutesBefore(const DateTime: TVageDateTime): integer;
      begin
        result := DateTime.Minutes - fMinutes
        
        if result < 0 then 
          inc(result, 7*24*60); // Tell er een week bij op.
      end;
    ---------

    En dit wordt dan jou uiteindelijke functie

    Code:
    var
      CurrentTime, EventTime: TVageDateTime;
      MinutesBetween: integer;
    begin
      Result := False;
    
      CurrentTime := TVageDateTime.Create(Now);
      EventTime := TVageDateTime.Create(FDay, FHour, FMinute);
      
      MinutesBetween := CurrentTime.MinutesBefore(EventTime);
    
      if (MinutesBetween >= 0) and (MinutesBetween < 60) then
        result := true
      else 
        result := false;
    
      CurrentTime.Destroy;
      EventTime.Destroy;
    end;
    Ik heb dit zo net ff uit mijn mouw geschudt dus het zou goed kunnen dat er het een en het ander aan bugs in zit. Het princiepe zou goed moeten zijn. De klasse vertaald Dag, uur en minuut in een aantal minuten. Het maximale aantal minuten is precies (het aantal minuten in een week - 1). Welke maand, jaar of wat het dan ook is is voor deze functie onbelangrijk.

    Ik hoop dat dit is wat je zoekt.

    Quote Originally Posted by NGLN
    Welkom op het forum trouwens !
    bedankt
    Last edited by GaboonViper; 28-Jan-05 at 01:33.

  15. #15
    SillyMember Dirk Andries's Avatar
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,724
    Niet getest (en het is al laat, dus geen garanties).
    Zoiets zou het moeten doen (de marge wordt enkel toegepast op het verleden).
    Code:
    function EventInMarge(ADay, AHour, AMinute: Word):Boolean;
    const
      EenUur = 1 / 24;
    var
      Current, TestDate: TDateTime;
      CurrentDay: integer;
    begin
      Current := Now;
      CurrentDay := DayOfTheWeek(Current);
      // Correctie voor zondag/maandag en maandag/zondag
      if (CurrentDay = 7) and (ADay = 1) then Dec(CurrentDay,7)
      else if (CurrentDay = 1) and (ADay = 7) then Inc(CurrentDay,7);
      TestDate := Trunc(Current) +
                  EncodeTime(AHour, AMinute, SecondOf(Current), 0) -
                  CurrentDay + ADay;
      Result := (TestDate >= Current - EenUur) and
                 (TestDate <= Current);
    end;
    All methodologies are based on fear. -- Kent Beck.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Replies: 17
    Last Post: 28-May-04, 16:37
  2. Replies: 26
    Last Post: 28-May-04, 09:18
  3. Wat is jullie relatie met delphi (of ander talen)
    By freebutterflyx in forum Koffiehoek
    Replies: 15
    Last Post: 01-Feb-03, 23:14
  4. Active X component installeren met alleen dll
    By R. de Witte in forum Algemeen
    Replies: 2
    Last Post: 18-Jan-03, 16:01
  5. hoe controleren of gebruiker alles ingevuld heeft ?
    By marcus aurelius in forum Databases
    Replies: 10
    Last Post: 30-Aug-02, 12:25

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •