Speichern einer fortlaufenden Nummer

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Speichern einer fortlaufenden Nummer

Beitrag von l0lhaxx »

Hallo zusammen,
ich möchte eine fortlaufende Prüfnummer speichern. Diese muss nach dem schließen des Programmes wieder eingelesen
werden (bzw. noch vorhanden sein). Wie setzte ich sowas mit Lazarus am besten um? Benötige ich wieder eine extra File?

Vielen Dank vorab.

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Speichern einer fortlaufenden Nummer

Beitrag von Lion »

Verwendest Du bereits eine ini-Datei?

NoCee
Beiträge: 174
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Speichern einer fortlaufenden Nummer

Beitrag von NoCee »

Hallo,
ich hab für so was mal mit INI-Files gearbeitet.
Findet mal viel darüber im Netz und geht relativ einfach.
Hatte vorher noch nie mit Dateien lesen/schreiben in meinen Programmen gearbeitet,
hat aber auf Anhieb damit einwandfrei funktioniert.


http://wiki.freepascal.org/Using_INI_Files/de

NoCee

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Speichern einer fortlaufenden Nummer

Beitrag von Lion »

Ich würde die Nummer auch in einer ini- bzw. xml-Datei speichern. Falls Du eine DB hast, dann ist es noch besser. Alternativ wäre noch die Registry, würde ich aber persönlich dafür nicht nehmen.

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Speichern einer fortlaufenden Nummer

Beitrag von Requion »

Wenn du keine DB Anbindung hast oder planst wäre eine INI Datei wohl das einfachste.
XML wäre mir für sowas zu umständlich. Also wenn du es nur dafür brauchst.
Lion hat geschrieben:Alternativ wäre noch die Registry, würde ich aber persönlich dafür nicht nehmen.
Das fällt schonmal flach wenn man Crossplattform denkt. Allerdings hat sich l0lhaxx dazu ja nicht geäußert.

Edit zur Umsetzung: Ich würde eine Globale Variable dafür nutzen. Im OnCreate lädst du sie und im OnDestroy speicherst du sie.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Speichern einer fortlaufenden Nummer

Beitrag von m.fuchs »

Requion hat geschrieben:Ich würde eine Globale Variable dafür nutzen. Im OnCreate lädst du sie
Kann man machen.
Requion hat geschrieben:und im OnDestroy speicherst du sie.
Nein, speichern immer dann wenn sie inkrementiert wird. Man kann sich nicht sicher sein, dass OnDestroy immer aufgerufen wird.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Speichern einer fortlaufenden Nummer

Beitrag von Lion »

Genau, so was speichere ich immer sofort. Sonst kann das Programm oder Windows abstürzen, und dann hat man das Problem, da kein OnDestroy aufgerufen wurde.

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Speichern einer fortlaufenden Nummer

Beitrag von Requion »

Lion hat geschrieben:Genau, so was speichere ich immer sofort. Sonst kann das Programm oder Windows abstürzen, und dann hat man das Problem, da kein OnDestroy aufgerufen wurde.
Stimmt auffallend. Normalerweise gehe ich davon aus das Fehler in soweit abgefangen werden das wenigstens das Programm ordnungsgemäß beendet wird/werden kann :D . Aber das ist ja nicht immer gegeben.
An Windows Abstürze hab ich in dem Moment garnicht gedacht :( .

Wie ist das wenn die Nummer dann in kürzester Zeit sehr oft hochgezählt wird?

Code: Alles auswählen

// I Global deklariert
for I := 0 to 100000 do
begin
  //führe Operationen durch
  //Speicher I
end;
 
oder

Code: Alles auswählen

// I Global deklariert
for I := 0 to 100000 do
begin
  //führe Operationen durch
end;
//Speicher I
 
Also innerhalb der Schleife oder nach der Schleife speichern?
Hat das (wie im 1. Beispiel) Auswirkungen auf die Lebensdauer des Speichermediums(HDD, SSD, Flash) wenn ich 100000x in die Datei schreibe oder ist das bei der Anzahl unbedenklich?

Ich würde wahrscheinlich das 2. Beispiel bervorzugen.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Speichern einer fortlaufenden Nummer

Beitrag von l0lhaxx »

Hallo zusammen,

erstmal vielen Dank für die zahlreichen Antworten. Ich habe mich jetzt mal an den ini-Dateien versucht.
Klappt auch alles, bis auf die Ausnahme das nach dem Programm neustart wieder der Wert 10000 in der ini-Datei steht obwohl er zuvor bei z.B. 10030 war. Wo ist mein Fehler?

Code: Alles auswählen

 
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
   //Ini-Datei erstellen (Falls noch nicht vorhanden)
   Ini:= TIniFile.Create('rn.ini');
   try
   Ini.WriteInt64('Rondennummer','Schlüssel1',10000);
   finally
   Ini.Free;
   end;
 

Code: Alles auswählen

 
procedure TForm1.menuWiegenSpeichernClick(Sender: TObject);
var
  Ini: TIniFile;
  Rondennummer: int64;
begin
 
 Ini:=TIniFile.Create('rn.ini'); 
Rondennummer:= (Ini.ReadInt64('Rondennummer','Schlüssel1',0))+1;
  Ini.WriteInt64('Rondennummer','Schlüssel1',Rondennummer);     
 

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Speichern einer fortlaufenden Nummer

Beitrag von Requion »

Weil du im OnCreate immer den Wert Überschreibst.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Speichern einer fortlaufenden Nummer

Beitrag von l0lhaxx »

Requion hat geschrieben:Weil du im OnCreate immer den Wert Überschreibst.
muss ich das dann mit einer fileexist abfrage machen?

EDIT: So funktioniert es! Danke für eure Hilfe

Code: Alles auswählen

 
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
   //Ini-Datei erstellen (Falls noch nicht vorhanden)
   if not fileexists ('rn.ini') then begin
    Ini:= TIniFile.Create('rn.ini');
    try
     Ini.WriteInt64('Rondennummer','Schlüssel1',10000);
     finally
     Ini.Free;
    end;
   end; 
 

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Speichern einer fortlaufenden Nummer

Beitrag von Requion »

Code: Alles auswählen

Var Rondennummer: Integer; //Global
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
   //Ini-Datei erstellen (Falls noch nicht vorhanden)
   Ini:= TIniFile.Create('rn.ini');
   try
   Ini.ReadInt64('Rondennummer','Schlüssel1',10000); //Liest Wert aus der INI, wenn keiner Gefunden wird nimmt er 10000
   finally
   Ini.Free;
   end;
 

Code: Alles auswählen

procedure TForm1.menuWiegenSpeichernClick(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini:=TIniFile.Create('rn.ini');
  try
    Ini.WriteInt64('Rondennummer','Schlüssel1',Rondennummer); //Speichere Wert der Globalen Var
  finally
    Ini.Free;
  end;
end;
 
Und zwischendrin arbeitest du halt damit.

Also wenn du mit 10000 Anfängst dann:

Code: Alles auswählen

 
// führe Operationen durch
// Erhöhe Rondennummer um 1
//...
// Speicher Wert von Rondennummer
 
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Speichern einer fortlaufenden Nummer

Beitrag von Lion »

Requion hat geschrieben: Also innerhalb der Schleife oder nach der Schleife speichern?
Ich würde es nach der Schleife speichern.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Speichern einer fortlaufenden Nummer

Beitrag von m.fuchs »

Requion hat geschrieben:Wie ist das wenn die Nummer dann in kürzester Zeit sehr oft hochgezählt wird?
Das kommt darauf an. Was passiert im schlimmsten Fall wenn eine Nummer doppelt benutzt wird? Wie wichtig ist die Geschwindigkeit einer Operation?

Solche und ähnliche Fragen muss man erst beantworten bevor man eine Speicherstrategie auswählt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten