![]() |
WideString -> TStream?
Hallo.
Ich möchte einen String im WideString-Format (bei ANSI 00h zwischen jedem Zeichen) in einen TFileStream speichern. Vorher wandle ich ein String in WideString um.
Delphi-Quellcode:
Das Ergebnis, das man im Hexeditor betrachten kann, ist jedoch:
public
tempstream: TStream; procedure Write(const Value; Size: Integer); begin mainform.tempstream.WriteBuffer(Value, Size); end; procedure WriteRaw(const Value: Binary); begin Write(Value[1], Length(Value)); end; var ws: widestring; begin ws := mainform.edt_vle1.text; WriteRaw(ws+#00#00); end; abcde[NULL][NULL] Wieso hat die String -> WideString konvertierung nicht funktioniert? Da mein Projekt OpenSource ist, möchte ich keine fremden, kostenpflichtigen Komponenten verwenden. Der Benutzer soll mit frei erhältlichen Komponenten oder den Borland-VCLs das Projekt öffnen können. Daher muss ich bis 2008 warten, bis Borland vollen Unicode-Support für die VCLs bietet. Solange wandle ich einfach die Strings in WideStrings um. Das Dateiformat will ich aber bereits Unicode-Ready machen. Gruß blackdrake |
Re: WideString -> TStream?
Was ist denn binary?
Edit: Derzeit kannst du einen Widestring z.B. so speichern:
Delphi-Quellcode:
Aber ob das noch Betsand hat (besonders das "length+1"), wenn mal völlig auf Unicode umgestellt wird.... :stupid:
var ws:widestring;
begin ws:=edit1.text; stream.Write(ws[1],sizeof(WideChar)*(length(ws)+1)); end; Edit2: Natürlich "ws:widestring" :mrgreen: Edit3: Ok, ich glaube hier sind noch tausend fehler drinn :drunken: |
Re: WideString -> TStream?
Hallo.
Danke für die Antwort
Delphi-Quellcode:
Funktioniert leider nicht. In der Ausgabedatei steht weiterhin abcd[NULL][NULL], als wäre es ein AnsiString. :roll:
public
tempstream: TStream; procedure Write(const Value; Size: Integer); begin mainform.tempstream.WriteBuffer(Value, Size); end; procedure WriteWideString(const Value: WideString); begin Write(Value[1], sizeof(Char)*(length(Value)+1)); end; var ws: widestring; begin ws := mainform.edt_vle1.text; WriteWideString(ws+#00#00); end; PS: Binary gibts übrigens bei DEC von Hagen Reddmann. Konnte ich jetzt bei dieser WideString lösung steichen. ` Edit: Fehler besteht sowohl bei Write() als auch bei WriteBuffer() von TStream. Gruß Daniel Marschall |
Re: WideString -> TStream?
Hinweis: Beachte das Zeichen Index 1 ungültig ist bei einer Stringlänge von 0!
|
Re: WideString -> TStream?
:oops: Sorry, ich hatte oben noch das sizeof(char) zu sizeof(widechar) geändert.
Wobei ich mich gerade frage, warum du einen ansistring gespeichert bekommst und (mit dem Fehler) nicht nur die erste Hälfte des widestrings :gruebel: |
Re: WideString -> TStream?
Hallo. sizeof(char) hab ich zu sizeof(widechar) gemacht und erhalte genau das selbe Ergebnis. Irgendwas ist hier komisch. Wieso funktioniert die String -> WideString umwandlung nicht? Funktioniert bei euch dieses Script?
|
Re: WideString -> TStream?
Zitat:
btw: @blackdrake. In meinem Memorystream landet genau das, was du willst. |
Re: WideString -> TStream?
Geht denn eine WideString Speicherung nicht auch mit FileStream?
|
Re: WideString -> TStream?
Liste der Anhänge anzeigen (Anzahl: 1)
Klappt bei mir genauso (ich habs nur erst mit Tmemorystream gemacht, weil ichs da einfacher überprüfen kann).
Code (in Anlehnung an deinen):
Delphi-Quellcode:
Ergebnis siehe Anhang.
type
TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } x:tfilestream; procedure write(const buffer;size:integer); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.write(const buffer;size:integer); begin x.Writebuffer(buffer,size); end; procedure TForm1.Button1Click(Sender: TObject); var ws:widestring; begin ws:=edit1.text; x:=tfilestream.Create('T:\test.txt',fmcreate); Write(ws[1],sizeof(wideChar)*(length(ws)+1)); x.free; end; end. |
Re: WideString -> TStream?
Hallo.
Danke für euere Hilfe. Seltsamerweiße liegt es daran, dass ich Write(...) in eine Prozedur ausgelagert habe. Sobald ich es in eine Funktion auslagere, schreibt er einen AnsiString in die Datei. Die Auslagerung ist aber nicht so wichtig. Jetzt muss ich nur noch abwarten bis Borland 2034 endlich Unicode-Kompatible VCLs fertigstellt, damit die Stelle im Dateiformat Sinn ergibt. Was ist jetzt eigentlich mit dem [1] und einem leeren String? Mein PC ist nicht in einer atomaren Explosion untergegangen, als ich die Editbox geleert und die Aktion ausgeführt habe. Gruß blackdrake |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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