![]() |
Exception bei TStream.CopyFrom()
Guten Abend Forum :P ...
Ich sitze jetzt schon ziemlich lange an einer kleinen Funktion, die mich zur Weißglut treibt.. Hätte ich nicht eine kleine Pause eingelegt, wäre meine Maus jetzt vermutlich durch die vielen Schläge auf den Tisch nicht mehr funktionsfähig.. und damit das auch später nicht passiert, belästige ich euch einfach mal... Zum Thema: Ich habe mir einen Nachfahren von TMemoryStream gebaut und diesem eine Prozedur RemoveRange verpasst.. das sieht so aus:
Delphi-Quellcode:
Ich möchte damit eben ab Position FromOffset Count Bytes wegmachen. Die Funktion habe ich mit einer kleinen Textdatei getestet, aus der ich einzelne Wörter herausschneide, hat super geklappt. Jetzt habe ich das Teil mal benutzt, um eine Datei zu bearbeiten und bei dem letzten CopyFrom gibt es immer eine Exception. OutStream ist natürlich vorhanden und OutStream.Size ist wohl irgendwas bei 20000 Bytes... Warum klappt das nicht? Das müsste doch einfach nur gehen...? Ich vermute mal, ich mache irgendeinen dummen Fehler.. Aber ich komme einfach nicht dahinter.... und jetzt werde ich eine kleine Pause einlegen um mich zu beruhigen.. und um auf Antworten zu warten, für die ich mich schon im Vorraus bedanke :-D ...
procedure TMeinStream.RemoveRange(FromOffset: Integer; Count: Integer);
var OutStream: TMemoryStream; begin OutStream := TMemoryStream.Create; try Position := 0; // An Anfang gehen if FromOffset = 0 then begin Seek(Count, soFromCurrent); // Bei FromOffset=0, einfach Count Bytes überspringen end else begin OutStream.CopyFrom(Self, FromOffset); // Den Anfang kopieren Seek(Count, soFromCurrent); // Count Bytes überspringen end; if Size - Position > 0 then OutStream.CopyFrom(Self, Size - Position); // Ende kopieren Clear; if OutStream.Size > 0 then CopyFrom(OutStream, 0); finally OutStream.Free; end; end; |
Re: Exception bei TStream.CopyFrom()
Welche Exception kommt überhaupt? Das wäre echt mal witzig zu erfahren...
Und nochwas: CopyFrom() bewegt den Dateizeiger mit. Also das Seek nach dem CopyFrom() wird dir vllt. das Genick brechen, da der Dateizeiger zu weit bewegt wurde... Was macht deine Methode Clear? Setzt sie Size und auch Position ordentlich zurück? Ein wenig gekürzt:
Delphi-Quellcode:
procedure TMeinStream.RemoveRange(FromOffset: Integer; Count: Integer);
var OutStream: TMemoryStream; begin OutStream := TMemoryStream.Create; try Position := 0; // An Anfang gehen if FromOffset > 0 then OutStream.CopyFrom(Self, FromOffset); // Den Anfang kopieren Seek(Count, soFromCurrent); // Count Bytes überspringen if Size - Position > 0 then OutStream.CopyFrom(Self, Size - Position); // Ende kopieren // im Normalfall so, deshalb hat kein TStream Nachfahre ein Clear (siehe z.B. TMemoryStream) Size := 0; if OutStream.Size > 0 then CopyFrom(OutStream, 0); finally OutStream.Free; end; end; |
Re: Exception bei TStream.CopyFrom()
Die Message der Exception ist "Stream-Schreibfehler".
Delphi-Quellcode:
Du meinst diese Stelle? Also, das müsste so passen.. Jetzt gerade Debuggt: Der Stream (Self) hat Size=26136, FromOffset=24576, Count ist 79.. und weil die Position ja vorher auf 0 gesetzt wird, passt das. Das habe ich schon vorhin bei jedem Versuch überprüft, gab keine Probleme mit den Größen.
OutStream.CopyFrom(self, FromOffset); // Den Anfang kopieren
self.Seek(Count, soFromCurrent); // Count Bytes überspringen Nachtrag: Ich hatte es vorhin auch mit Size:=0; Position:=0; probiert. Das Clear habe ich später erst gefunden. Werde jetzt eine Runde was spielen, und dann weitersehen.. Danke erstmal für die Antwort! |
Re: Exception bei TStream.CopyFrom()
Hallo nochmal.
Die selbe Prozedur habe ich nun ins Programm eingebaut, allerdings als normale Funktion und nicht als Memberfunktion der neuen Stream-Klasse. Wenn ich den Stream dahin als Parameter übergebe, dann klappt alles wie gewünscht! Ist da jemandem vielleicht irgendwie irgendwas bekannt? Danke :) |
Re: Exception bei TStream.CopyFrom()
So. Endlich. Das hat gedauert.....
Zur Aufklärung: Die Write-Methode habe ich überschrieben. Leider gebe ich kein Result zurück. Daher bekommt CopyFrom bei Write als Result einen anderen Wert als die Anzahl der zu schreibenden Bytes. Dann wird natürlich von einem Fehler beim Schreiben ausgegangen.... :idea: Danke trotzdem für die Hilfe :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz