AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exception bei TStream.CopyFrom()

Ein Thema von wicht · begonnen am 21. Jan 2008 · letzter Beitrag vom 21. Jan 2008
Antwort Antwort
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

Exception bei TStream.CopyFrom()

  Alt 21. Jan 2008, 18:54
Guten Abend Forum ...

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 ...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Exception bei TStream.CopyFrom()

  Alt 21. Jan 2008, 19:04
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;
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#3

Re: Exception bei TStream.CopyFrom()

  Alt 21. Jan 2008, 19:15
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!
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#4

Re: Exception bei TStream.CopyFrom()

  Alt 21. Jan 2008, 21:19
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#5

Re: Exception bei TStream.CopyFrom()

  Alt 21. Jan 2008, 21:48
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....
Danke trotzdem für die Hilfe
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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