Liebe Experten,
ich habe mit inhaltlich gleich aufgebauten Dateien zu tun, die sich aber in der Formatierung geringfügig unterscheiden, z.B. Punkt statt Komma als Dezimalzeichen. Da kommen auch noch Exoten hinzu. Deshalb soll das eigentliche Programm alles aus einem FilesStream lesen, der die Daten in einem einheitlichen Format enthält. Mit dem Laden oder Lesen kann ich dann alle Umformatierungen machen, ohne dass das eigentliche Programm angefasst werden muss.
Ich habe also TMyFilestream = CLASS(TFilestream) definiert und nehme in CREATE und READ die erforderlichen Umformatierung vor. Läuft seit 2009 gut.
Jetzt habe ich eine Datei, die am Ende eine Anzahl von Textzeilen enthält, jeweils mit #0D#0A abgeschlossen. Das ist genau das Format, wie TStringList.savetostream seinen Inhalt speichert und lädt. Und der Text wäre in einer Stringlist auch bestens zu bearbeiten. Leider führt Stringlist.loadfromstream zu einer AccessViolation. Klar, ich finde schnell einen Work-around, aber loadfromstream gibt es ja für viele Klassen, da wäre mir eine suabere Lösung schon lieb.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| FUNCTION tmyfilestream.Read(VAR Buffer; Count: longint): longint; TYPE t_byte_array = ARRAY[0..2000000000 - 4] OF byte; VAR i: integer; BEGIN IF count = 0 THEN BEGIN FOR i := 0 TO 20 DO t_byte_array(Buffer)[i] := ord('A') + i; t_byte_array(Buffer)[21] := 13; t_byte_array(Buffer)[22] := 10; END ELSE FOR i := 0 TO count - 1 DO t_byte_array(Buffer)[i] := i; END; [/code] |
Offensichtlich nutzt die TStrinList-Routine einen Speicher, auf den mein Programm nicht zugreifen darf.
Count = 0 scheint übrigens "bis Ende der Datei" zu bedeuten.
Hat jemand Hinweise?
Gruß GuaAck