Lazarus readln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Lazarus readln

Beitrag von benderboxer »

Hallo Zusammen!

Ich bin gerade dabei einen relativ großen Code zu entwickeln.
Meine Erfahrungen sind jetzt nicht so weit, aber ich versuche immer wieder neues.

Nun habe ich folgendes vor:
Ich habe eine Datei A und eine Datei B.
In Datei A befindet sich In Zeile 1 eine Zahl und in Zeile 2 Ebenfalls.
Das gleiche in Datei B.

Nun soll die Differenz der jeweiligen Zeilen ausgegeben werden.

Habe durch ein YT-Tutorial die Datei schon geöffnet und readln(); in eine while schleife.

Code: Alles auswählen

  while not eof(b_tf) do begin
  readln(b_tf, zeile);
  end;


Wie kann ich 2 Variablen definieren mit jeweils einer zeile?
also az1 und az2?

Warf
Beiträge: 1480
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Lazarus readln

Beitrag von Warf »

Am einfachsten geht das mit einer StringList:

Code: Alles auswählen

var
  sl: TStringList;
...
  sl := TStringList.Create;
  try
    sl.LoadFromFile('Filename');
    // auf sl zugreifen
    //sl[0] ist die erste zeile
    //sl[1] die zweite
    // etc. sl.Count ist die anzahl an zeilen
  finally
    sl.Free;
  end;

benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Re: Lazarus readln

Beitrag von benderboxer »

Muss ich die Prodezur offen lassen?

Oder kann ich folgendes tun:

Code: Alles auswählen

b_sl := TStringList.Create;
 
  try
     b_sl.LoadFromFile(b_f_name);
 
     b_zahl1:= StrToInt(b_sl[1]);
     b_zahl2 := StrToInt(b_sl[2]);
  finally
     b_sl.Free;
  end;


Denn hierbei wird mir immer irgendein Fehler vorgeworfen.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 630
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus readln

Beitrag von fliegermichl »

benderboxer hat geschrieben:Muss ich die Prodezur offen lassen?

Oder kann ich folgendes tun:

Code: Alles auswählen

b_sl := TStringList.Create;
 
  try
     b_sl.LoadFromFile(b_f_name);
 
     b_zahl1:= StrToInt(b_sl[1]);
     b_zahl2 := StrToInt(b_sl[2]);
  finally
     b_sl.Free;
  end;


Denn hierbei wird mir immer irgendein Fehler vorgeworfen.


Wenn wirklich jeweils eine Zahl in der ersten und der zweiten Zeile der Datei steht und b_zahl1 als auch bzahl_2 als integer deklariert sind, sollte das so funktionieren.
Lass doch mal ein nachvollziehbares kleines und vollständiges Beispielprojekt sehen, so daß man es nachvollziehen kann.

benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Re: Lazarus readln

Beitrag von benderboxer »

Also es geht hierbei um den Strom- und Wasserverbrauch.

Ich möchte diese in monatlichen Abständen speichern.
In Text-Dateien.

Dazu folgendes:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var a_monat,
    b_monat,
    a_f_name,
    b_f_name: string;
 
    a_jahr,
    b_jahr,
    a_strom,
    a_wasser,
    wverbrauch,
    sverbrauch,
    b_strom,
    b_wasser: integer;
 
    a_tf,
    b_tf: textfile;
 
    b_sl: TStringList;
begin
//   ===== LGENEDE =====
//
//   a_    Aktuelle Werte
//   b_    Vorheriger Monat
//   c_    letztes Jahr [NOCH NICHT VERFÜGBAR]
//
//   ===== LEGENDE =====
//   Setzen und Umwandeln der Variablen
 
  a_monat := ComboBox1.Text;
  a_jahr := StrToInt(Edit1.Text);
  a_strom := StrToInt(Edit2.Text);
  a_wasser := StrToInt(Edit3.Text);
 
//   Vorherigen Monat analysieren
  b_jahr := a_jahr;
  if a_monat = 'Januar' then b_monat := 'Dezember';
  if a_monat = 'Januar' then b_jahr := a_jahr - 1;
  if a_monat = 'Februar' then b_monat := 'Januar';
  if a_monat = 'März' then b_monat := 'Februar';
  if a_monat = 'April' then b_monat := 'März';
  if a_monat = 'Mai' then b_monat := 'April';
  if a_monat = 'Juni' then b_monat := 'Mai';
  if a_monat = 'Juli' then b_monat := 'Juni';
  if a_monat = 'August' then b_monat := 'Juli';
  if a_monat = 'September' then b_monat := 'August';
  if a_monat = 'Oktober' then b_monat := 'September';
  if a_monat = 'November' then b_monat := 'Oktober';
  if a_monat = 'Dezember' then b_monat := 'November';
 
 
//   Ältere Datei auslesen
 
 b_f_name := 'D:\form-data\' + IntToStr(b_jahr) + ' - ' + b_monat + '.txt';
 '
//NUR ZUR FORMATIERUNG HIER IM FORUM - - - KEINE AHNUNG WARUM :D
  b_sl := TStringList.Create;
 
  try
     b_sl.LoadFromFile(b_f_name);
 
     b_strom := StrToInt(b_sl[1]);
     b_wasser := StrToInt(b_sl[2]);
  finally
     b_sl.Free;
  end;
 
 
// Datei erstellen
  a_f_name := 'D:\form-data\' + IntToStr(a_jahr) + ' - ' + a_monat + '.txt';
 '
//NUR ZUR FORMATIERUNG HIER IM FORUM - - - KEINE AHNUNG WARUM :D
  assignfile(a_tf,a_f_name);
  rewrite(a_tf);
 
  writeln(a_tf, a_strom);
  writeln(a_tf, a_wasser);
 
  closefile(a_tf);
 
  showmessage('Datei erfolgreich erstellt!');
 
//Formular 2
 Form2.Show;
 Form2.Label1.Caption := 'Verbrauch für ' + a_monat;
 
 sverbrauch := a_strom - b_strom;
 wverbrauch := a_wasser - b_wasser;
 
 Form2.Edit1.Text := IntToStr(sverbrauch);
 Form2.Edit2.Text := IntToStr(wverbrauch);
 
end;


Mir ist klar, dass es bestimmt einfachere Methoden gibt, aber ich möchte nur das eine Problem behoben haben.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 630
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus readln

Beitrag von fliegermichl »

b_strom := StrToInt(b_sl[1]);
b_wasser := StrToInt(b_sl[2]);


Die Indizes der Stringlisten sind Null basiert. Deswegen sollte es so aussehen:

Code: Alles auswählen

 
     b_strom := StrToInt(b_sl[0]);
     b_wasser := StrToInt(b_sl[1]);
 


Ausserdem schlägt das fehl, wenn die Liste weniger als zwei Einträge enthält also vorher mit

Code: Alles auswählen

 
if b_sl.count >= 2 then
begin
     b_strom := StrToInt(b_sl[0]);
     b_wasser := StrToInt(b_sl[1]);
end else
 ShowMessage('Weniger als zwei Werte verfügbar!');
 

prüfen.

In meiner ersten Antwort hatte ich das mit den Indizes übersehen. Das kann also nicht mit dem Index 1 und 2 funktionieren.

benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Re: Lazarus readln

Beitrag von benderboxer »

Oh Gott... Dankeschön.
Ich "programmiere" sonst eher mit PHP und dort ist es ja genauso... Hätte ja auch selbe drauf kommen können.

Aber jetzt funktioniert alles einwandfrei!

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 630
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus readln

Beitrag von fliegermichl »

Gerne. Für das ist doch das Forum da. Ich seh manchesmal auch den Wald vor lauter Bäumen nicht, obwohl ich schon seit 30 Jahren am programmieren bin.

Heute hab ich mal was ganz anderes gemacht. Zylinderkopfdichtung am Auto meiner Frau wechseln :-)

reiter
Beiträge: 205
Registriert: Sa 18. Nov 2017, 16:58

Re: Lazarus readln

Beitrag von reiter »

@benderboxer hab dir ne PN gesendet..
Ist auch frei definierbar.. muss nicht Strom , Gas, Wasser sein.. kann auch Spritverbrauch sein oder oder oder
Zuletzt geändert von reiter am Sa 29. Feb 2020, 23:23, insgesamt 5-mal geändert.

Winni
Beiträge: 356
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Lazarus readln

Beitrag von Winni »

Hoffentlich keine obenliegende Nockenwelle .....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4228
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Lazarus readln

Beitrag von af0815 »

Winni hat geschrieben:Hoffentlich keine obenliegende Nockenwelle .....

E-Mobil .... SCNR
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 630
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus readln

Beitrag von fliegermichl »

Winni hat geschrieben:Hoffentlich keine obenliegende Nockenwelle .....


Doch obenliegende Nockenwelle. Macht die Sache doch wesentlich einfacher.

Antworten