Toon posts:

[delphi] tijd en dag controle

Pagina: 1
Acties:
  • 167 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Beste GoTTers

Ik heb een programma geschreven waarmee ik een ander programma (database) update. Dit programma wil ik op een bepaalde tijd op een bepaalde dag laten controleren of er een update aanwezig is. Weet iemand hoe dat moet? kheb het nu zo (op een dus niet werkende manier):
- gebruiker vult een tijd in (in editbox, is waarschijnlijk wel betere manier maarja!!)
- deze tijd wordt naar een ini-file geschreven
- Het programma draait op de achtergrond (in de systemtray)
- telkens moet het programma controleren of de tijd aangegeven in de ini-file hetzelfde is als de systemtime (zoiets: bla.readstring.bla.'time' = systemtime)
- op het moment dat time (in ini-file) bijvoorbeeld 12:30 is en de èchte tijd op 12:30 komt moet het progje gaan kijken of er een update aanwezig is.

Ook heb ik checkboxes met de dagen geplaatst zodat men kan aangeven op welke dagen de update moet kijken. Weet iemand hier ook iets over?

dus if ini_time = systemtime, and ini_day = systemday then blablabla

Oh ja, en het moet in Delphi dus gelieve niet aankomen met de windows takenbeheer ofzo.
Kheb ook al bij Torry, AssuAssist enz gekeken, maar geen bevredigend resultaat gevonden

Alvast bedankt voor reactie/antwoord.

[ Voor 3% gewijzigd door Verwijderd op 13-02-2004 16:20 ]


Verwijderd

Timertje gebruiken, en iedere minuut ff de tijd controleren.

Verwijderd

Topicstarter
Hoe luidt die code daaronder dan? Kan nie echt goed met Timers overweg.
Bestaat hier ook niet de kans dat, hij als je bijvoorbeeld om de halve minuut laat controleren, niet de tijd overslaat (door de secondes, bv. 12:30=ini-time en systemtime=12:30:13 (dus met secondes).
En kost de timer niet veel geheugen? Mijn programma loopt namelijk de hele (werk)dag!

is het anders niet mogelijk (kheb het al geprobeerd, maar werkte niet):
- label maken met de klok daarop lopend (had ik een keertje)
- ini_time met caption van label vergelijken
- label verbergen voor gebruikers

Verwijderd

Verwijderd schreef op 13 februari 2004 @ 16:28:
Hoe luidt die code daaronder dan? Kan nie echt goed met Timers overweg.
Bestaat hier ook niet de kans dat, hij als je bijvoorbeeld om de halve minuut laat controleren, niet de tijd overslaat (door de secondes, bv. 12:30=ini-time en systemtime=12:30:13 (dus met secondes).
En kost de timer niet veel geheugen? Mijn programma loopt namelijk de hele (werk)dag!

is het anders niet mogelijk (kheb het al geprobeerd, maar werkte niet):
- label maken met de klok daarop lopend (had ik een keertje)
- ini_time met caption van label vergelijken
- label verbergen voor gebruikers
Je kunt toch gewoon de uren en minuten met elkaar vergelijken, kijk een naar het TDateTime type en aanverwanten. Je moet ff (via trucje) de seconden van beide waarde's op 0 zetten en dan vergelijken (hint: CompareTime) .

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Gump's Simpele Stappenplan (GSS :p):
1. Lees de tijd uit de ini en zet deze in een variabele
2. Plak een timertje op je hoofdform
3. Zet de interval van de timer op 1 minuut
4. Check in de code van de timer of Format('hhnn', Time) = Format('hhnn', IniTijd)
5. Voer de code uit als de vergelijking bij 4. true geeft

Voor een controle op de dag kun je GSS volgen, maar dan voor een datum/dag in plaats van voor een tijd. Zo, makkelijker kan ik het niet maken!

[ Voor 5% gewijzigd door OZ-Gump op 13-02-2004 16:38 ]

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je gooit een TTimer op een form en stelt met de Interval property in om de hoeveel seconden de timer 'gevuurd' wordt. Als een timer wordt 'gevuurd' wordt de OnTimer event aangeroepen. De code zet je daar in. De timer is niet heel precies, want het is afhankelijk van windows messages. Maar meestal is het tot 20ms nauwkeurig. Tijden vergelijken is zoiezo iets om niet met = te doen, maar met functies zoals SameTime of CompareTime.

Een TTimer gebruikt niet steeds meer geheugen naar mate de tijd verstrijkt, dus dat is geen probleem.

[ Voor 3% gewijzigd door LordLarry op 13-02-2004 16:41 ]

We adore chaos because we like to restore order - M.C. Escher


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Tijden vergelijken is zoiezo iets om niet met = te doen, maar met functies zoals SameTime of CompareTime.
LordLarry, als het om de afrondingen gaat is het toch in principe geen probleem? De TS wil op basis van minuten een tijd gaan controleren, die kun je toch best in de juiste format zetten en dan vergelijken?

Toegegeven, de juiste procedures brengt voordelen met zich mee (verschillende weergaves, afrondingen etc) maar als de TS een timer niet eens kent.....

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Als je het naar een string omzet is het idd geen probleem.

We adore chaos because we like to restore order - M.C. Escher


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Toch gewoon zo?

code:
1
2
3
4
If Time > iniTime then
Begin
  IniTime = volgende_initime(); // (volgende dag waarschijnlijk? Of volgend uur)
End;

[ Voor 4% gewijzigd door Guillome op 13-02-2004 23:11 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Gek idee misschien, maar kun je niet gebruiken van Windows Scheduler? Misschien heeft wel een API :+

Verwijderd

DateDiff lijkt me de juiste optie dan?
Timer is zowiezo GEEN optie! Wanneer je applicatie druk bezig is, dan komt de timer nooit aan de beurt, dus geen update!
verder loopt een timer continu door, terwijl je bijvoorbeeld eens per herstart wil kijken...

Je kan bijvoorbeeld ook met HourSpan () of MinuteSpan om de bepaalde tijd kijken naar een update

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 27-05 15:56

Tomatoman

Fulltime prutser

Het lijkt me hier bepaald niet iets waarbij het kritisch is of je op de seconde nauwkeurig reageert. Een timer kan hier absoluut geen kwaad. Gewoon het timer-interval instellen op bijvoorbeeld 10 seconden (Interval = 10000, Enabled = True) en dan iets aan het OnTimer event hangen. De huidige tijd kun je opvragen met de Now functie. Tenslotte gebruik je het OnCreate event van het form om de ini-file uit te lezen. Vanwege de kennis van de topicstarter heb ik het helemaal uitgewerkt.
Delphi:
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
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FDeTijdInMijnIniFile: TDateTime;
  public
    procedure StartMijnUpdate;
  end;

procedure TForm1.StartMijnUpdate;
begin
  { Hier voer je de update uit }
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Nu lees je eerst de ini-file uit en sla je de update-tijd op in
    FDeTijdInMijnIniFile }
  FDeTijdInMijnIniFile := { en hier vul je zelf je code in }
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Now >= DeTijdInMijnIniFile then
  begin
    Timer1.Enabled := False; // meer dan 1 update voorkomen
    StartMijnUpdate;
  end;
end;
Als je deze code niet snapt, wordt het tijd om in de boeken te duiken.

[ Voor 4% gewijzigd door Tomatoman op 14-02-2004 02:18 . Reden: layout ]

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Owkee danku mensen, ik heb van ogeveer iedereen wat genomen. Ik zat er al dichtbij. Gewoon Timer plaatsen en de opgegeven tijd in de ini-file laten vergelijken, zal wel simpeler moeten kunnen maar ik kan nu wel effe vooruit.

Hulde aan iedereen _/-\o_ _/-\o_ _/-\o_

Verwijderd

Topicstarter
Weet iemand misschien ook waar ik de systeem tijd uit kan lezen, ergens uit het register ofzo (en eventueel de landinstellingen).
En nog iets, ik heb nu op mijn form een DateTimPicker. Nu wil ik in de DateTimPicker alleen de tijd weergeven in de vorm 'hh:mm' maar hij gaat alleen maar in de vorm 'hh:mm:ss'. Hoe kan ik dit veranderen, volgens mij niet via de object-inspector, daar kunnen alleen daatum gegevens gewijzigd worden. Ik werk in Delphi 5.

[ Voor 20% gewijzigd door Verwijderd op 17-02-2004 14:31 . Reden: had eerst MaskEdit i.p.v. DateTimePicker ]


Verwijderd

De systeemtijd kan je ophalen door de functie Now. Die levert zowel de huidige tijd als de huidige datum.

En voor die DateTimePicker moet je kijken naar de property Format. Daar kan je precies aangeven wat je zichtbaar wilt hebben. Dus bijv hh:mm

Verwijderd

Topicstarter
Ik heb geen property format!!! alleen dateformat, ik moet het dus voor de time hebben, ook geprobeert met FormatDateTime, maar lukte niet bij mij. De systeemtijd moet ik ergens uit het systeemregister halen omdat ik moet kijken hoe (op andere computers) de tijd is aangegeven (met of zonder pm/am enzo).

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

De systeemtijd is de tijd en zegt niets over de weergave. Zie voor het laatste de help bij 'Currency and date/time formatting variables' om de huidige weergave instellingen op te vragen. Als je je tijd volgens die instellingen wilt weergeven gebruik je TimeToStr.

We adore chaos because we like to restore order - M.C. Escher


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Now geeft een TDateTime terug. Dit bevat zoals de naam suggereert de datum EN tijd. Wil je een datum/tijd weergeven als tekst, dan gebruik je functie FormatDateTime. Alles m.b.t. datums en tijd kan je in de Delphi-help vinden onder "Datetime routines" (staat in de index).
Als je alleen de datum wilt hebben gebruik je de functie Date. Time voor de tijd.

Als je echt maar één keer per dag wilt controleren dan zou ik de datum waarop het laatst is gecontroleerd opslaan. In de help staat hoe er met datum/tijd wordt omgegaan. Dan begrijp je ook de +1.
code:
1
If LaatsteControleDatum + 1 + Controletijd > Now then


En ja, er zijn veel verschillende manieren om het voor elkaar te krijgen.

Verwijderd

Topicstarter
DateTimePicker zo opgelost.
Voor de mensen die het ook nodig hebben, stond volgens mij niet op het forum ( :*) )
--------------------------------------------------------------------------------------
uses
ComCtrls

begin
DateTime_SetFormat(DateTimePicker1.Handle, pChar('H:mm'));
end;
--------------------------------------------------------------------------------------
Hoe doen jullie trouwens die witte balken en regelnummers enzo :?

Heb nieuwe topic geopend i.v.m. die tijd(sinstellingen) enzo
http://gathering.tweakers.net/forum/list_message/20027784#20027784

[ Voor 54% gewijzigd door Verwijderd op 18-02-2004 09:34 ]

Pagina: 1