Delphi-Quelltext
1: 2:
| Stream.Seek(0,soFromBeginning); |
Jeder Stream hat einen "Zeiger" auf die aktuelle Position innerhalb der Daten:
TStream.Position. Nach dem Schreiben in einen Stream beinhaltet
TStream.Position meist den Wert von
TStream.Size: Der "Zeiger" zeigt also auf das Ende des Streams.
Wird aus einem Stream gelesen, verwenden viele Komponenten den Wert aus
TStream.Position und fangen an, ab dieser Position ihre Daten zu lesen.
Im Falle von
TStringList.LoadFromStream würden also die "letzten" null Bytes geladen. Das wäre nicht so gut... Deshalb muß die Eigenschaft
TStream.Position auf Null - also den Anfang des Streams - gesetzt werden. Dazu bietet sich die Methode
TStream.Seek(Offset,Startpunkt) an. Bei
TStream.Seek(0,soFromBeginning) wird also das erste Byte vom Anfang des Streams aus "angesteuert". Den selben Effekt hättest Du natürlich auch mit
TStream.Position:=0.
Delphi-Quelltext
1: 2:
| OldDecimalSeparator := DecimalSeparator; DecimalSeparator:='.'; |
In Delphi und im englischsprachigen Raum ist das Dezimal-Trennzeichen kein Komma, sondern ein Punkt. Wird jetzt ein String in eine Fließkommazahl umgewandelt, wird das im jeweiligen PC eingestellt Gebietsschema genutzt: Bei einer Fließkommazahl wird das also in der Regel ein Komma sein. Damit kann der String nicht richtig umgewandelt werden und es kommt bei
StrToFloat() zu einer Exception.
Um das Ganze trotzdem hinzubekommen, kann über die globale Variable
DecimalSeparator bzw. in neueren Delphi-Versionen
FormatSettings.DecimalSeparator das Zeichen ausgewählt werden, das als Dezimal-Trennzeichen benutzt werden soll. Sehr zu empfehlen ist natürlich, den alten Wert zwischenzuspeichern und anschließend wieder herzustellen.
Delphi-Quelltext
1: 2:
| Version:=StrToFloatDef(Ini.Values['VersionCL'],0); |
StrToFloatDef erzeugt keine Exception, falls die Umwandlung eines Strings in eine Fließkommazahl nicht funktioniert, sondern nimmt im Fehlerfall einfach den übergebenen Wert. Ich kann allerdings nicht genau sagen, ab welcher Delphi-Version diese Funktion existiert.
TMemoryStream ist ein Stream, der nur im Speicher existiert,
TFileStream arbeitet mit einer Datei auf der Festplatte.
Mit
TIdHTTP.Get(URL,Stream) werden die empfangenen Daten im Stream gespeichert (in meinem Beispiel mit TMemoryStream nur im Hauptspeicher) und anschließend mit
TMemoryStream.SaveToFile in eine Datei geschrieben. Das könnte man natürlich auch mit
TFileStream realisieren. Ich wollte nur den Stream für die Versionsinformation für die eigentliche Datei wiederverwenden.