[gelöst]EconvertError invalid integer
[gelöst]EconvertError invalid integer
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: 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: Die Variablendefinition (für meine Fehlersuche), 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: 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
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: 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: Die Variablendefinition (für meine Fehlersuche), 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: 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 )
Re: EconvertError invalid integer
Hallo,
ich bin mittlerweile mit meiner Fehleranalyse einen kleinen Schritt weiter gekommen:
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
ich bin mittlerweile mit meiner Fehleranalyse einen kleinen Schritt weiter gekommen:
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 )
-
- 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
Was zeigt length(s1)?
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: EconvertError invalid integer
gibt mal
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
Code: Alles auswählen
ShowMessage('*'+ListBx.Items[0]+'*');
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: EconvertError invalid integer
Danke, dass ihr Euch Gedanken macht.
Es bleibt mysteriös:
Der Code: Die Sternchen kommen richtig. Es steht wirklich nur die "30" in der Variablen "Listbx.Items[0]" Trotzdem die Fehlermeldung ????
Es bleibt mysteriös:
Der Code: Die Sternchen kommen richtig. Es steht wirklich nur die "30" in der Variablen "Listbx.Items[0]" Trotzdem die Fehlermeldung ????

"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )
-
- 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
Was zeigt length(s1)?
Re: EconvertError invalid integer
Hallo "mse",
der Code: das Ergebnis: Die Fehlermeldung bleibt identisch wie schon gezeigt. Schon recht interessant, dass der String "30" ein Länge von 5 aufweist.
Danke für Deine beharrliche Nachfrage!
Woher kommt das?
Aliobaba
der Code: das Ergebnis: Die Fehlermeldung bleibt identisch wie schon gezeigt. Schon recht interessant, dass der String "30" ein Länge von 5 aufweist.

Danke für Deine beharrliche Nachfrage!
Woher kommt das?


Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )
-
- 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
Mach mal
Code: Alles auswählen
var
i1: int32;
[...]
writeln('------');
for i1:= 1 to length(s1) do begin
writeln(ord(s1[i1]));
end;
writeln('------');
Vielleicht kommt dir eine Idee wenn du die Werte siehst.Woher kommt das?![]()
![]()
Re: EconvertError invalid integer
Danke!
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?
(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 )
- 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: EconvertError invalid integer
<Ironie>Klasse, schön dass du das Detail mit dem Speichern jetzt schon schreibst. </Ironie>Aliobaba hat geschrieben:Die Variablen sind in einer ListBox gespeichert. Und werden von dieser auf die Festplatte geschrieben bzw. von da wieder eingelesen.
Weil du die Daten auf die Fetsplatte schreibst und dann wieder ausliest. Das ist eine BOM.Aliobaba hat geschrieben:Warum kommen die plötzlich da in die Variable rein?
Kommen die Werte unter Linux aus der selben Datei?Aliobaba hat geschrieben:Und warum stört dies das "Linux-Kompilat" nicht, das "Windows-Kompilat" aber schon?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: EconvertError invalid integer
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?
Re: EconvertError invalid integer
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
Geschrieben habe ich das File aber stets mit "Lazarus-eigenen Mitteln":
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
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

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);
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 )
Re: EconvertError invalid integer
Das wird's sein...Aliobaba hat geschrieben:Geschrieben habe ich das File aber stets mit "Lazarus-eigenen Mitteln":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.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);
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;
Re: EconvertError invalid integer
Klasse!!!! Und Danke!!!!!
... und schon besteht der String "30" nur noch aus 2 Zeichen - und alles funktioniert!!
Ich habe eine Menge gelernt!!
Vielen, vielen Dank !!
Aliobaba



... und schon besteht der String "30" nur noch aus 2 Zeichen - und alles funktioniert!!
Ich habe eine Menge gelernt!!
Vielen, vielen Dank !!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )