![]() |
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:
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.
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; ( 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 |
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. |
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 |
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: |
Hallo Daniel gerne doch
Code:
Das habe ich aus dem Forum und aus Büchern entnommen,
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; und funzt auch soweit. Gruß Anfänger |
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]; |
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: |
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? |
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) |
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 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