Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Exception bei TStream.CopyFrom() (https://www.delphipraxis.net/107068-exception-bei-tstream-copyfrom.html)

wicht 21. Jan 2008 18:54


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:
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;
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 ...

Muetze1 21. Jan 2008 19:04

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;

wicht 21. Jan 2008 19:15

Re: Exception bei TStream.CopyFrom()
 
Die Message der Exception ist "Stream-Schreibfehler".

Delphi-Quellcode:
      OutStream.CopyFrom(self, FromOffset); // Den Anfang kopieren
      self.Seek(Count, soFromCurrent); // Count Bytes überspringen
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.

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!

wicht 21. Jan 2008 21:19

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 :)

wicht 21. Jan 2008 21:48

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 00:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz