Sonderzeichen im AnsiString
-
Hi, gibt es besondere Regeln für die Behandlung von Sonderzeichen in AnsiStrings? Problematik: Habe folgenden AnsiString aus einer Datei geladen
1;10001;Kuhnsoft;Herr;Walter;Kuhn;Meisenweg 9;31274;Ockersdorf;05137 123485;05137 123490;0175 23255238;www.kuhnsoft.de;kuhni@soft.de;achwas;egal;Die Einträge stellen Spalten dar und sind durch ein Semikolon getrennt. Nun gehe ich ran und trenne die einzelnen Spalten voneinander, damit ich auch einzelne Werte in ein StringGrid eintragen kann.
AnsiString temp="", tempsave=""; int spalte, x; if(spalte==0){ for(x=1;x<=temp.Length();x++){ if(temp.IsDelimiter(";",1)){ spalte+=1; temp.Delete(1,1); x=temp.Length()+1; } else{ tempsave.Insert(temp[1],x); temp.Delete(1,1); } } myStringListKundenID->Add(tempsave); tempsave=""; } if(spalte==1){ for(x=1;x<=temp.Length();x++){ if(temp.IsDelimiter(";",1)){ spalte+=1; temp.Delete(1,1); x=temp.Length()+1; } else{ tempsave.Insert(temp[1],x); temp.Delete(1,1); } } myStringListKundennummer->Add(tempsave); tempsave=""; } ..und so weiterBeim Starten des Programms kommt der EStringListFehler -Der Index der Liste überschreitet das Maximum(0) - Anschliessend verteile ich die Felder aufs StringGrid was keinerlei Probleme macht. Das Debuggen zeigt mir das der Builder meine for-Schleife ab Spalte 13 !!! zu früh verlässt, so dass ich sie zwar noch vollständig und richtig im StringGrid angezeigt bekomme, aber von Spalte 14 und 15 jede Spur fehlt, weil der Builder nach der Emailaddi gar nicht mehr auf das Semikolon prüft, da x schon größer temp.Length() ist
Nun ist in Spalte 13 im AnsiString das @ Zeichen und das brachte mich auf die Idee das es damit evtl. etwas auf sich haben könnte?! Wenn ich es weglasse, wird komischerweise Spalte 14 auch angezeigt, von 15 fehlt jedoch immer noch jede Spur
Irgendwo ist der Wurm drin.
-
du kannst mal versuchen mit StringReplace alle ";" durch "\r\n" zu ersetzen und dann kanst du die Zeile einfach dem StringGrid order einer StringList zuweisen:
StringGrid1->Rows[index]->Text = DeinText;das mit dem StringReplace geht allerdings erst ab BCB6
das @ macht da eigentlich keine Probleme
-
Wieso eigentlich nicht gleich die geerbte Eigenschaft DelimitedText verwenden?
-
Danke für die Antworten. Werde mich gleich nach dem Kaffee nochmal an die Funktion machen. Konnte den Fehler bisher nicht reproduzieren und einfach umschreiben ist nicht meine Art. Es muss eine vernünftige Erklärung für dieses Verhalten geben. Achso arbeite mit der 5er Pro.
-
Das wäre ja nicht einfach ein Umschreiben sondern würde deinen doch recht recht umständlichen Code deutlich vereinfachen.
StringReplace gibt's übrigens auch im BCB5, DelimitedText hingegen erst ab BCB6. Statt letzterem kann ggf. TStringList::CommaText verwendet werden, das setzt aber Kommas als Trennzeichen voraus.
-
Überzeugt! StringReplace mit den Umbrüchen ist wirklich elegant. DANKE
