![]() |
Windows, Stream und String hin her convert fehler
Hallo, habe ein kleines Umwandlungsproblem und finde einfach nicht meinen Fehler.... grrrr
Einen String in einen Stream zu verwandeln scheint gut zu klappen, die Rückumwandlung hingegen klappt nur manchmal korrekt, ich weiß nur nicht warum *heul* Hier meine Versuche: (alles kommentiert damit man weiß warum ich was an welcher stelle mache) Im Formular sind folgende Dinge existent: Eine Memo, Edit und Knopf Komponente.
Delphi-Quellcode:
// pump text in einen stream
// diese methode scheint gut zu arbeiten function TKlasse.StringToStream ( const InputString: String; var ResultStream: TMemoryStream ): Boolean; var i: Integer; begin // falls was schiefgeht, erstmal falsen Result := False; // wenn nix reinkommt, muss auch nix rauskommen if (Length(InputString) <= 0) = not False then Exit; // falls stream inexistent ist, einen erstellen, ansonsten auf null position stellen if (ResultStream = NIL) = not False then ResultStream := TMemoryStream.Create else ResultStream.Position := 0; try // stream beschreiben i := ResultStream.Write(InputString[1], Length(InputString)); finally // entweder haben wir es geschafft, oder auch nicht :-) if (i = Length(InputString)) = not false then Result := not False else Result := False end; end; // hol text aus einem stream // hier steckt irgendwo ein fehler den ich nicht finde oder meine vorgehensweise ist falsch function TKlasse.StreamToString ( const InputStream: TMemoryStream; var ResultString: String ): Boolean; var Buffer: PChar; // (ist ein PWideChar bei D2010) begin // falls was schiefgeht, erstmal falsen Result := False; // wenn stream inexistent ist oder leer ist, mach nichts if ((InputStream <> NIL) and (InputStream.Size > 0)) = not False then begin try // puffer speicher allozieren Buffer := StrAlloc(InputStream.Size +1); // stream position auf null setzen InputStream.Position := 0; // stream inhalt an puffer pointen InputStream.Read(Buffer^, InputStream.Size); // stringlänge anpassen SetLength(ResultString, SizeOf(Buffer)); // puffer in string kopieren ResultString := Copy(Buffer, 1, InputStream.Size); // test ausgabe bevor speicher bereinigt ist MemoBox.Lines.Add('Buffer: ' + Buffer); MemoBox.Lines.Add('Result: ' + ResultString); // puffer speicher freigeben StrDispose(Buffer); finally // entweder haben wir es geschafft, oder auch nicht :-) if (Length(ResultString) = InputStream.Size) = not false then Result := not False else Result := False end; end; end; // hier meine Test-Methode die beides auf einmal verwendet.... procedure TKlasse.KnopfClick(Sender: TObject); var tmp: TMemoryStream; s: String; begin MemoBox.Lines.Add('Converting "' + EditZeile.Text + '" to stream'); try if (StringToStream( EditZeile.Text, tmp ) = not False) = not False then if (StreamToString( tmp, s ) = not False) = not False then MemoBox.Lines.Add(s); finally tmp.Free; end; end; |
AW: Windows, Stream und String hin her convert fehler
Solch eine innovative Boolean-Behandlung habe ich noch nie gesehen :shock:. Davon abgesehen: lass Dir doch SizeOf(Buffer) einmal ausgeben.
|
AW: Windows, Stream und String hin her convert fehler
|
AW: Windows, Stream und String hin her convert fehler
Danke Schokohase, doku schaut gut aus, ich hoffe mein altes Delphi hat das auch verbaut.
@DeddyH, mir wurde hier oft genug gesagt das man nicht auf ein true testen solle sondern immer auf false, hab ich da was falsch verstanden? |
AW: Windows, Stream und String hin her convert fehler
Ja, hast Du falsch verstanden. Du sollst am besten gar nicht gegen true oder false prüfen.
Delphi-Quellcode:
// Schlecht
if Dingens = true
Delphi-Quellcode:
// Besser
if Dingens
Delphi-Quellcode:
// Schlecht
if Dingens = false
Delphi-Quellcode:
// Besser
if not Dingens |
AW: Windows, Stream und String hin her convert fehler
Zitat:
TStringStream schau ich mir auch mal an, falls ich mit dem TStreamReader/Writer nicht zurecht kommen sollte (sofern bei D2010 vorhanden). Dankeschön @Frühlingsrolle |
AW: Windows, Stream und String hin her convert fehler
Zitat:
2. Schon mal mit debuggen versucht? SCNR |
AW: Windows, Stream und String hin her convert fehler
Der Fehler liegt hier:
Delphi-Quellcode:
i := ResultStream.Write(InputString[1], Length(InputString));
Ein Char ist 2 Byte groß, daher ist ein String der Länge X = X * 2 (SizeOf(Char)) Bytes groß:
Delphi-Quellcode:
Deine Abfragen auf die Stream/String längen musst du dann natürlich auch anpassen:
i := ResultStream.Write(InputString[1], Length(InputString) * SizeOf(Char));
Delphi-Quellcode:
if (i = Length(InputString)) = not false then
und
Delphi-Quellcode:
if (Length(ResultString) = InputStream.Size) = not false then
|
AW: Windows, Stream und String hin her convert fehler
Nach vielem hin und her probieren, streamreader/writer ist doch nicht das was ich benötige, der scheint mit dateien was am hut zu haben (habe mich aber nicht tiefer damit beschäftigt, geb ich zu!). ich arbeite hier nicht mit dateien sondern nur mit einem internen stream der dann übers netzwerk versendet werden soll.
(anfangs nur strings, später, wenn ich verstanden habe wie das ganze funktioniert auch mit binären krams) Zitat:
Der Fehler ist, das wenn ich den Test starte, mit einem langen string "Die ist ein Beispiel String der Konvertiert werden soll" starte, klappt es. Ich verändere dann das Edit Feld auf, sagen wir mal "1", konvertierung klappt nicht, je mehr Zeichen ich dann ranhänge, umso interessantere ergebnisse werden geliefert (aus "123" wird mal "1" oder "12"....) Zitat:
|
AW: Windows, Stream und String hin her convert fehler
Du weißt, dass eine Datei ein Stream ist (ein
Delphi-Quellcode:
)? Insofern kann man einen
TFileStream
Delphi-Quellcode:
auch auf einen Datei loslassen, aber eben auch auf jeden anderen Stream, solange es eben ein Stream ist.
TStreamReader
Sonst hätten die die Klasse ja auch nicht als StreamReader bezeichnet, sondern als FileReader, wenn das Teil nur mit Dateien umgehen könnte. Und es kommt bei Text in einem Stream IMMER auf die Kodierung (Encoding) an. Wenn das nicht passt, dann kommt nur Murks beim Lesen raus. Und genau da hilft auf der
Delphi-Quellcode:
/
TStreamReader
Delphi-Quellcode:
.
TStreamWriter
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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 by Thomas Breitkreuz