Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Timer: speichern in ini und auslesen... (https://www.delphipraxis.net/1156-timer-speichern-ini-und-auslesen.html)

Anfänger 25. Okt 2002 21:59


Timer: speichern in ini und auslesen...
 
Hi und Nabend,
ich möchte gern das aktuelle Datum mit Uhrzeit beim beenden speichern.
Die Zeit und das Datum werden in der Statubar angezeigt.

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Statusbar1.Panels.Items[1].Text   := FormatDateTime(' dddd',Date) + ' der ' + FormatDateTime('dd.mm.yyyy',Date);
Statusbar1.Panels.Items[2].Text   := FormatDateTime('hh:mm:ss',Time);
end;
wie bekomme ich das hin, das das aktuelle Datum mit Uhrzeit in einer ini beim Beenden gespeichert wird und beim Neustart wieder in ! 2 Labeln ! (einmal Datum und Tag ) und (einmal Uhrzeit) geschrieben wird.

( So sollte es aussehen: Sie haben am Sonnabend d. 25.10.2002 um 23.01 den....)

Wer kann mir helfen und gibt auch ein Codebeispiel dazu.

Vielen Dank
Anfänger

Christian Seehase 25. Okt 2002 22:25

Moin Anfänger,

also erst einmal die INI:

Falls Du noch nicht damit gearbeitet hast:
Du musst unter Uses noch die Unit IniFiles hinzufügen.
Damit Du beim Start die Werte laden, und beim Beenden speichern kannst, solltest Du Dir ein Feld im private Bereich für die INI anlegen.
Erzeugt wird diese dann im OnCreate Ereignis des Formulares (dort werden dann auch die Daten gelesen).
Gespeichert (und das Objekt wieder freigegeben) im OnDestroy des Formulares.
Mit den Funktionen DateToStr bzw. TimeToStr kannst Du dann das aktuelle Datum (Funktion: Now) in die INI schreiben (Methode: TIniFile.WriteString)
Mit StrToDate, StrToTime, ReadString und einer Umwandlung des Datums mit Hilfe von DayOfWeek kannst Du das ganze dann wieder auslesen.
(für die Umwandlung von DayOfWeek in den entsprechenden Text gibt's auch ein schönes Beispiel in der Hilfe)
Im Prinzip könntest Du auch mit den TIniFile Methoden WriteDate bzw. Time (oder den Read Gegenstücken) Datum und Zeit speichern, aber da Du sie anschliessend eh' wieder als String brauchst halte ich den anderen Weg auch für gangbar. Es gibt halt viele Möglichkeiten.

Ich bastele noch ein Beispiel, aber ich denke, dass Du mit diesen Info's auch schon klarkommen kannst. Zumindest hast Du Stichworte zum Nachschlagen für Einzelheiten.

Anfänger 25. Okt 2002 22:34

Hallo Christian,

Danke für die Stichwörter.
Es wäre jedoch nett wenn du da ein Beispiel hättest, da ich
noch so ziemlich am Anfang steh.

Das speichern in eine ini ist kein Problem mehr, (jedenfalls im Moment) :lol:

Vielleicht kannste mir ja son Beispiel mal basteln... :oops: :lol:

Danke
Anfänger

Daniel B 25. Okt 2002 22:39

Hallo Anfänger,

wenn Du das z.B. in einem Timer mit 100ms stellst, dann bekommst Du ständig die aktuelle uhrzeit mit Datum.

Label1.Caption := DateTimeToStr(Now);
Statt dem Label könntest Du das auch direkt in die Ini schreiben.

Kannst Du das mit der Ini wirklich? Zeig doch mal ein bisschen Code, wie weit Du schon bist.

Grüsse, Daniel :hi:

Anfänger 25. Okt 2002 22:47

Hallo Daniel gerne doch


Code:
procedure TForm1.schreibe_ini;
var IniFile : TIniFile;
begin
     try
        IniFile:=TIniFile.create(ExtractFilePath(Paramstr(0))+'daten.dat');
{Telekom}
        IniFile.WriteString ('Wert(/)','Telekom',Label33.Caption);
        if Edit1.Text <> '' then
        IniFile.WriteString ('Anzahl','Telekom',Label32.Caption);
        if Edit3.Text <> '' then
        IniFile.WriteString ('Kurs-Zeitwert(brutto)','Telekom',Label36.Caption);
        if Edit4.Text <> '' then
        IniFile.WriteString ('Kurs-Zeitwert(netto)','Telekom',Label37.Caption);
        if Edit5.Text <> '' then
        IniFile.WriteString ('TagesWert','Telekom',Edit5.Text);
     finally
       IniFile.Free;
     end;
end;


procedure TForm1.lese_ini;
var IniFile : TIniFile;
begin
     IniUpdate      := true;
     IniFile        := TIniFile.create(ExtractFilePath(Paramstr(0))+'daten.dat');
{Telekom}
     Label32.Caption := IniFile.ReadString('Anzahl','Telekom',Label32.Caption);
     Label36.Caption := IniFile.ReadString('Kurs-Zeitwert(brutto)','Telekom',Label36.Caption);
     Label37.Caption := IniFile.ReadString('Kurs-Zeitwert(netto)','Telekom',Label37.Caption);
     Label33.Caption := IniFile.ReadString('Wert(/)','Telekom',Label33.Caption);
     Edit5.Text     := IniFile.ReadString('TagesWert','Telekom',Edit5.Text);
     IniUpdate      := false;
   IniFile.Free
end;
Das habe ich aus dem Forum und aus Büchern entnommen,
und funzt auch soweit.

Gruß
Anfänger

Luckie 25. Okt 2002 23:04

Beim ersten Code sitzt der try-finally-Block falsch und im zweiten Code fehlt er ganz.

Code:
[b]procedure[/b] TForm1.schreibe_ini;
[b]var[/b] IniFile : TIniFile;
[b]begin[/b]
        IniFile:=TIniFile.create(ExtractFilePath(Paramstr(0))+'daten.dat');
     [b]try[/b]
[color=#000080][i]{Telekom}[/i][/color]
        IniFile.WriteString ('Wert(/)','Telekom',Label33.Caption);
        [b]if[/b] Edit1.Text <> '' [b]then[/b]
        IniFile.WriteString ('Anzahl','Telekom',Label32.Caption);
        [b]if[/b] Edit3.Text <> '' [b]then[/b]
        IniFile.WriteString ('Kurs-Zeitwert(brutto)','Telekom',Label36.Caption);
        [b]if[/b] Edit4.Text <> '' [b]then[/b]
        IniFile.WriteString ('Kurs-Zeitwert(netto)','Telekom',Label37.Caption);
        [b]if[/b] Edit5.Text <> '' [b]then[/b]
        IniFile.WriteString ('TagesWert','Telekom',Edit5.Text);
     [b]finally[/b]
       IniFile.Free;
     [b]end[/b];
[b]end[/b];

Daniel B 25. Okt 2002 23:04

Hi,

egal ob Du liest oder schreibst, verwende immer einen Try..Finally Block. Und schreibe das IniFile.Create vor das Try.

Grüsse, Daniel :hi:

Christian Seehase 25. Okt 2002 23:13

Moin Anfänger,

zu schreibe_ini:

Das try gehört hinter die Create Zeile.

Grund:
Der try/finally Block wird auch Resourcen Schutzblock genannt.
Mit diesem soll verhindert werden, dass belegte Resourcen nicht wieder freigegeben werden.
Da vor dem Create noch keine Resourcen belegt wurden, macht das try dort auch keinen Sinn.

Statt IniFile.Free ist es meist besser (wenn auch nicht notwendig) FreeAndNil(IniFile) zu schreiben. IniFile dient hier nur als Beispiel, es bezieht sich auf jede Freigabe mit Free.

Grund:
FreeAndNil führt intern IniFile.Free gefolgt von IniFile := nil aus. Damit wird zum einen die Resource wieder freigegeben, und zum anderen IniFile auf einen definierten Wert gesetzt. Würde das nicht passieren, würde IniFile auf die alte Adresse zeigen, und man könnte nicht mit Assigned feststellen, ob das Objekt nun noch existiert oder nicht.
Deshalb ist es in diesem Falle auch nicht notwendig, da ja, zumindest zur Zeit, keinerlei Gefahr besteht, dass noch einmal auf IniFile innerhalb der Prozedur zugegriffen wird.
Es schadet aber meiner Ansicht nach nichts sich daran zu gewöhnen. Wenn man nicht gerade eine Delphi Version benutzt, die FreeAndNil noch nicht kennt, so dass man gezwungen ist die := nil Zeile selber zu schreiben, ist es auch nicht sehr viel aufwändiger.

Um sicherzustellen, dass die Daten auch wirklich auf die Platte geschrieben werden, könnte, nachdem der letzte Wert geschrieben wurde, eine Zeile IniFile.UpdateFile nicht schaden.

Grund:
In Windows 95 (eventuell auch 98/ME) werden die Zugriffe auf Ini Dateien gepuffert, also nicht sofort wirklich auf die Platte geschrieben. Durch Update.File lässt sich also die Gefahr eines Datenverlustes verringern.


zu lese_ini:

hier fehlt der try/finally Block.

Was ist eigentlich IniUpdate?

Anfänger 25. Okt 2002 23:34

HI Nachtschwärmer,

soviel Info auf mal und das am Abend ... :?: :!: :?:

Die fehlenden Blöcke habe ich eingetragen und umgeschrieben.
Das "IniUpdate" (gestohlen mit den :freak: ) hat mir mal ein Bekannter empfohlen, da ich ja mit dem speichern auch gleich die Proceduren
"schreibe_ini" und "lese_ini" durchführe und so die Felder aktuallisiere.
IniUpdate benutze ich schon, steht in "lese_ini".
Bei FreeAndNil(IniFile); kommt folgende Meldung:
[Fehler] Unit1.pas(271): Undefinierter Bezeichner: 'FreeAndNil'

Leider steh ich da noch am Anfang.

In diesem Zusammenhang vielen Dank an die Delphianer in diesem Forum,
für die Unterstützung und auch netten Tips und Tricks. :mrgreen:
So macht das programieren auch Spaß :coder:
Leider ist das nicht in jedem Forum so... :? :cry:

Gruß
Anfänger (der keiner bleiben will)

Daniel B 25. Okt 2002 23:39

Zitat:

Zitat von Anfänger
soviel Info auf mal und das am Abend ... :?: :!: :?:

Wor müssen unser ganzes Geld in teuere Delphi Raumschiff Versionen reinstecken und können uns deswegen kein Bett leisten. Oder die Frauen sind der Meinung das wir noch Arbeiten sollten. :roll: :shock:

Zitat:

Leider ist das nicht in jedem Forum so... :? :cry:
Deswegen gibt es uns ja. :mrgreen: :dancer:

Zitat:

Anfänger (der keiner bleiben will)
Dann musst Du ja jedes Jahr Deinen Usernamen ändern... :chat:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Seite 1 von 3  1 23      

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