Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2x am Tag automatisch speichern (https://www.delphipraxis.net/91742-2x-am-tag-automatisch-speichern.html)

BBoy 9. Mai 2007 10:36


2x am Tag automatisch speichern
 
In meinem Programm sollen die Daten (MemoFelder) 2x am Tag gespeichert werden.
Es sollte vormittags und Abends gespeichert werden. Die genaue Uhrzeit lässt sich nicht festlegen, da dass Programm (und der PC) nicht den ganzen tag eingeschaltet sind.

Stelle mir vor, dass wenn das Programm gestartet wird, wird geprüft ob schon gespeichert wurde, wenn nicht wird geprüft ob es vormittags ist und dann wird gepeichert. Abends dann genau so.

Aber irgendwie stehe ich total auf dem Schlauch wie ich sowas realisieren soll. Kan mir jemand von euch vielleicht die nötigen denkanstöße und etwas Input geben ? Danke!

scrat1979 9. Mai 2007 10:54

Re: 2x am Tag automatisch speichern
 
Zitat:

Zitat von BBoy
In meinem Programm sollen die Daten (MemoFelder) 2x am Tag gespeichert werden.
Es sollte vormittags und Abends gespeichert werden. Die genaue Uhrzeit lässt sich nicht festlegen, da dass Programm (und der PC) nicht den ganzen tag eingeschaltet sind.

Stelle mir vor, dass wenn das Programm gestartet wird, wird geprüft ob schon gespeichert wurde, wenn nicht wird geprüft ob es vormittags ist und dann wird gepeichert. Abends dann genau so.

Aber irgendwie stehe ich total auf dem Schlauch wie ich sowas realisieren soll. Kan mir jemand von euch vielleicht die nötigen denkanstöße und etwas Input geben ? Danke!

Hallo bboy,

hätte mal 2 Gedankengänge meinerseits.

1.) Wenn es nicht auf die 2-malige Sicherung ankommt dann lasse einfach einen Timer mitlaufen, welcher den Inhalt z.B. alle 30 Minuten speichert (Das wäre die einfachste Lösung). Dürfte die Performance wohl nicht wesentlich beeinflussen meine ich.

2.) Benutze ein INI-File. Schreibe dazu eigene eigene Prozedur (z.B. SaveMemos). Beim PRogramm starten prüfst Du nach, ob das File vorhanden ist (Nein -> nicht gespeichert und SaveMemos aufrufen). Falls ja, dann aktuelle Uhrzeit dort reinschreiben und Memos sichern. Beim nächsten PRogrammstart wird die INI-Datei gefunden (s.o.). Uhrzeit auslesen und mit aktueller Uhrzeit vergleichen (z.B. Funktion hoursbetween(). Sollte es diese in Delphi 6 noch nicht geben, was ich glaube, dann suche hier im Forum. Gab hier dazu mal einige Lösungen (Stichwort Arbeitszeitmessung...)). Im Programm selbst wieder einen Timer nehmen und beim OnTimer-Ereignis die SaveMemos-Prozedur z.B. alle 8 Stunden aufrufen ("morgens und abends").

Zitat:

Stelle mir vor, dass wenn das Programm gestartet wird, wird geprüft ob schon gespeichert wurde, wenn nicht wird geprüft ob es vormittags ist und dann wird gepeichert. Abends dann genau so.
Das verstehe ich nicht ganz. Wenn das Programm gestartet wurde und vorher nicht gespeichert wurde, dann wären die zu speichernden Daten sowieso nicht mehr vorhanden?!?! Oder verstehe ich da was nicht so ganz? :gruebel: Wäre es nicht sinnvoll die Daten beim beenden auf jeden Fall im OnClose-Eregnis zu sichern (auch hier dann SaveMemos aufrufen - aber ohne Check ob die Zeit rum ist, d.h. auf jeden Fall beim beenden speichern...)

HOffe es war nicht zu wirr geschrieben und ich konnte Dir etwas weiterhelfen...

SCRaT

BBoy 9. Mai 2007 12:26

Re: 2x am Tag automatisch speichern
 
Timer lösung geht nicht... 2x Täglich ist wichtig.

Das Programm soll eine Topliste aus dem Internet laden und diese 2x am Tag speichern. Diese TopListe ist in einem Memo zwischengespeichert. Diese Topliste wird zwar die ganze zeit im programm angezeigt, aber soll wie gesagt nur 2x am Tag gespeichert werden.
Das Memo wird gespeichert unter dem namen: tag.monat.jahr-stunde.minute..html und es wird bei jedem speichern ein neues angelegt.

Dachte mir auch schon ,dass die letzte speicherung in ein ini-file geschrieben wird, beim programmstart wird die ini gelesen.
alledings läuft das programm manchmal sehr viele stunden. daher müßte auch ein timer her, der alle stunde prüft ob gesichert werden muss.

Aber eben genau um die prozedur der überprüfung geht es, wie soll ich das realisieren?

Glaube HourSpan (Funktion) oder WithinPastMinutes (Funktion) könnte das richtige sein, werde das später mal testen wenn ich daheim bin.
Oder kennt jemand eine bessere lösung?

messie 9. Mai 2007 12:35

Re: 2x am Tag automatisch speichern
 
Zitat:

Zitat von BBoy
Glaube HourSpan (Funktion) oder WithinPastMinutes (Funktion) könnte das richtige sein

Das Hauptproblem dürfte sein, daß Du zum Speichern einen sich wiederholenden Programmablauf brauchst. Wenn Du ein reines ereignisgesteuertes Programm hast, wird das schwierig. Denn Du mußt ja die Prüfung ob gespeichert wurde erstmal vornehmen. Nur beim Start kann schiefgehen, wenn jemand das Programm nicht schließt und wieder öffnet.
Da wäre die Timervariante besser. Noch besser ein eigener Thread, der das überwacht.

Grüße, Messie

Nachtreiter 9. Mai 2007 13:04

Re: 2x am Tag automatisch speichern
 
@BBoy
erstell dir eine Dummy-Datei, schreibe rein wofür sie gut ist, und änder das Änderungsdatum der Datei. So hast Du immer einen Anhaltspunkt wann das letzte mal was gemacht wurde.
Du Speicherst und änderst das Datum der Datei. Beim Programmstart testest Du das Datum der Datei. Im Programm schreibst Du eine Funktion die immer ausgeführt wird wenn nichts zu tun ist, Idle.
Oder setzt einen Time auf eine Stunde und testest dann ab.
:firejump:

scrat1979 9. Mai 2007 14:15

Re: 2x am Tag automatisch speichern
 
Zitat:

Dachte mir auch schon ,dass die letzte speicherung in ein ini-file geschrieben wird, beim programmstart wird die ini gelesen.
alledings läuft das programm manchmal sehr viele stunden. daher müßte auch ein timer her, der alle stunde prüft ob gesichert werden muss.

Aber eben genau um die prozedur der überprüfung geht es, wie soll ich das realisieren?
Genau das meinte ich mit meiner 2. Variante. Einfach die Speichern-Prozedur in eine eigene Prozedur auslagern. Diese dann beim Start (Stichwort: ini-Datei Datum/Zeit auslesen) ggf. aufrufen. In der Prozedur nur die Speicher-Routine inkl. INI-Datei schreiben einfügen.

Nach dem Start brauchst Du aber - wenn kein Thread wie angedeutet - noch einen Timer. Das ONTimer-Even könntest Du dann z.B. alle 10 MInuten aufrufen und prüfen ob morgens bzw. abends schon gespeichert wurde. Falls nein, dann ggf. die Speicher-Prozedur aufrufen. Deswegen auslagern des Speicherns, da die PRozedur mehrmals im Code (ONCreate, OnClose, ONTimer) verwendet werden soll.

Um zu prüfen ob schon gespeichert wurde, könntest Du folgendes machen:

Beim programmstart:
1. Letzte PRüfung auslesen (INI-Datei --> TDateTime Variable)
2. Varialbe setzen für letzte sicherung (z.B. integer 1=morgens gesichert, 2=abends gesichert)

Beim ONTimer-Event:
3. Aktuelle Zeit auslesen
4. WEnn 3. zwsichen 8 und 9 Uhr UND variable = 2 (letzte sicherung abends)--> sichern und variable auf 1 setzen

5. wenn 3. zwischen 19 und 20 Uhr UND variable =1 (s. oben) --> sichern und variable auf 2 setzen.

Ggf. musst Du auch noch das Datum prüfen falls der PC z.B. 2 Tage aus war.

Kurz gesagt: Timer alle 5 MInuten aufrufen und wenn bei Timeraufruf aktuelle Uhrzeit abends bzw. morgens entspricht (zeitspanne) dann sichern und "backup_flag" entsprechend setzen, damit während der Zeitspanne nicht öfters gespeichert wird (timer wird ja alle x Min. aufgerufen).

Eine andere Möglichkeit sehe ich nicht auf die Schnelle.

SCRaT

Jelly 9. Mai 2007 14:22

Re: 2x am Tag automatisch speichern
 
So wie Scrat vorgeschlagen gehts auch noch schneller:
alle 30 Minuten einen Speicherversuch starten, über Timer. Im Timer ermittelst du den Dateiname. Dort muss das Datum rein, und ob es vormittags oder nachmittags ist. Also etwa so:
Code:
2007-05-09PM
2997-05-09AM
Existiert der berechnete Dateiname bereits, dann Prozedur beenden, ansonsten eben speichern.

TeronG 9. Mai 2007 14:48

Re: 2x am Tag automatisch speichern
 
Zitat:

Zitat von Jelly
So wie Scrat vorgeschlagen gehts auch noch schneller:
alle 30 Minuten einen Speicherversuch starten, über Timer. Im Timer ermittelst du den Dateiname. Dort muss das Datum rein, und ob es vormittags oder nachmittags ist. Also etwa so:
Code:
2007-05-09PM
2997-05-09AM
Existiert der berechnete Dateiname bereits, dann Prozedur beenden, ansonsten eben speichern.

Die Lösung finde ich genial! Simpel mit nem einfachen If Fileexists und ohne (große) berechnungen und ohne INI-File zu lösen!

Allerdings:
Zitat:

Zitat von BBoy
Das Memo wird gespeichert unter dem namen: tag.monat.jahr-stunde.minute..html ....

Den Filenamen müsste man dann hald wenn möglich um die Stunden und Minuten erleichtern.

himitsu 9. Mai 2007 16:24

Re: 2x am Tag automatisch speichern
 
Zitat:

Zitat von TeronG
Den Filenamen müsste man dann hald wenn möglich um die Stunden und Minuten erleichtern.

Nicht unbedingt, denn das genaue datum könnte ja auch nötig sein (wobei man dieses auch in der HTML-Datei abseichern/anzeigen kann)

In diesem Falls nicht FileExists, sondern FindFirst prüfen ob eine Datei existiert, da dort Masken verwendet werden können. :angel:

FindFirst('jahr.monat.tag.-*.html', ...)
FindFirst('jahr.monat.tag.-*.*.html', ...)
oder auch
FindFirst('jahr.monat.tag.-??.??.html', ...)


PS: für 'ne bessere Sortierung im Explorer könnte es aber besser sein, wenn du mit den Großen Werten anfängst.

jahr.monat.tag.-stunde.minute.html
oder
jahr.monat.tag..html


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz