[gelöst]EconvertError invalid integer

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

[gelöst]EconvertError invalid integer

Beitrag von Aliobaba »

Hallo,
ich stehe momentan völlig hilflos meinen Programmierhobby gegenüber und weiß absolut keinen Rat mehr. Ich hoffe, es kann mir hier jemand helfen.

Ich habe ein Programm, das ich mit meinem Linux-Rechner schreibe und das ich unter "VMWare" gleichzeitig für Windows kompiliere. Jahrelang ging das relativ gut – und nun tritt plötzlich ein Fehler auf, den ich mir absolut nicht erklären kann, zumal der identische Programmcode unter Linux problemlos läuft, unter Windows aber ein Fehler auftritt:

Der Code-Abschnitt, bei dem der Fehler passiert:
Bild7.png
Die Zeilen ab 1618 sind der ursprüngliche Code, bei dem die Fehler auftreten; die Zeilen ab 1597 sind die Folge meiner hilflosen Sucherei.

Die Fehlermeldung:
Bild4.png

Die Variablendefinition (für meine Fehlersuche),
Bild6.png
Bild6.png (1.88 KiB) 2914 mal betrachtet

In der Listbox sind bei Item[0] die Zahl 30, bei Item[1] die Zahl 100 und bei Item[2] die Zahl 200, jeweils als String gespeichert.
Der Showmessage Befehl zeigt den korrekten Inhalt der entsprechenden Variablen:
Bild1.png
Bild1.png (3.92 KiB) 2914 mal betrachtet
Der "StrtoInt" Befehl liefert nun die genannte Fehlermeldung, was ich aber absolut nicht verstehen kann, denn "30" ist doch ein String-Ausdruck, der jedenfalls problemlos in eine Integer-Variable zu überführen sein sollte.
Und was weiter seltsam ist:
1. Unter Linux klappt dies alles, unter Windows nicht
2. Bis vor kurzer Zeit klappte es ebenfalls unter Windows, jetzt plötzlich nicht mehr.

Jemand eine Idee, warum so ein Phänomen auftreten kann?? Wo liegt mein Fehler?

Aliobaba
Zuletzt geändert von Aliobaba am Do 12. Apr 2018, 16:56, insgesamt 1-mal geändert.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Hallo,

ich bin mittlerweile mit meiner Fehleranalyse einen kleinen Schritt weiter gekommen:

Bild_010.png
Bild_010.png (4.04 KiB) 2908 mal betrachtet
Wenn ich der Stringvariable "sl" direkt durch die obige geänderte Programmzeile die Zahl 30 übergebe, dann funktioniert mein Programm wieder wie gewohnt.
Für mich konzentriert sich daher das Problem auf die Frage:
Warum ist die Stringvariable "Listbx.Items[0]" , die ja auch mit "30" gefüllt ist, wie mir "ShowMessage" und auch die Fehlermeldung zeigt, ein "anderes" "30" als die "30", die ich direkt per Programm an die Variable "sl" übergebe??

Any ideas?
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: EconvertError invalid integer

Beitrag von mse »

Was zeigt length(s1)?

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: EconvertError invalid integer

Beitrag von siro »

gibt mal

Code: Alles auswählen

  ShowMessage('*'+ListBx.Items[0]+'*'); 

aus,
evtl hängt da hinten oder vorn ein Space dran, dann kommt nämlich der Konvertierungsfehler, zumindest bei Windows.
Die Sternchen begrenzen jetzt den String, da sollte also *30* angezeigt werden.

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Danke, dass ihr Euch Gedanken macht.

Es bleibt mysteriös:
Der Code:
Bild_011.png
Die Sternchen kommen richtig. Es steht wirklich nur die "30" in der Variablen "Listbx.Items[0]"
Bild_012.png
Bild_012.png (3.75 KiB) 2893 mal betrachtet
Bild_013.png
Bild_013.png (9.13 KiB) 2893 mal betrachtet
Trotzdem die Fehlermeldung ???? :(
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: EconvertError invalid integer

Beitrag von mse »

Was zeigt length(s1)?

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Hallo "mse",

der Code:
Bild_022.png

das Ergebnis:
Bild_021.png
Bild_021.png (3.86 KiB) 2878 mal betrachtet

Die Fehlermeldung bleibt identisch wie schon gezeigt. Schon recht interessant, dass der String "30" ein Länge von 5 aufweist. :shock:
Danke für Deine beharrliche Nachfrage!
Woher kommt das? :cry: :roll:

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: EconvertError invalid integer

Beitrag von mse »

Mach mal

Code: Alles auswählen

 
var
 i1: int32;
[...]
 writeln('------');
 for i1:= 1 to length(s1) do begin
  writeln(ord(s1[i1]));
 end;
 writeln('------');
 

Woher kommt das? :cry: :roll:

Vielleicht kommt dir eine Idee wenn du die Werte siehst.

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Danke!
Bild_023.png
Bild_023.png (4.55 KiB) 2876 mal betrachtet
(Habe Deinen Code geringfügig angepasst, damit er bei mir auf dem Bildschirm erscheint.
Diese Idee hatte ich schon; da stecken noch Steuerzeichen(?), jedenfalls in Textdarstellung nicht sichtbare Zeichen drin.
(239,187,191,51,48) Die letzten beiden entsprechen der "30".

Trotzdem!
Warum kommen die plötzlich da in die Variable rein?
Die Variablen sind in einer ListBox gespeichert. Und werden von dieser auf die Festplatte geschrieben bzw. von da wieder eingelesen.
Und warum stört dies das "Linux-Kompilat" nicht, das "Windows-Kompilat" aber schon?
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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: EconvertError invalid integer

Beitrag von m.fuchs »

Aliobaba hat geschrieben:Die Variablen sind in einer ListBox gespeichert. Und werden von dieser auf die Festplatte geschrieben bzw. von da wieder eingelesen.

<Ironie>Klasse, schön dass du das Detail mit dem Speichern jetzt schon schreibst. </Ironie>

Aliobaba hat geschrieben:Warum kommen die plötzlich da in die Variable rein?

Weil du die Daten auf die Fetsplatte schreibst und dann wieder ausliest. Das ist eine BOM.

Aliobaba hat geschrieben:Und warum stört dies das "Linux-Kompilat" nicht, das "Windows-Kompilat" aber schon?

Kommen die Werte unter Linux aus der selben Datei?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: EconvertError invalid integer

Beitrag von wp_xyz »

Ja, der Teilstring #239#187#191 = #$EF#$BB#$FB ist der BOM (Byte order marker) für UTF8. Aber ich war immer der Meinung dass Lazarus keinen BOM schreibt. Wie hast du denn die Listbox-Strings auf die Platte geschrieben?

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Danke für die Antworten!
Vielleicht haltet ihr mir zugute, dass ich meine Frage in den Bereich "Einsteigerfragen" geschrieben habe.
Von "BOM" habe ich jedenfalls noch nie etwas gehört. Aber das erklärt jetzt vielleicht auch, warum nur der erste Eintrag der Liste von dem Fehler betroffen war :idea:

Geschrieben habe ich das File aber stets mit "Lazarus-eigenen Mitteln":

Code: Alles auswählen

Form1.ListBx.Items.LoadFromFile(Form_DB_wechseln.Ed_Pfad_zu_InitTxt.Text);
Form1.ListBx.Items.SavetoFile(Form_DB_wechseln.Ed_Pfad_zu_InitTxt.Text);
 

Aber es könnte durchaus sein, dass ich das File mal mit einem Explorer (Dolphin->Editor) geöffnet, verändert und wieder zurück geschrieben habe.
Die Werte unter Linux und unter Windows kommen (manchmal) aus derselben Datei.

Vielen Dank jetzt aber schon mal für die geduldigen Antworten. Wieder was gelernt!!

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: EconvertError invalid integer

Beitrag von wp_xyz »

Aliobaba hat geschrieben:Geschrieben habe ich das File aber stets mit "Lazarus-eigenen Mitteln":

Code: Alles auswählen

Form1.ListBx.Items.LoadFromFile(Form_DB_wechseln.Ed_Pfad_zu_InitTxt.Text);
Form1.ListBx.Items.SavetoFile(Form_DB_wechseln.Ed_Pfad_zu_InitTxt.Text);
 

Aber es könnte durchaus sein, dass ich das File mal mit einem Explorer (Dolphin->Editor) geöffnet, verändert und wieder zurück geschrieben habe.

Das wird's sein...

Wenn wie hier die Möglichkeit besteht, dass eine Datei verschiedene Kodierungen haben kann, solltest du beim Einlesen Routinen der Unit lConvEncoding verwenden:

Code: Alles auswählen

ues
  LConvEncoding;
var
  L: TStrings;
...
  L := TStringList.Create;
  try
    L.LoadFromFile(Form_DB_wechseln.Ed_Pfad_zu_InitTxt.Text);
    s := L.Text;
    s := ConvertEncoding(s, GuessEncoding(s), encodingUTF8);
    ListBx.Items.Text := s;   
    //Form1.ListBx.Items.Text := s;   
    // ACHTUNG: Wenn diese Routine innerhalb einer Methode von TForm1 aufgerufen wird, sollte hier Form1 nicht stehen !!!
  finally
    L.Free;
  end;

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: EconvertError invalid integer

Beitrag von Aliobaba »

Klasse!!!! Und Danke!!!!! :) :) :)

Bild_031.png

... und schon besteht der String "30" nur noch aus 2 Zeichen - und alles funktioniert!!

Bild_030.png
Bild_030.png (3.88 KiB) 2858 mal betrachtet

Ich habe eine Menge gelernt!!
Vielen, vielen Dank !!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten