Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi aus Ini datei ein Datum und eine Zeit auslesen (https://www.delphipraxis.net/145221-aus-ini-datei-ein-datum-und-eine-zeit-auslesen.html)

kingsusu 26. Dez 2009 19:03


aus Ini datei ein Datum und eine Zeit auslesen
 
Guten Abend Leute.

Nach einer Zeit des Versuchs wende ich mich wieder an euch.

Ich habe jetzt eine Überschrift (EdUber), eine Beschreibung (Edmem), eine Zeit die ich mit Timepicker erstllt habe (pickerzeit.time) und ein Datum dass ich auch mit datepicker erstellt hab (pickerdatum.date)

also so:
Delphi-Quellcode:
WriteToIni (Filename,'Myvars','Überschrift',eduber.Text);
WriteToIni (Filename,'Myvars','Beschreibung',edmem.Text);
WriteToIni (Filename,'Myvars','Zeit',TimeToStr(pickerzeit.Time));
WriteToIni (Filename,'Myvars','Datum',DateToStr(pickerdatum.date));


Wenn ich jetzt zum TTimer sagen will:

Wenn die Das Datum und die Zeit in der ini-datei mit (NOW) - also JETZT - übereinstimmen, dann Mach GERÄUSCH und zeige mir ein Hinweisfenster mit der Überschrift und der Beschreibung.



Bisher habe ich das geschafft

Delphi-Quellcode:

If (TimeToStr(now) = TImeToStr(pickerzeit.Time)) and (DateToStr(now) = DateToStr(pickerdatum.Date) )
then showmessage ('Aufwachen') ;
Aber wie mache ich es, dass er die Daten in der Ini-Datei abfragt und dort als Hinweisfenster die Überschrift und die dazugehörige Beschreibung nimmt?

Matze 26. Dez 2009 19:28

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hallo,

du kannst TDateTime-Werte direkt miteinander vergleichen ohne sie davor in einen String umzuwandeln.

Wie man aus einer Ini-Datei liest, ist dir geläufig. Das Anzeigen kannst du mit "Application.MessageBox()" machen (Tutorial).

Grüße, Matze

kingsusu 27. Dez 2009 10:56

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von Matze
Hallo,

du kannst TDateTime-Werte direkt miteinander vergleichen ohne sie davor in einen String umzuwandeln.

Wie meinst du das? Ich vergleiche ja nicht zwei TDateTime werte miteinander, sondern jeweils das Datum und NOW und dann die Zeit und NOW.

Was ist falsch daran, wenn ich diese in einen String umwandel?

implementation 27. Dez 2009 11:43

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Es ist nichts falsch daran. Aber so geht es auch:
Delphi-Quellcode:
if Pickerdatum.date+Pickerzeit.time=now then ...

thkerkmann 27. Dez 2009 11:48

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hi,

beides ist nicht optimal.
Die Umwandlung von tDateTime in einen String verhindert an dieser Stelle Rundungsprobleme, dennoch muss die Prüfung zur genau richtigen Sekunde erfolgen. Sollte das Programm noch andere Dinge tun, könnte das auch schonmal evtl. ne Sekunde später sein.... und dann ?

Ich würde auf einen Bereich von z.B. 10 Sekunden oder einer Minute testen. Und in dem Fall eignet sich dann der direkte tDateTime Datentyp besser.

Gruss

[Edit]
Oder geht es erst mal darum, die Werte wieder aus der Ini-Datei zu lesen ?
Soll eventuell mehr als eine "Weckzeit" überprüft werden ?
[/Edit]

kingsusu 27. Dez 2009 11:59

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Es kann ruhig einige Sekunden verspätet auftreten! Das ist absolut kein Problem. Ich bleibe lieber bei den Strings, weil ich dort verstehe was vor sich ging.

Zitat:

Zitat von thkerkmann

Oder geht es erst mal darum, die Werte wieder aus der Ini-Datei zu lesen ?
Soll eventuell mehr als eine "Weckzeit" überprüft werden ?

Genau! Das will ich.


Mit der Messagebox habe ich es versucht.

Aber es zeigt mir Fehler bei diesem Befehl:

Delphi-Quellcode:

If (TimeToStr(now) = TImeToStr(pickerzeit.Time)) and (DateToStr(now) = DateToStr(pickerdatum.Date) )
then
Messagebox(Self.Handle, readfromini(filename, 'Myvars', 'Beschreibung'), readfromini (filename, 'Myvars', 'Überschrift'), MB_ICONWARNING or MB_OK);

SirThornberry 27. Dez 2009 12:04

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Ich würde nicht auf gleich prüfen, auch nicht auf eine Toleranz sondern prüfen ob das Datum/Zeit in der Ini kleiner als das aktuelle ist und kleiner dem des letzten auslösens. Den Zeitpunkt des letzten Auslösens musst du nicht mitspeichern sondern kannst es bei Programmstart auf now setzen.

Der Zeitanteil von TDateTime (Now) ist übrigens der Nachkommaanteil. Diesen solltest du mit Floor ermitteln können. Der Datumsteil eines TDateTime ist der Teil vor dem Komma und kann mit Trunc ermittelt werden.
Delphi-Quellcode:
gesamt := now();
zeit := floor(gesamt);
datum := trunc(gesamt);

implementation 27. Dez 2009 12:06

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von SirThornberry
Der Zeitanteil von TDateTime (Now) ist übrigens der Nachkommaanteil. Diesen solltest du mit Floor ermitteln können. Der Datumsteil eines TDateTime ist der Teil vor dem Komma und kann mit Trunc ermittelt werden.

Floor() rundet ab. Bei positiven Zahlen kommt also das gleiche raus wie bei Trunc().
Ich schätze du meintest Frac() ;-D

kingsusu 27. Dez 2009 12:17

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von SirThornberry
Ich würde nicht auf gleich prüfen, auch nicht auf eine Toleranz sondern prüfen ob das Datum/Zeit in der Ini kleiner als das aktuelle ist und kleiner dem des letzten auslösens. Den Zeitpunkt des letzten Auslösens musst du nicht mitspeichern sondern kannst es bei Programmstart auf now setzen.

- ohje, ich will das nicht unnötig kompliziert machen :gruebel: .

Aber ich denke, dass es nach meiner Methode auch klappt.

Wenn ich die "Überschrift" des Nachrichtenfensters von der Ini-Datei ablese und auch die dazugehörige "Beschreibung" und diese dann als Messagebox ausgeben kann (vielleicht noch später einen Weckersound hinzu oder sowas :mrgreen: ) dann wäre 50% der Arbeit erledigt.

Die anderen 50% wären dann nur noch zu schauen ob die Zeit und das Datum einer (welche ich mit DateTimePicker erstellt habe und auch in die Ini-datei gespeichert hab ;) ) mit NOW übereinstimmen. Wenn ja soll dann meine Messagebox mit dem Sound aktiviert werden.

implementation 27. Dez 2009 12:20

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von kingsusu
- ohje, ich will das nicht unnötig kompliziert machen :gruebel: .

Das ist nicht kompliziert.
Delphi-Quellcode:
if Now >= Datumpicker.date + Zeitpicker.time then ...

thkerkmann 27. Dez 2009 12:56

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hi,

also es geht erst mal um das Konzept.

Lies alle 4 Werte aus der Ini in variablen ein, bevor Du auf den Timer wartest.
Nicht in der Timer Routine erst auf die Ini Datei zugreifen.

Also:

Einstellen:
schreibt Werte in die Ini

Programm startet:
lese Werte aus der Ini (in variablen)

Programm läuft:
überprüfe ob Datum,Zeit erreicht

Wenn erreicht:
Zeige Werte an (aus variablen)

Dann sollte es einfacher gehen.

kingsusu 27. Dez 2009 13:10

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Ich verstehe aufjeden Fall was ihr meint und dass es auch besser ist.

Delphi-Quellcode:

If (TimeToStr(now) = TImeToStr(pickerzeit.Time)) and (DateToStr(now) = DateToStr(pickerdatum.Date))
  then showmessage (Messagebox(Self.Handle, (readfromini(filename, 'Myvars', 'Beschreibung')), (readfromini (filename, 'Myvars', 'Überschrift')), MB_ICONWARNING or MB_OK)) ;
Der Delphi-Befehl oben zeigt mir folgenden Fehler: [DCC Fehler] URemember.pas(168): E2010 Inkompatible Typen: 'string' und 'PWideChar'.

Und das will ich auch verstehen - wieso es nicht klappt! :)

kingsusu 27. Dez 2009 16:04

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
bzw. was muss ich änder, dass es klappt. Ich komme gerade echt nicht weiter und habe alles mögliche versucht :wall:

thkerkmann 27. Dez 2009 16:19

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hi,

Nimm mal lieber MessageDlg statt MessageBox.
MessageDlg stammt aus der Unit Dialogs, also von Delphi. MessageBox stammt aus der Unit Windows, und verlangt andere Aufrufkonventionen.
Im Moment hast Du ein Problem mit der Kompatibilität der Aufrufe und deinen Variablen Typen.

[Edit]
Delphi-Quellcode:
showmessage (Messagebox(Self.Handle, (readfromini(filename, 'Myvars', 'Beschreibung')), (readfromini (filename, 'Myvars', 'Überschrift')), MB_ICONWARNING or MB_OK)) ;
Was'n das ?

showmessage mit Messagebox ?
also entweder
Delphi-Quellcode:
Showmessage(readfromini(filename, 'Myvars', 'Beschreibung')) + #13#10 + readfromini (filename, 'Myvars', 'Überschrift'));
oder

Delphi-Quellcode:
  MessageDlg( ... )
mit den entsprechenden Parametern.
[/Edit]

[Edit2]
und benutzt doch mal ein paar Variablen, das erhöht die Übersicht und dazu sind sie doch da:
Delphi-Quellcode:
  ...
var
  Ueberschrift: string;
  Meldung: string;
  ...
begin  
  if .... then
  begin
    Ueberschrift := ReadIni ....
    Meldung := ReadIni ....

    showmessage(Ueberschrift + #13#10 + Meldung);
  end;
[/Edit2]

Gruss

kingsusu 27. Dez 2009 17:16

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Also wenn ich es so mache:

Delphi-Quellcode:

Überschrift := readfromini(filename, 'Myvars', 'Überschrift');
Meldung :=  readfromini(filename, 'Myvars', 'Beschreibung');
showmessage(Überschrift + #13#10 + Meldung);
so kommt komischerweise (bei mehreren Terminen) nur der zeitlich letzte!

Dabei sollte doch für jedes einzelne ein einziges kommen... :wiejetzt:

Delphi-Quellcode:
If (TimeToStr(now) = TImeToStr(pickerzeit.Time)) and (DateToStr(now) = DateToStr(pickerdatum.Date))
then
begin
Überschrift := readfromini(filename, 'Myvars', 'Überschrift');
Meldung :=  readfromini(filename, 'Myvars', 'Beschreibung');
showmessage(Überschrift + #13#10 + Meldung);
Mein Code stimmt doch.

thkerkmann 27. Dez 2009 20:54

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hi,

ich weiss ja nicht, wie du deine Daten speicherst, aber so wie es ausschaut, kannst du in der ini nur einen Datensatz ablegen.
Du hast ja keinen Identifier für den x-ten Eintrag bei readfromini bzw. writetoini.

Gruss

kingsusu 27. Dez 2009 22:12

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Ja das scheint wohl zu stimmen, was du gesagt hast.

Mein jetziger Code.

Delphi-Quellcode:

filename := Extractfilepath (application.ExeName) + 'test.ini';
   WriteToIni (Filename,'Myvars','Überschrift',eduber.Text);
   WriteToIni (Filename,'Myvars','Beschreibung',edmem.Text);
   WriteToIni (Filename,'Myvars','Zeit',TimeToStr(pickerzeit.Time));
   WriteToIni (Filename,'Myvars','Datum',DateToStr(pickerdatum.date));
Aber dieser scheint wohl nur für einen Bereich zu stimmen. Muss ich jetzt eine Schleife darüber machen, oder wie schaffe ich das für den x-ten Betrag?

thkerkmann 28. Dez 2009 11:56

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Hi,

du könntest ja statt 'MyVars' z.B. 'Weckzeit' + IntToStr(nr) verwenden.

und noch einen Count in die Ini schreiben, damit Du weist wieviele es sind.

z.B.

Delphi-Quellcode:
   WriteToIni (Filename, 'Weckzeiten', 'Anzahl', Count);
   
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Überschrift', eduber.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Beschreibung', edmem.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Zeit', TimeToStr(pickerzeit.Time));
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Datum', DateToStr(pickerdatum.date));
Aber ich würde erst mal über eine geeignete Datenstruktur nachdenken.

Vielleicht überlegst Du dir mal einen Record oder Klasse - in den/der du die Sachen speicherst, und diese dann in eine Liste packst.
Dann solltest Du die Liste der Daten in die Ini speichern und wieder daraus lesen.

Mit den einzelnen Edit Feldern wirst Du ja nicht mehrere Datensätze auf einmal bearbeiten wollen.

Gruss

kingsusu 28. Dez 2009 12:05

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von thkerkmann
Hi,

du könntest ja statt 'MyVars' z.B. 'Weckzeit' + IntToStr(nr) verwenden.

und noch einen Count in die Ini schreiben, damit Du weist wieviele es sind.

z.B.

Delphi-Quellcode:
   WriteToIni (Filename, 'Weckzeiten', 'Anzahl', Count);
   
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Überschrift', eduber.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Beschreibung', edmem.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Zeit', TimeToStr(pickerzeit.Time));
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Datum', DateToStr(pickerdatum.date));

Und dieses IntToStr(nr) gibt einem bestimmten Eintrag von mir eine Nummer oder?
Wie definierte ich dann nr und Count?

Matze 28. Dez 2009 12:09

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Zitat:

Zitat von kingsusu
Und dieses IntToStr(nr) gibt einem bestimmten Eintrag von mir eine Nummer oder?

Nein. Dir fehlen immer noch sämtliche Grundlagen. Evtl. wären EInsteigertutorials ganz sinnvoll.

Delphi bringt eine - mehr oder weniger - brauchbare Hilfe mit. Oder du suchst in der Delphi-Reference nach diesen Funktionen: Delphi-Referenz durchsuchenIntToStr:

Zitat:

IntToStr converts an integer into a string containing the decimal representation of that number.
Auf Deutsch: Es wird ein Integer-Wert (= eine Ganzzahl) in einen String (= Zeichenkette) umgewandelt, den du dann ausgeben kannst.

kingsusu 28. Dez 2009 12:37

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Matze, die Tutorials habe ich echt durch..
aber das ist halt echt der letzte Schritt und ich tu mir da nicht so leicht bei der Sache.. :(

Hab ich das richtig verstanden thkerkmann?

Vorher hatte ich:
Delphi-Quellcode:

var filename, beschreibung:string;

begin
Timer1.Enabled := true;
filename := Extractfilepath (application.ExeName) + 'MeineDaten.ini';

   WriteToIni (Filename,'Myvars','Überschrift',eduber.Text);
   WriteToIni (Filename,'Myvars','Beschreibung',edmem.Text);
   WriteToIni (Filename,'Myvars','Zeit',TimeToStr(pickerzeit.Time));
   WriteToIni (Filename,'Myvars','Datum',DateToStr(pickerdatum.date));

if fileexists(filename) then //wenn es filename gibt, dann sollen mir die Daten auf mein Treeview angezeigt werden

    Beschreibung := readfromini(filename, 'Myvars', 'Beschreibung') + ' (' + readfromini(filename, 'Myvars', 'Zeit') + ')'+' (' + readfromini(filename, 'Myvars', 'Datum') + ')';
    AddEvent(readfromini(filename, 'Myvars', 'Überschrift'), Beschreibung, TreeView1);


end;


Und jetzt habe ich. Ich sehe in meiner File, dass mehrere Datenpakete gespeichert werden.



Delphi-Quellcode:

var filename, beschreibung, count:string;
var nr: integer;
begin
Timer1.Enabled := true;
filename := Extractfilepath (application.ExeName) + 'MeineDaten.ini';
WriteToIni (Filename, 'Weckzeiten', 'Anzahl', Count);

     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Überschrift', eduber.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Beschreibung', edmem.Text);
     WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Zeit', TimeToStr(pickerzeit.Time));
    WriteToIni (Filename,'Weckzeit'+IntToStr(nr),'Datum', DateToStr(pickerdatum.date));



if fileexists(filename) then //wenn es filename gibt, dann sollen mir die Daten auf mein Treeview angezeigt werden

    Beschreibung := readfromini(filename, 'Myvars', 'Beschreibung') + ' (' + readfromini(filename, 'Myvars', 'Zeit') + ')'+' (' + readfromini(filename, 'Myvars', 'Datum') + ')';
    AddEvent(readfromini(filename, 'Myvars', 'Überschrift'), Beschreibung, TreeView1);
Da ich jetzt Myvars in 'Weckzeit'+IntToStr(nr) geändert habe, so müsste ich doch auch MYvars hier:

Delphi-Quellcode:

    Beschreibung := readfromini(filename, 'Myvars', 'Beschreibung') + ' (' + readfromini(filename, 'Myvars', 'Zeit') + ')'+' (' + readfromini(filename, 'Myvars', 'Datum') + ')';
    AddEvent(readfromini(filename, 'Myvars', 'Überschrift'), Beschreibung, TreeView1);
auch ändern oder?

thkerkmann 28. Dez 2009 13:13

Re: aus Ini datei ein Datum und eine Zeit auslesen
 
Ja schon, aber wie ich bereits sagte:
Die aktuelle Datenstruktur ist suboptimal für deine Aufgabenstellung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.

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